注: 私は python 2.7.3 を使用しています。他のバージョンの python で除算の結果が異なるかどうかはわかりません。
いくつかの変更が必要です:
mn != mx
に変更mn < mx
pivot = mn + ((mx - mn) / 2)
分割に関しては、ステートメントを変更するpivot = int(math.floor((mn + mx) / 2))
かpivot = mn + int(math.floor((mx - mn) / 2))
、あらゆる種類の驚きを防止します。
- で示される検索間隔は、
mn
でmx
指定される半開間隔に変更され[mn, mx)
ます。これは、ハンド コーディングされたバイナリ検索に関して、私がよく知っているものだからです。したがって、最初はmx
に設定する必要があり、 (iow、テストがの場合)の場合ではなく に設定する必要があります。a
mx
pivot
pivot - 1
seq[a] <= seq[pivot]
if
False
したがって、編集を含むコードは次のようになります。
import math
def insort(seq):
for a in xrange(1, len(seq)):
if seq[a] > seq[a - 1]:
continue
else:
mn, mx = 0, a
while mn < mx:
pivot = mn + int(math.floor(((mx - mn) / 2)))
if seq[a] > seq[pivot]:
mn = pivot + 1
else:
mx = pivot
seq.insert(mn, seq.pop(a))
元のコードでは、 mx
gets でスタックする例を示します-2
。
このリストを考えると:[10, 7, 8, 5, 13, 2, 6, 1, 50]
値を持つインデックス 5 の要素まで、すべてが正常に機能します (いくつかのステートメント2
を追加して、これを自分で確認してください)。は false (はprint
これまでのところ最小の要素です) であるため、if ステートメントの else 分岐に入ります。seq[a] > seq[a-1]
2
この時点で:
seq = [5, 7, 8, 10, 13, 2, 6, 1, 50]
a = 5
mn = 0
mx = a - 1 = 4
mn != mx
( )から0 != 4
while ループに入ります。=pivot
に設定されています。次に実行します。、while =およびisであるため、else ブランチに移動して実行します0 + ((4 - 0) / 2)
2
if seq[a] > seq[pivot]
seq[a] = 2
seq[pivot]
8
2 > 8
False
mx = pivot - 1 = 2 - 1 = 1
この時点で:
seq = [5, 7, 8, 10, 13, 2, 6, 1, 50]
a = 5
mn = 0
mx = 1
while ループで再度チェックを実行します。mn != mx
( 0 != 1
) ということで、while ループの本体に入ります。を設定しpivot = 0 + ((1 - 0) / 2) = 0
(私は python 2.7 を使用してこの除算を実行しているので、repl で検証します)、チェックseq[a] > seq[pivot]
( 2 > 5
) を実行します。これはFalse
です。したがって、 を設定しmx = pivot - 1 = 0 - 1 = -1
ます。
この時点で:
seq = [5, 7, 8, 10, 13, 2, 6, 1, 50]
a = 5
mn = 0
mx = -1
mn != mx
ここで、while ループ( )でチェックを行う0 != -1
ので、while ループの本体に入ります。pivot = 0 + ((-1 - 0) / 2) = -1
. 次に、チェックseq[a] > seq[pivot]
( seq[5] > seq[-1]
、つまり の 5 番目の要素と の最後の要素を比較する) を実行します。seq
つまり2 > 50
、 ですFalse
。だからmx = pivot - 1 = -1 - 1 = -2
。
これで最終ステップに到達しました。
seq = [5, 7, 8, 10, 13, 2, 6, 1, 50]
a = 5
mn = 0
mx = -2
while ループのチェックではmn != mx
, ということで に進みpivot = 0 + ((-2 - 0) / 2) = -1
ます. これが上記のステップと同じピボットであることに注意してください。次に、seq[5] > seq[-1]
が実行されます ( 2 > 50
) False
。だからmx = pivot - 1 = -1 - 1 = -2
。そして、上記と同じ状態になります。これが、無限ループが表示される理由です。
最後に、二分探索は、境界インデックスを間違えやすいため、コード化するのが非常に難しいアルゴリズムです。私は何度も手作業でコードを書いてきましたが、それでもかなりトリッキーだと思います。これも読みたいかもしれません: http://en.wikipedia.org/wiki/Binary_search_algorithm
それが役立つことを願っています!