Jestem ciekawy, czy ktoś mógłby mi wyjaśnić implementację wyszukiwania binarnego bez branchingu. Widziałem to w niedawnym numerze question, ale nie mogę sobie wyobrazić, w jaki sposób zostałby zaimplementowany. Zakładam, że przydatne byłoby unikanie oddziałów, jeśli liczba przedmiotów jest dość duża.Bezlistne wyszukiwanie binarne
Odpowiedz
Zakładam, że mówisz o zdaniu "Utwórz tablicę z wszystkimi idealnymi kwadratami w domenie, którą chcesz obsłużyć, i wykonaj szybkie bezgałęzowe wyszukiwanie binarne". znaleziono w this answer.
"Bezlistne" wyszukiwanie binarne jest po prostu rozwiniętą pętlą wyszukiwania binarnego. Działa to tylko wtedy, gdy znasz z góry liczbę przedmiotów w szukanej macierzy (tak jak w przypadku, gdy jest to static const
). Możesz napisać program do napisania rozwiniętego kodu, jeśli jest zbyt długi, aby zrobić go ręcznie.
Następnie należy test porównawczy rozwiązanie, aby zobaczyć, czy rzeczywiście jest szybszy niż pętli. Jeśli twój bezkierunkowy kod jest zbyt duży, nie zmieści się on w pamięci podręcznej instrukcji szybkiego procesora i potrwa dłużej niż odpowiednia pętla.
Jeśli ktoś ma funkcję, która zwraca +1, -1 lub 0 w zależności od pozycji właściwej pozycji w porównaniu z bieżącą, można zainicjować pozycję do rozmiaru listy/2 i zmienić na pozycję/2, i następnie po każdym porównaniu wykonaj pozycję + = kierunek * stepsize; stepsize = stepsize/2. Iteruj, aż liczba kroków wynosi zero.
"Powtórzyć, aż liczba kroków wynosi zero." Jak to jest bez gałęzi, że robisz gałąź nie zero? – rlibby
Jeśli znasz wartość początkową, możesz rozwinąć pętlę wymaganą liczbę razy. Alternatywnie niektóre platformy sprzętowe (zwłaszcza DSP) obsługują pętlę "DO" w stylu Fortran; gdy instrukcja zostanie pobrana z adresu odpowiadającego adresowi końca pętli, licznik pętli zmniejszy się, a licznik programu zostanie załadowany adresem rozpoczęcia pętli. Zero cykli dla pętli. – supercat
obliczone oddziały są nadal gałęziami. Rozwijanie pętli jest bezlistne (a przynajmniej może być), ale nie używa żadnych warunków, takich jak "dopóki nie wynosi zero". – rlibby
- 1. Drzewo binarne Pierwsze wyszukiwanie
- 2. Szybsze niż wyszukiwanie binarne dla uporządkowanej listy
- 3. Jak wykonać wyszukiwanie binarne pliku tekstowego
- 4. Wyszukiwanie binarne w tablicy w Perlu
- 5. Jak przeprowadzić wyszukiwanie binarne w NSArray?
- 6. Wyszukiwanie binarne ciągów - minimalna szerokość kosza?
- 7. jak zrobić wyszukiwanie binarne w jednym modelu kłamstwa?
- 8. Wyszukiwanie binarne na dużym pliku dyskowym w języku C - problemy
- 9. Wyszukiwanie binarne w Erlangu w czasie lg (n)
- 10. Na której wartości n wyszukiwanie binarne staje się szybsze niż wyszukiwanie liniowe na nowoczesnym procesorze?
- 11. Jak mogę lepiej zrozumieć wyszukiwanie binarne za pomocą jednego porównania za każdą z iteracji?
- 12. Ile porównań dokona wyszukiwanie binarne w najgorszym przypadku przy użyciu tego algorytmu?
- 13. Jak utworzyć drzewo binarne
- 14. Numery binarne w Pythonie
- 15. JAVA: drzewa binarne
- 16. C# - Proste drzewo binarne
- 17. Tornado websockets obsługujące binarne
- 18. Java - przetwarza binarne długo
- 19. Sortowanie sekwencje binarne R
- 20. Dopasowany binarne w Erlang
- 21. stream.io strumieniowe dane binarne
- 22. Python POST dane binarne
- 23. Ubuntu: Jak połączyć binarne
- 24. Przechowuj dane binarne mysql
- 25. C czyta pliki binarne
- 26. OCaml: rysuj drzewa binarne
- 27. Dziwne binarne ELF
- 28. C# Wyświetla binarne drzewo poszukiwań w konsoli
- 29. Bajty na binarne w C
- 30. Tokenising dane binarne w java
Ah okej, rozumiem, dzięki. Zakładałem, że było trochę dziwnego drwala, aby uniknąć instrukcji if wewnątrz pętli. – GWW
+1, ponieważ jest to rzeczywiście przydatny sposób usuwania gałęzi pętli, chociaż z późniejszego komentarza na to pytanie wydaje się, że R. zamierzał zamiast tego "bity twiddle, aby uniknąć rozgałęzień warunkowych". Robiąc to, możesz w zasadzie unikać * wszystkich * gałęzi. –
Takie "bezlistne" rozwijane wyszukiwanie znajduje się w "Programming Pearls" firmy Bentley, IIRC, gdzie dokładnie tłumaczy technikę –