Merge_Sortアルゴリズムの作業をカウントする

イン

マージソートアルゴリズムを使用して、配列がどれだけ近くにソートされているかを数えたいと思います。マージソートを使用して配列を配置することはできますが、プロセス中に必要な反転の数を数え続けるのに問題があります。

たとえば、入力[9,4,8​​,3]の場合、出力[3,4,8,9]と4つの反転を取得します。反転の定義は次のとおりです。bがB、cがCで、b> cの場合、反転が必要です(B、Cの順序が重要です)。まず、1つの反転を個別に示す2つの部分([4,9]、1)と([3,8]、1)を取得します。次に、それらが再びマージされると、さらに2つの反転があります。4ではなく3を選択し、9ではなく8を選択します。

私の主な質問は、アルゴリズム自体とは関係がないかもしれません。それは、私の変数の1つを関数の関数ループ内で進化させ続ける方法についてです。(Merge_Sort関数内でMerge_Sort関数を使用しています)

def Merge_Sort(a):
    n = len(a)
    if n==1:
        if not 'total_rev' in vars():            
            total_rev = 0
        else:
            total_rev += rev_ind
    return a , total_rev
    else:
        m = math.floor(n/2)
        b , rev_ind_b = Merge_Sort(a[:m])
        if not 'total_rev' in vars():
            total_rev = 0
        else:
            total_rev += rev_ind_b
        c , rev_ind_c = Merge_Sort(a[m:])
        if not 'total_rev' in vars():
            total_rev = 0
        else:
            total_rev += rev_ind_c      
        a_sort , rev_ind = Merge(b,c)
        if not 'total_rev' in vars():
            total_rev = 0
            total_rev += rev_ind
        else :
            total_rev += rev_ind
        return a_sort , total_rev

def Merge(b,c):
    p = len(b)
    q = len(c)
    d = []
    reverse_ind = 0
    while len(b)!=0 or len(c)!=0 :
        if (len(b)*len(c) != 0) :
            b0 = b[0]
            c0 = c[0]
            if b0 <= c0 :
                d.append(b0)
                b.remove(b[0])
            else :
                reverse_ind += 1
                d.append(c0)
                c.remove(c[0])
        else :
            d.extend(b)
            b=[]
            d.extend(c)
            c=[]
    return d,reverse_ind

マージ機能はうまく機能します。唯一の質問は、変数「total_inv」の更新を希望どおりに維持できないことです。「total_inv」が定義されていないときはいつでも定義しようとしています。それが私のコードを乱雑にしたので、それが良い方法であるかどうかはわかりません。私もグローバル変数を使おうとしていますが、うまくいきません。ありがとうございました!

トリンコット

それよりも簡単です:

  • 最も深い再帰レベル(n==1)の場合、スワップの数として0を返します。ロジックは、リストのためのスワップの数を返すべきであるということです、それがあるとしてその再帰レベルで大きなリストがあるかもしれないものを考慮することなく、。したがってn==1、リストに1つの値がある場合、それは明らかにスワッピングを必要としません。
  • それ以外の場合は、再帰呼び出しから取得したカウントを合計するだけです。そうすれば、再帰ツリーをバブリングしてバックアップするときに増加します。

以下に適合したコードを示しMerge_Sortます。

def Merge_Sort(a):
    n = len(a)
    if n==1:
        return a, 0 # at deepest recursion always return 0 for the number of swaps
    else:
        m = n//2 # use integer division; you don't need `math.floor`
        b , rev_ind_b = Merge_Sort(a[:m])
        c , rev_ind_c = Merge_Sort(a[m:])
        a_sort , rev_ind = Merge(b,c)
        return a_sort , rev_ind_b + rev_ind_c + rev_ind # add the numbers

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

範囲アルゴリズム内の数値をカウントする(C ++)

分類Dev

リンクリスト内の発生をカウントするためのアルゴリズム

分類Dev

2つのイベント間に存在するobsの数をカウントするアルゴリズム

分類Dev

整数グリッドの数をカウントするための効率的なアルゴリズム

分類Dev

行列内の各要素の接続された要素の数をカウントするアルゴリズム

分類Dev

行列内の各要素の接続された要素の数をカウントするアルゴリズム

分類Dev

間隔内の数値の頻度をカウントするための効率的なアルゴリズム

分類Dev

AVLツリー内のノード数をカウントするアルゴリズム

分類Dev

