Wyszukiwanie liniowe a wyszukiwanie binarne: różnica między wyszukiwaniem liniowym a wyszukiwaniem binarnym
Opublikowany: 2021-02-09Spis treści
Wstęp
Ciągła alokacja pamięci w językach programowania zapewnia elastyczną implementację przechowywania wielu punktów danych. Można to wykorzystać w szczytowym momencie, jeśli chcemy segregować dane i scalać wszystkie podobne dane w ciągłą strukturę danych, taką jak tablica, lista itp.
Ciągła alokacja pamięci ma wiele implementacji w rzeczywistych zastosowaniach, takich jak system operacyjny w komputerach, systemy zarządzania bazami danych itp. Ta struktura danych jest uważana za elastyczną, ponieważ dodanie nowego punktu danych do tablicy wymaga tylko jednej jednostki czasu, tj.; O(1).
Ale problem pojawia się, gdy chcemy spojrzeć na konkretny wpis lub wyszukać konkretny wpis, ponieważ wszystkie rzeczywiste aplikacje polegają na poleceniach dostępu do danych. A to zadanie musi być wystarczająco szybkie, aby sprostać szybkości procesora i pamięci.
Istnieją różne algorytmy wyszukiwania podzielone na podstawie liczby porównań, które wykonujemy w celu przeszukania elementu.
Jeśli porównamy każdy punkt danych w tablicy, aby przeszukać element, zostanie to uznane za wyszukiwanie sekwencyjne. Ale jeśli porównujemy tylko kilka elementów, pomijając niektóre porównania, to jest to uważane za wyszukiwanie przedziałowe. Ale potrzebujemy tablicy w porządku posortowanym (w porządku rosnącym lub malejącym), aby przeprowadzić na niej wyszukiwanie interwałowe.
Złożoność czasowa wyszukiwania sekwencyjnego jest liniowa O(n), a złożoność czasowa wyszukiwania binarnego (przykład wyszukiwania przedziałowego) wynosi O(log n). Istnieją również inne algorytmy wyszukiwania, takie jak wyszukiwanie wykładnicze, wyszukiwanie z przeskokiem itp.
Jednak wyszukiwanie liniowe i wyszukiwanie binarne są używane głównie, gdzie wyszukiwanie liniowe dotyczy losowych lub nieposortowanych danych, a wyszukiwanie binarne dotyczy posortowanych i uporządkowanych danych. Haszowanie to specjalny algorytm wyszukiwania, w którym złożoność czasowa dostępu do punktu danych wynosi O(1).
Przyjrzyjmy się najpierw algorytmom wyszukiwania liniowego i wyszukiwania binarnego, a następnie porównajmy różnice między wyszukiwaniem liniowym a wyszukiwaniem binarnym.
Wyszukiwanie liniowe
Jak już wspomniano, algorytm wyszukiwania liniowego porównuje każdy element w tablicy, a oto kod, który to robi.
klasa publiczna uaktualnienie { public static int linear_search ( int [] arr, int n, int k){ dla ( int i= 0 ; i<n; i++) jeśli (arr[i]==k) powrót i + 1 ; powrót – 1 ; } public static void main (String[] args){ int [] arr= nowy int []{ 1 , 2 , 5 , 6 , 3 , 8 , 9 , 9 , 0 , 13 , 45 , 65 }; int k= 13 ; int n=arr.długość; int r=linear_search(arr, n, k); jeśli (r==- 1 ) System.out.println( „nie znaleziono elementu” ); w przeciwnym razie System.out.println( „element znaleziony w pozycji „ +r+ ” ); } } |
Przejdźmy przez kod.
Zadeklarowaliśmy funkcję linear_search, która jako parametry oczekuje tablicy, klucza liczb całkowitych. Teraz musimy zapętlić wszystkie elementy i porównać, czy pasuje do naszego klucza wyszukiwania, więc napisaliśmy pętlę for, która zapętla się po tablicy, a wewnątrz niej jest pętla if, która sprawdza, czy liczba na tej pozycji jest zgodna z klawiszem wyszukiwania, czy nie. Jeśli znajdziemy dopasowanie, zwrócimy pozycję. Jeśli nie ma takiego elementu w tablicy, zwrócimy -1 na końcu funkcji.
Zauważ, że jeśli mamy wiele wystąpień tej samej liczby, zwrócimy pozycję pierwszego wystąpienia.
Przechodząc do metody main, zadeklarowaliśmy i zainicjowaliśmy tablicę liczb całkowitych. Następnie inicjujemy klucz, który należy przeszukać. Tutaj zakodujemy tablicę i klucz, ale możesz to zmienić na dane wejściowe użytkownika. Teraz, gdy mamy już listę elementów i klucz do przeszukania, wywoływana jest metoda wyszukiwania liniowego i odnotowywany jest zwrócony indeks. Później sprawdzamy zwróconą wartość i wyświetlamy indeks, jeśli klucz istnieje, w przeciwnym razie nie znaleziono klucza.
Wyszukiwanie binarne
Wyszukiwanie binarne jest bardziej zoptymalizowane niż wyszukiwanie liniowe, ale tablica musi być posortowana, aby zastosować wyszukiwanie binarne. A oto kod, jak to zrobić.
klasa publiczna uaktualnienie { public static int binary_search ( int [] arr, int k){ int l= 0 ,h=arr.length- 1 ,mid= 0 ; podczas gdy (l<=h){ mid=l+(hl)/ 2 ; jeśli (arr[średnia]==k) powrót mid+ 1 ; inaczej if (arr[mid]>k) h=środek- 1 ; w przeciwnym razie l=średni+ 1 ; } powrót – 1 ; } public static void main (String[] args){ int [] arr= nowy int []{ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }; int k= 8 ; int r=binarne_search(arr,k); jeśli (r==- 1 ) System.out.println( „nie znaleziono elementu” ); w przeciwnym razie System.out.println( „element znaleziony w pozycji „ +r+ ” ); } } |
Przejdźmy przez kod.
Zadeklarowaliśmy metodę binary_search, która oczekuje jako parametrów tablicy posortowanych liczb całkowitych i klucza liczb całkowitych. Inicjujemy zmienne low, high, mid. Tutaj niski, wysoki to wskaźniki, gdzie niski będzie przy indeksie 0, a wysoki będzie przy indeksie n na początku. Jak działa wyszukiwanie binarne?
Najpierw obliczymy środek niskiego i wysokiego. Średnią wartość możemy obliczyć jako (niski+wysoki)/2, ale czasami wysokość może być dużą liczbą, a dodanie do niej wartości niskiej może prowadzić do przepełnienia liczby całkowitej. Zatem obliczenie mida jako low+(high-low)/2 byłoby optymalnym sposobem.
Porównamy element w środku z kluczem wyszukiwania i zwrócimy indeks, jeśli znajdziemy dopasowanie. W przeciwnym razie sprawdzimy, czy środkowy element jest większy niż klucz, czy mniejszy niż klucz. Jeśli mid jest większy, musimy sprawdzić tylko pierwszą połowę tablicy, ponieważ wszystkie elementy w drugiej połowie tablicy są większe niż klucz, więc zaktualizujemy high do mid-1.
Podobnie, jeśli mid jest mniejszy niż klucz, musimy przeszukać drugą połowę tablicy, stąd aktualizując low do mid+1. Pamiętaj, że wyszukiwanie binarne opiera się na algorytmie zmniejszania i podbijania, ponieważ ignorujemy jedną z połówek tablicy w każdej iteracji.
Wracając do naszego kodu, zbudowaliśmy główną metodę. Zainicjowała posortowaną tablicę i klucz wyszukiwania, wywołała wyszukiwanie binarne i wydrukowała wyniki.
Teraz, gdy omówiliśmy algorytmy wyszukiwania liniowego i wyszukiwania binarnego, porównajmy oba algorytmy.
Wyszukiwanie liniowe a wyszukiwanie binarne
Pracujący
- Wyszukiwanie liniowe iteruje wszystkie elementy i porównuje je z kluczem, który ma zostać przeszukany.
- Wyszukiwanie binarne mądrze zmniejsza rozmiar tablicy, którą należy przeszukać i za każdym razem porównuje klucz z elementem środkowym.
Struktura danych
- Wyszukiwanie liniowe jest elastyczne we wszystkich strukturach danych, takich jak tablica, lista, lista połączona itp.
- Nie można przeprowadzić wyszukiwania binarnego na wszystkich strukturach danych, ponieważ potrzebujemy wielokierunkowego przechodzenia. Dlatego nie można używać struktur danych, takich jak pojedyncza połączona lista.
Warunki wstępne
- Wyszukiwanie liniowe można przeprowadzić na wszystkich typach danych, dane mogą być losowe lub posortowane, algorytm pozostaje ten sam. Nie ma więc potrzeby wykonywania żadnych prac wstępnych.
- Wyszukiwanie binarne działa tylko na posortowanej tablicy. Tak więc sortowanie tablicy jest warunkiem wstępnym dla tego algorytmu.
Przypadek użycia
- Wyszukiwanie liniowe jest generalnie preferowane w przypadku mniejszych i losowo uporządkowanych zestawów danych.
- Wyszukiwanie binarne jest preferowane w przypadku stosunkowo większych i posortowanych zestawów danych.
Skuteczność
- Wyszukiwanie liniowe jest mniej wydajne w przypadku większych zbiorów danych.
- Wyszukiwanie binarne jest bardziej wydajne w przypadku większych zbiorów danych.
Złożoność czasu
- W wyszukiwaniu liniowym złożoność w najlepszym przypadku to O(1), w której element znajduje się w pierwszym indeksie. Złożoność najgorszego przypadku to O(n), gdzie element znajduje się pod ostatnim indeksem lub element nie występuje w tablicy.
- W wyszukiwaniu binarnym złożoność w najlepszym przypadku to O(1), gdzie element znajduje się w środkowym indeksie. Złożoność najgorszego przypadku to O( log 2 n).
Próba
Załóżmy, że mamy tablicę o rozmiarze 10 000.
- W wyszukiwaniu liniowym złożoność najlepszego przypadku to O(1), a złożoność najgorszego przypadku to O(10000).
- W wyszukiwaniu binarnym złożoność najlepszego przypadku wynosi O(1), a złożoność najgorszego przypadku wynosi O( log 2 10000)=O(13.287).
Wniosek
Zrozumieliśmy znaczenie dostępu do danych w tablicach, zrozumieliśmy algorytmy wyszukiwania liniowego i wyszukiwania binarnego. Przeszedł przez kody wyszukiwania liniowego i wyszukiwania binarnego. Porównanie różnic między wyszukiwaniem liniowym a wyszukiwaniem binarnym, wykonane na sucho dla dużego przykładu.
Teraz, gdy już wiesz o różnicach między wyszukiwaniem liniowym a wyszukiwaniem binarnym, spróbuj uruchomić oba kody dla dużego zestawu danych wielopoziomowych i porównaj czas wykonania, zacznij eksplorować różne algorytmy wyszukiwania i spróbuj je zaimplementować!
Jeśli jesteś zainteresowany nauką o danych, sprawdź IIIT-B i upGrad's PG Diploma in Data Science, który jest stworzony dla pracujących profesjonalistów i oferuje ponad 10 studiów przypadków i projektów, praktyczne warsztaty praktyczne, mentoring z ekspertami z branży, 1- on-1 z mentorami branżowymi, ponad 400 godzin nauki i pomocy w pracy z najlepszymi firmami.
Ucz się online kursów nauki o danych z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.
Porównaj wyszukiwanie liniowe i wyszukiwanie binarne przy użyciu ich złożoności.
Wyszukiwanie binarne jest pod wieloma względami bardziej zoptymalizowane i wydajne niż wyszukiwanie liniowe, zwłaszcza gdy elementy są posortowane. Powód sprowadza się do złożoności obu poszukiwań.
Wyszukiwanie liniowe
1. Złożoność czasowa: O(N) - Ponieważ w wyszukiwaniu liniowym przechodzimy przez tablicę, aby sprawdzić, czy jakiś element pasuje do klucza. W najgorszym przypadku element będzie obecny na końcu tablicy, więc musimy przejść przez koniec, a zatem złożoność czasowa będzie wynosić O(N), gdzie N jest całkowitą liczbą elementów tablicy.
2. Złożoność przestrzeni: O(1) — Nie używamy dodatkowej przestrzeni, więc złożoność przestrzeni będzie wynosić O(1).
Wyszukiwanie binarne
1. Złożoność czasowa: O(log N) — w wyszukiwaniu binarnym wyszukiwanie zmniejsza się o połowę, ponieważ wystarczy spojrzeć do środka tablicy. I ciągle skracamy nasze poszukiwania do środka sekcji, w której występuje dany pierwiastek.
2. Złożoność przestrzeni: O(1)
- Nie używamy dodatkowej przestrzeni, więc złożoność przestrzeni będzie O(1).
Czy istnieje inna metoda wyszukiwania elementu w tablicy?
Chociaż wyszukiwanie liniowe i wyszukiwanie binarne są często używane do wyszukiwania, rzeczywiście istnieje inna metoda wyszukiwania - metoda interpolacji. Jest to zoptymalizowana wersja wyszukiwania binarnego, w której wszystkie elementy są rozmieszczone równomiernie.
Ideą tej metody jest to, że w wyszukiwaniu binarnym zawsze szukamy środka tablicy. Ale w tej metodzie wyszukiwanie może przejść do różnych lokalizacji w zależności od tego, gdzie znajduje się klucz. Na przykład, jeśli klucz znajduje się w pobliżu ostatniego elementu tablicy, wyszukiwanie rozpocznie się od końca tablicy.
Jakie są różne złożoności czasowe wyszukiwania interpolacyjnego?
Najgorsza złożoność czasowa wyszukiwania interpolacyjnego wynosi O(N), ponieważ w najgorszym przypadku klucz będzie znajdował się na końcu tablicy, więc iterator musi przejść przez całą tablicę.
Średnia złożoność przypadku będzie wynosić O(log(log N), ponieważ element może znajdować się w dowolnym miejscu tablicy.Może również znajdować się w pobliżu punktu początkowego.
Złożoność w najlepszym przypadku będzie wynosić O(1), ponieważ w najlepszym przypadku klucz będzie pierwszym elementem tablicy.