LINUX.ORG.RU

бинарный поиск :(

 binarysearch


0

0

вот есть вполне лёгкий для подкорки взгляд

        l,r=1,n
        while(l<=r){
                m=l+(r-l)/2;
                sign(cmp(key,v[m])):
                        -1:r=m-1;
                         0:return m;
                         1:l=m+1;
        }
        return "-1 /что по мнению Степанова не культурно"
а есть опасный багами , быстый и вообще крутой.
        l,r=0,n     //0..n-1;n is after end of seq
        while(l<r){
                m=l+(r-l)/2
                sign(cmp(key,v[m])):
                        -1:r=m
                         0: а вот тут r=m или l=m+1 ?????
                         1:l=m+1;
        }
        return r

второй случай ещё и усугублён использованием бинарного if(толи меньше , толи меньши или равно) вместо тернарного(арифметического выбора)

собственно вопрос как культурно переходить из 1 варианта ( с поправкой что инвариант r- смотрит после последнего) в безбажный второй - где выбор между 2мя ветками.

★★☆
Ответ на: комментарий от BlackHawk

т.е. годное решение охота уметь повторять рассуждение приводящее к нему.

эээ «азимут» на рассуждение через которое вся реализация «симметрична»(только в сравнение асимметрия) достигается «раздвигом» краёв с обоих сторон -1 для левого начального и +1 для правого конечного элементов.

ну и инваринт цикла что между r и l есть всегда 3ий отличный элемент.

qulinxao ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.