マージソートアルゴリズムのスワップ/比較数をカウントする

分類Dev

カウントダウンスタイルの数学数パズルを計算するアルゴリズムを設計する方法

分類Dev

並列アルゴリズム分析における作業、スパン、時間の違いは何ですか?

分類Dev

Javaでアナグラムのオカレンスをカウントするためのアルゴリズムを書く方法は?

分類Dev

新しいアイテムを挿入してカテゴリアイテムをカウントするアルゴリズム

分類Dev

merge_sortアルゴリズムでは、パラメーターがdouble型リストの場合は機能しますが、int型リストの場合は機能しません。

分類Dev

ソートアルゴリズムのカウントにおける要素のカウントの減少

分類Dev

アカウントに公平に仕事を分配する-分配アルゴリズム

分類Dev

ビンカウント数のこのo(mn)アルゴリズムを改善できますか?

分類Dev

カレンダーイベントの視覚化。イベントを最大幅でレイアウトするアルゴリズム

分類Dev

単語リスト内の文字のカウントマトリックスアルゴリズムを最適化する

分類Dev

2つのソートされたリストを比較し、同じ要素の数をカウントするPythonアルゴリズム

分類Dev

配列内のn個の異なる2次元点をカウントするためのアルゴリズムを設計するには

分類Dev

大きなカーディナリティをカウントするためのLogLogおよびHyperLogLogアルゴリズム

分類Dev

クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

分類Dev

アンカー分割にロイドのアルゴリズムを使用する

分類Dev

ローカルアライメントを解決するためのアルゴリズム

分類Dev

カウントダウンアルゴリズムの実行方法

分類Dev

デカルト積を使用するアルゴリズムの改善

分類Dev

デカルト積を取得するためのアルゴリズム

分類Dev

ストックアルゴリズムをカットするためのScilab

Related 関連記事

  1. 1

    範囲アルゴリズム内の数値をカウントする(C ++)

  2. 2

    リンクリスト内の発生をカウントするためのアルゴリズム

  3. 3

    2つのイベント間に存在するobsの数をカウントするアルゴリズム

  4. 4

    整数グリッドの数をカウントするための効率的なアルゴリズム

  5. 5

    行列内の各要素の接続された要素の数をカウントするアルゴリズム

  6. 6

    行列内の各要素の接続された要素の数をカウントするアルゴリズム

  7. 7

    間隔内の数値の頻度をカウントするための効率的なアルゴリズム

  8. 8

    AVLツリー内のノード数をカウントするアルゴリズム

  9. 9

    マージソートアルゴリズムのスワップ/比較数をカウントする

  10. 10

    カウントダウンスタイルの数学数パズルを計算するアルゴリズムを設計する方法

  11. 11

    並列アルゴリズム分析における作業、スパン、時間の違いは何ですか?

  12. 12

    Javaでアナグラムのオカレンスをカウントするためのアルゴリズムを書く方法は?

  13. 13

    新しいアイテムを挿入してカテゴリアイテムをカウントするアルゴリズム

  14. 14

    merge_sortアルゴリズムでは、パラメーターがdouble型リストの場合は機能しますが、int型リストの場合は機能しません。

  15. 15

    ソートアルゴリズムのカウントにおける要素のカウントの減少

  16. 16

    アカウントに公平に仕事を分配する-分配アルゴリズム

  17. 17

    ビンカウント数のこのo(mn)アルゴリズムを改善できますか?

  18. 18

    カレンダーイベントの視覚化。イベントを最大幅でレイアウトするアルゴリズム

  19. 19

    単語リスト内の文字のカウントマトリックスアルゴリズムを最適化する

  20. 20

    2つのソートされたリストを比較し、同じ要素の数をカウントするPythonアルゴリズム

  21. 21

    配列内のn個の異なる2次元点をカウントするためのアルゴリズムを設計するには

  22. 22

    大きなカーディナリティをカウントするためのLogLogおよびHyperLogLogアルゴリズム

  23. 23

    クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

  24. 24

    アンカー分割にロイドのアルゴリズムを使用する

  25. 25

    ローカルアライメントを解決するためのアルゴリズム

  26. 26

    カウントダウンアルゴリズムの実行方法

  27. 27

    デカルト積を使用するアルゴリズムの改善

  28. 28

    デカルト積を取得するためのアルゴリズム

  29. 29

    ストックアルゴリズムをカットするためのScilab

ホットタグ

アーカイブ