2017-01-06 6 views
1

Я выполняю двоичный поиск, скажем, мне нужно найти минимальное значение x, так что black_box(x) дает мне true результат.Выполнение двоичного поиска

Свойство black_box(x)

  • Если black_box(x) дает мне так, то x+1,x+2,x+3,x+4....upto infinty все дает мне true

Для целочисленное значение это просто бинарный поиск

start=0; 
end = Max; 
ans=-1; 
while(start<=end){ 

    mid =(start+end)/2; 
    if(black_box(mid)): 
     end =mid-1 
     ans=mid; 
    else: start=mid+1; 
} 

Что делать, если я хочу floating point целое число до двух десятичных знаков, как я должен выполнять двоичный поиск?

+0

Если 'end = Inf', как вы можете определить его середину? Даже для 'int' это не так. –

+0

@WillemVanOnsem Это выражение smiple, Inf будет максимальное значение, просто представление, надеюсь, вы получите это –

+0

да, но есть способы представлять целые числа без максимального значения (или, по крайней мере, до тех пор, пока у вас не закончится память, например 'BigInteger' в Java. –

ответ

1

Вы просто повторяете до start и end отличаются не более чем 0.01. Таким образом, условие остановки теперь:

while(end-start > 0.01){ 

Кроме того, как было указано в комментарии самостоятельно, вы не можете увеличения/уменьшения start и end в вашем алгоритме, так как индексы не являются дискретными. Полный алгоритм сейчас:

start=0; 
end = Max; 
ans=-1; 
while(end-start > 0.01){ 

    mid =(start+end)/2.0; 
    if(black_box(mid)): 
     end =mid 
     ans=mid; 
    else: start=mid; 
} 

Это работает, потому что на каждую итерацию start является нижней границей о точном значении и end является верхней границей от точного значения. Если оба значения не отличаются от 0.01, мы знаем, что он находится в диапазоне от start и end, а так как разница меньше 0,01, то это точный результат двумя десятичными знаками.

Тем не менее, ваш алгоритм неверен в том смысле, что, установив end = Inf, вы не можете работать с этим. Возможно, вы можете использовать максимальное представляемое значение или использовать экспоненциальный инкрементный поиск сначала как шаг предварительной обработки.

+0

Как насчет приращения i am increment с +1 –

+0

@NarendraModi: просто установите 'end = mid' и' start = mid', поэтому без приращений/декрементов. –

+0

ваше 'while' условие неверно, пожалуйста, обновите его – DreamWorks

Смежные вопросы