クラスで学んだばかりの rselect アルゴリズムを実装しようとしています。ただし、実装のどこが間違っているのかわかりません。これが私のコードです。*編集 * : David の回答で提供された情報を使用してみましたが、コードはまだ奇妙に動作します。改訂されたコードは次のとおりです。
def rselect(seq,length,i):# i is the i'th order statistic.
if len(seq)<=1:return seq
lo,pi,hi,loc_pi= random_partition(seq
if loc_pi==i:return pi
if loc_pi>i:return rselect(lo,loc_pi-1,i)
elif loc_pi<i:return rselect(hi,length-loc_pi,i-loc_pi)#
from random import choice
def random_partition(seq):
pi =choice(seq)
#print 'pi',pi
loc_pi=seq.index(pi)
print 'Location',loc_pi
lo=[x for x in seq if x<=pi]
hi=[x for x in seq if x>pi]
return lo,pi,hi,len(lo)+1 #--A
def test_rselect(seq,i):
print 'Sequence',seq
l=len(seq)
print 'Statistic', rselect(seq,l,i)
ただし、出力は時と場合によって異なります。私はアルゴリズムと python の両方の初心者です。私が間違っている場所についての助けをいただければ幸いです。編集: コードを実行するたびに、i 番目の次数統計の値が異なります。これは私の問題です。たとえば、以下のコードを実行すると、次のようになります。
Revised Output:
/py-scripts$ python quicksort.py
Sequence [54, -1, 1000, 565, 64, 2, 5]
Statistic Location 1
-1
@ubuntu:~/py-scripts$ python quicksort.py
Sequence [54, -1, 1000, 565, 64, 2, 5]
Statistic Location 5
Location 1
Location 0
-1
予想される出力: ここで i 次の統計を見つけることを期待しています。
したがって
test_rselect([54,-1,1000,565,64,2,5],2)
常にStatisticとして返さ5
れます。
この実装で私が間違っている場所での助けは役に立ちます..ありがとう!!
編集 2 : アルゴリズムを分析しようとしてから、 A とマークされた行でピボットの場所 (loc_pi)を返す方法にエラーがあると思います。上記のプログラムの次の一連のイベントを考慮してください。
test_rselect( [ 55, 900, -1,10, 545, 250], 3) // call to input array
calls rselect ([ 55, 900, -1,10, 545, 250],6,3)
1st call to random_partition:
pi=545 and loc_pi=4
lo=[55,-1,10,250,545]
hi=[900]
return to rselect function (lo,545,hi,6)
here loc_pi>i: so rselect(lo,5,3)// and discard the hi part
2nd recursive call to rselect:
2nd recursive call to random_partition:
call random_partition on (lo) // as 'hi' is discarded
pi=55 loc_pi=0
lo=[-1,10,55]
hi=[250,545]
return to rselect(lo,55,hi,4)
here loc_pi>i: rselect(lo,3,3)// The pivot element is lost already as it is in 'hi' here!!
正しいo/pを取得するために、ピボット要素の位置を返す方法についての助けがあれば助かります。私が間違っている場所とそれを修正する方法を明確に説明する答えのために、報奨金を設定します(学ぶことを楽しみにしているので、素晴らしいヒントを歓迎します:)) 。素晴らしい回答をお待ちしております!