は、私が書いたコードは次のとおりです。上図の各再帰呼び出しのログ(n)があるよう分析マージソートの複雑
def merge(A, B): #merging two sorted lists
index_a = index_b = 0
result = []
while(index_a < len(A) and index_b < len(B)):
if(A[index_a] <= B[index_b]):
result += [A[index_a]]
index_a += 1
else:
result += [B[index_b]]
index_b += 1
if(index_a != len(A)):#adds all remaining elements
result += A[index_a:]
elif(index_b != len(B)):
result += B[index_b:]
return result
def merge_sort(L):
if(len(L) == 0 or len(L) == 1):
return L
else:
a = merge_sort(L[:len(L)/2])
b = merge_sort(L[len(L)/2:])
return merge(a , b)
は、だから私はmerge_sort機能の複雑さを理解することができます。私が少し混乱していたのは、マージ関数のステップ数、最初は2つの割り当てでしたが、その後は最悪の場合に取られるステップ数を取得する方法がわかりません。 AまたはBおよび後の追加。
本当にありがとうございます。ありがとうございました。
ああ、これは動作します。私はまたはで使用する条件を考えていました。ありがとう、私は以前のコードから複雑さを得ることができる方法はありますか? –
@PavanKumar最小反復回数は 'merge'に渡される*より小さい*リストの長さに等しいので、' merge_sort'は常に(ほとんど)等しいリスト長で 'merge'を呼び出すので、"最良の場合"は、最悪の場合よりも2倍の定数倍であり、big-Oには影響しません。 – Sneftel
私は理解していると思います。私は最初のリストを2番目のものより少ないすべての要素とマージして最良のケースのシナリオを描いていましたが、whileループにはk * n/2ステップ、最後には3ステップがあることを意味します。関係なく、ビッグオーは同じままです。これは正しいです? –