Błąd we wszystkich implementacjach wyszukiwania binarnego

Czytaliście "Perełki programowania"? Autor pisze tam że pierwsze wyszukiwanie binarne zostało opisane w 1946 ale dopiero w 1962 udało się stworzyć bezbłędną wersję tego algorytmu. Okazało się, że nawet wersja opisana w Perełkach (i z dowodem poprawności) zawiera błąd...

  • Reklamy Google

  • kkll +1  

    Implementacja na 31-bitowych intach obsługuje poprawnie "tylko" 2^30 elementów! AAAaaa, jakie straszne! ;)

    pokaż komentarz
    kkll
  • Polinik +1  

    Przy dodawaniu nowych linkow mozna (wrecz trzeba) zdefiniowac w jakim jezyku jest tresc pod linkiem.
    Nie dodawaj obcojezycznych linkow jako polskojezyczne, dobrze?

    pokaż komentarz
    Polinik
  • ponton 0  

    Zamiast tego można zrobić tak:

    int mid = low + (high-low) / 2;

    pokaż komentarz
    ponton
  • SasQ 0  

    @ponton: Dla mnie to by było oczywiste i samonasuwające się rozwiązanie. Tamto to jakaś droga na około...

    pokaż komentarz
    SasQ
  • pawlak 0  

    LOL, na tej samej zasadzie błędny jest każdy algorytm, który można błędnie zaimplementować, doprowadzając do przepełnienia liczby całkowitej. Problem leży nie w algorytmie, tylko w nieuważnym implementowaniu go. Spostrzeżenie niewątpliwie ciekawe, lecz wyszukiwanie binarne i merge sort jako takie są jak najbardziej poprawne.

    pokaż komentarz
    pawlak
  • piotrb -1  

    Przecież wystarczy dodać kolejne 32 bity i będzie dobrze, w końcu liczba danych i tak przekroczy 2^32 i wtedy long long będzie ok. Naprawdę nie pojmuje w czym problem.

    pokaż komentarz
    piotrb
  • SasQ -1  

    @piotrb: W tym, że dodając bity liczby zwiększa się zazwyczaj jednocześnie przestrzeń adresowa, więc ten algorytm będzie się przepełniać niezależnie od tego, ile bitów użyjesz.

    pokaż komentarz
    SasQ
  • pawlak -1  

    kkll: ale błąd jest.

    pokaż komentarz
    pawlak
  • pawlak -1  

    Jest tam takie rozwiązanie, tylko z dodatkowymi nawiasami.

    pokaż komentarz
    pawlak
pokaż 

Wykopali i zakopali (23 / 0)