私はPythonで中央値の中央値アルゴリズムのこの実装を作成しましたが、正しい結果を出力していないようです。また、線形の複雑さも感じられません。どこで軌道に乗ったのでしょうか。
def select(L):
if len(L) < 10:
L.sort()
return L[int(len(L)/2)]
S = []
lIndex = 0
while lIndex+5 < len(L)-1:
S.append(L[lIndex:lIndex+5])
lIndex += 5
S.append(L[lIndex:])
Meds = []
for subList in S:
print(subList)
Meds.append(select(subList))
L2 = select(Meds)
L1 = L3 = []
for i in L:
if i < L2:
L1.append(i)
if i > L2:
L3.append(i)
if len(L) < len(L1):
return select(L1)
elif len(L) > len(L1) + 1:
return select(L3)
else:
return L2
この関数は次のように呼び出されます。
L = list(range(100))
shuffle(L)
print(select(L))
LE:ごめんなさい。GetMedは、リストを並べ替えてlen(list)の要素を返すだけの関数でした。そこで選択する必要がありました。今すぐ修正しましたが、それでも間違った出力が得られます。インデントに関しては、コードはエラーなしで機能し、何も問題はありません:-??
LE2:私は(現在のLに対して)50を期待しています、それは私に30から70までの出力を与えます、それ以上でもそれ以下でもありません(まだ)
LE3:どうもありがとうございました、それは今それが機能するトリックをしました。混乱していますが、この方法と、単純に配列を並べ替えて結果を出力する単純な方法とを比較しようとしています。さて、これまで読んだことから、selectメソッドの時間計算量はO(n) DeterministicSelectionであるはずです。おそらくPython開発者が行った最適化と競合することはできませんが、私が得たよりも近い結果を期待していました。たとえば、リストの範囲を10000000に変更すると、selectは84.10837116255952秒で結果を出力し、sortandreturnメソッドは18.92556029528825でそれを行います。このアルゴリズムを高速化するための良い方法は何ですか?