2016-10-28 6 views
0

私は、次の問題を解決するためにPythonでバイナリ検索を使用しています。a0、a1、a2、... an-1の順にn個の正の整数リスト。Pythonバイナリ検索Whileループが中断しない

あなたの友人は、「ここでは正の整数B.ここでBはリストの一部ですか?」のような質問をします。

Bがリストにある場合は、「はい」と表示されます。

あなたの仕事は、任意の入力に対して「はい」と答えた回数を出力することです。 10^5と1≤10^5、1≤M≤

1≤N≤A、B≤10^9

Iは、次のコードまで書いた:私はそれをテスト

n = int(raw_input()) 
a = [int(x) for x in raw_input().split()] 
m = int(raw_input()) 

answer = 0 

lo = 0 
hi = len(a) - 1 
end = False 

for i in range(0, m): 
    B = int(raw_input()) 
    while (lo <= hi): 
     mid = int((lo + hi)/2) 
     if B == a[mid]: 
      answer = answer + 1 
      break 
     elif B < a[mid]: 
      hi == mid - 1 
     elif B > a[mid]: 
      lo == mid + 1 

print answer 

を私はちょうど答えを出力することはありません、私は無限に終端に数字(文字でさえ)を書いています。文字を入力すると端末からエラーメッセージが表示されるので、最初の4行の後には、私が使用するまでは入力したものに応答しませんので、n、a、mの入力は成功しました。 ctrl Pythonから抜け出すためのZ。

これがなぜこのように扱われますか?私はこのプログラムも手で試してみたところ、うまくいったはずです。

ありがとうございます。

+1

'ハイテク==半ば:


独自のバイナリ検索を記述することなく、これを達成するための別の方法はbisect.bisect()を使用することです' –

+0

@JohnnyMopp返信ありがとうございます!出来た。 –

答えて

0

@ JohnnyMoppによってコメントされているコードに問題があります:=を代入に使用してください。==では等価演算子を使用しないでください。

別の問題は、各バイナリ検索後にhilowの値がリセットされないという別の問題です。

answer = 0 

for i in range(0, m): 
    B = int(raw_input()) 
    lo = 0 
    hi = len(a) - 1 

    while (lo <= hi): 
     mid = int((lo + hi)/2) 
     if B == a[mid]: 
      answer = answer + 1 
      break 
     elif B < a[mid]: 
      hi = mid - 1 
     elif B > a[mid]: 
      lo = mid + 1 

print answer 

良いアイデアが機能として、バイナリ検索を書くことになります:あなたは、forループ内でこれらの変数を初期化する行を移動する必要があります。 1 ' - - > `HI =半ば - 1'「の同じLO

import bisect 

def bisect_in(l, v): 
    return v == l[bisect.bisect(l, v)-1] 

count = 0 
for i in range(m): 
    B = int(raw_input()) 
    count += bisect_in(a, B) 

print count 
+0

ありがとうございました。それが問題に完全に答えました!残念なことに、評判が低いので投票できなかった。 –

関連する問題