Ovaj vodič će naučiti kako možemo primijeniti algoritam binarnog pretraživanja koristeći Python da pronađemo poziciju indeksa elementa na zadanom popisu.
Uvod
Binarno pretraživanje je algoritam za pronalaženje određenog elementa na popisu. Pretpostavimo da imamo popis od tisuću elemenata i trebamo dobiti poziciju indeksa određenog elementa. Indeksnu poziciju elementa možemo pronaći vrlo brzo pomoću algoritma binarnog pretraživanja.
Postoji mnogo algoritama pretraživanja, ali binarno pretraživanje je najpopularnije među njima.
Elementi na popisu moraju biti poredani kako bi se primijenio algoritam binarnog pretraživanja. Ako elementi nisu poredani, prvo ih sortirajte.
Razumimo koncept binarnog pretraživanja.
Koncept binarnog pretraživanja
U algoritmu binarnog pretraživanja položaj elementa možemo pronaći pomoću sljedećih metoda.
- Rekurzivna metoda
- Iterativna metoda
Tehniku pristupa podijeli pa vladaj prati rekurzivna metoda. U ovoj se metodi funkcija sama sebe poziva iznova i iznova dok ne pronađe element na popisu.
Skup naredbi ponavlja se više puta kako bi se pronašao položaj indeksa elementa u iterativnoj metodi. The dok petlja se koristi za postizanje ovog zadatka.
Binarno pretraživanje je učinkovitije od linearnog pretraživanja jer ne moramo pretraživati svaki indeks popisa. Popis mora biti sortiran kako bi se postigao algoritam binarnog pretraživanja.
Pogledajmo implementaciju binarnog pretraživanja korak po korak.
Imamo sortirani popis elemenata i tražimo poziciju indeksa od 45.
kako promijeniti string u int
[12, 24, 32, 39, 45, 50, 54]
Dakle, postavljamo dva pokazivača na naš popis. Jedan pokazivač se koristi za označavanje manje pozvane vrijednosti nizak a drugi pokazivač služi za označavanje najveće pozvane vrijednosti visoka .
Zatim izračunavamo vrijednost sredini element u nizu.
mid = (low+high)/2 Here, the low is 0 and the high is 7. mid = (0+7)/2 mid = 3 (Integer)
Sada ćemo usporediti traženi element sa srednjom vrijednošću indeksa. U ovom slučaju, 32 nije jednako Četiri pet. Dakle, moramo napraviti daljnju usporedbu da pronađemo element.
Ako je broj koji tražimo jednak sredini. Onda se vrati sredina inače prijeđite na daljnju usporedbu.
Broj koji treba pretražiti veći je od sredini broj, uspoređujemo n sa srednjim elementom elemenata na desnoj strani sredina i postavite nisko na nisko = srednje + 1.
U suprotnom, usporedite n s srednji element elemenata na lijevoj strani sredina i postaviti visoka do visoko = srednje - 1.
Ponavljajte dok se ne pronađe broj koji tražimo.
Implementirajte binarno pretraživanje u Pythonu
Prvo implementiramo binarno pretraživanje iterativnom metodom. Ponovit ćemo niz izjava i ponoviti svaku stavku popisa. Pronaći ćemo srednju vrijednost dok pretraga ne završi.
Razumimo sljedeći program iterativne metode.
Python implementacija
# Iterative Binary Search Function method Python Implementation # It returns index of n in given list1 if present, # else returns -1 def binary_search(list1, n): low = 0 high = len(list1) - 1 mid = 0 while low <= 1 2 high: # for get integer result mid="(high" + low) check if n is present at list1[mid] n: high="mid" - smaller, compared to the left of else: return element was not in list, -1 initial list1 24, 32, 39, 45, 50, 54] function call n) !="-1:" print('element index', str(result)) list1') < pre> <p> <strong>Output:</strong> </p> <pre> Element is present at index 4 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above program -</p> <ul> <li>We have created a function called <strong>binary_search()</strong> function which takes two arguments - a list to sorted and a number to be searched.</li> <li>We have declared two variables to store the lowest and highest values in the list. The low is assigned initial value to 0, <strong>high</strong> to <strong>len(list1)</strong> - 1 and mid as 0.</li> <li>Next, we have declared the <strong>while</strong> loop with the condition that the <strong>lowest</strong> is equal and smaller than the <strong>highest</strong> The while loop will iterate if the number has not been found yet.</li> <li>In the while loop, we find the mid value and compare the index value to the number we are searching for.</li> <li>If the value of the mid-index is smaller than <strong>n</strong> , we increase the mid value by 1 and assign it to The search moves to the left side.</li> <li>Otherwise, decrease the mid value and assign it to the <strong>high</strong> . The search moves to the right side.</li> <li>If the n is equal to the mid value then return <strong>mid</strong> .</li> <li>This will happen until the <strong>low</strong> is equal and smaller than the <strong>high</strong> .</li> <li>If we reach at the end of the function, then the element is not present in the list. We return -1 to the calling function.</li> </ul> <p>Let's understand the recursive method of binary search.</p> <h2>Recursive Binary Search</h2> <p>The recursion method can be used in the binary search. In this, we will define a recursive function that keeps calling itself until it meets the condition.</p> <p>Let's understand the above program using the recursive function.</p> <h3>Python Program</h3> <pre> # Python program for recursive binary search. # Returns index position of n in list1 if present, otherwise -1 def binary_search(list1, low, high, n): # Check base case for the recursive function if low n: return binary_search(list1, low, mid - 1, n) # Else the search moves to the right sublist1 else: return binary_search(list1, mid + 1, high, n) else: # Element is not available in the list1 return -1 # Test list1ay list1 = [12, 24, 32, 39, 45, 50, 54] n = 32 # Function call res = binary_search(list1, 0, len(list1)-1, n) if res != -1: print('Element is present at index', str(res)) else: print('Element is not present in list1') </pre> <p> <strong>Output:</strong> </p> <pre> Element is present at index 2 </pre> <p> <strong>Explanation</strong> </p> <p>The above program is similar to the previous program. We declared a recursive function and its base condition. The condition is the lowest value is smaller or equal to the highest value.</p> <ul> <li>We calculate the middle number as in the last program.</li> <li>We have used the <strong>if</strong> statement to proceed with the binary search.</li> <li>If the middle value equal to the number that we are looking for, the middle value is returned.</li> <li>If the middle value is less than the value, we are looking then our recursive function <strong>binary_search()</strong> again and increase the mid value by one and assign to low.</li> <li>If the middle value is greater than the value we are looking then our recursive function <strong>binary_search()</strong> again and decrease the mid value by one and assign it to low.</li> </ul> <p>In the last part, we have written our main program. It is the same as the previous program, but the only difference is that we have passed two parameters in the <strong>binary_search()</strong> function.</p> <p>This is because we can't assign the initial values to the low, high and mid in the recursive function. Every time the recursive is called the value will be reset for those variables. That will give the wrong result.</p> <h2>Complexity</h2> <p>The complexity of the binary search algorithm is <strong>O(1)</strong> for the best case. This happen if the element that element we are looking find in the first comparison. The <strong>O(logn)</strong> is the worst and the average case complexity of the binary search. This depends upon the number of searches are conducted to find the element that we are looking for.</p> <h2>Conclusion</h2> <p>A binary search algorithm is the most efficient and fast way to search an element in the list. It skips the unnecessary comparison. As the name suggests, the search is divided into two parts. It focuses on the side of list, which is close to the number that we are searching.</p> <p>We have discussed both methods to find the index position of the given number.</p> <hr></=>
Obrazloženje:
U gornjem programu -
- Napravili smo funkciju tzv binarno_pretraživanje() funkcija koja uzima dva argumenta - popis za sortiranje i broj za pretraživanje.
- Deklarirali smo dvije varijable za pohranjivanje najniže i najviše vrijednosti na popisu. Niskom se početna vrijednost dodjeljuje na 0, visoka do dužina (popis1) - 1 i sredina kao 0.
- Zatim smo proglasili dok petlja uz uvjet da je najniža je jednak i manji od najviši Dok petlja će se ponavljati ako broj još nije pronađen.
- U while petlji nalazimo srednju vrijednost i uspoređujemo vrijednost indeksa s brojem koji tražimo.
- Ako je vrijednost srednjeg indeksa manja od n , povećavamo srednju vrijednost za 1 i dodjeljujemo je Traženje se pomiče ulijevo.
- U suprotnom smanjite srednju vrijednost i dodijelite je visoka . Pretraga se pomiče na desnu stranu.
- Ako je n jednako srednjoj vrijednosti, vratite sredina .
- To će se događati do nizak je jednak i manji od visoka .
- Ako dođemo do kraja funkcije, tada element nije prisutan na popisu. Vraćamo -1 pozivnoj funkciji.
Hajdemo razumjeti rekurzivnu metodu binarnog pretraživanja.
Rekurzivno binarno pretraživanje
Metoda rekurzije može se koristiti u binarnom pretraživanju. Ovdje ćemo definirati rekurzivnu funkciju koja nastavlja pozivati samu sebe dok ne ispuni uvjet.
primjer stabla binarnog pretraživanja
Razumimo gornji program koristeći rekurzivnu funkciju.
Python program
# Python program for recursive binary search. # Returns index position of n in list1 if present, otherwise -1 def binary_search(list1, low, high, n): # Check base case for the recursive function if low n: return binary_search(list1, low, mid - 1, n) # Else the search moves to the right sublist1 else: return binary_search(list1, mid + 1, high, n) else: # Element is not available in the list1 return -1 # Test list1ay list1 = [12, 24, 32, 39, 45, 50, 54] n = 32 # Function call res = binary_search(list1, 0, len(list1)-1, n) if res != -1: print('Element is present at index', str(res)) else: print('Element is not present in list1')
Izlaz:
Element is present at index 2
Obrazloženje
Gornji program je sličan prethodnom programu. Deklarirali smo rekurzivnu funkciju i njen osnovni uvjet. Uvjet je da je najniža vrijednost manja ili jednaka najvišoj vrijednosti.
- Srednji broj izračunavamo kao u prošlom programu.
- Koristili smo ako naredbu za nastavak binarnog pretraživanja.
- Ako je srednja vrijednost jednaka broju koji tražimo, vraća se srednja vrijednost.
- Ako je srednja vrijednost manja od vrijednosti, tada gledamo našu rekurzivnu funkciju binarno_pretraživanje() ponovno i povećajte srednju vrijednost za jedan i dodijelite niskoj.
- Ako je srednja vrijednost veća od vrijednosti koju tražimo, tada je naša rekurzivna funkcija binarno_pretraživanje() ponovno i smanjite srednju vrijednost za jedan i dodijelite je niskoj.
U zadnjem dijelu smo napisali naš glavni program. Isti je kao prethodni program, ali jedina razlika je u tome što smo proslijedili dva parametra u binarno_pretraživanje() funkcija.
To je zato što ne možemo dodijeliti početne vrijednosti niskoj, visokoj i srednjoj u rekurzivnoj funkciji. Svaki put kad se pozove rekurziv, vrijednost će se poništiti za te varijable. To će dati pogrešan rezultat.
Složenost
Složenost algoritma binarnog pretraživanja je O(1) za najbolji slučaj. To se događa ako element koji tražimo pronađe u prvoj usporedbi. The O (prijava) je najgora i prosječna složenost slučaja binarnog pretraživanja. To ovisi o broju pretraga koje se provode kako bi se pronašao element koji tražimo.
Zaključak
Algoritam binarnog pretraživanja najučinkovitiji je i najbrži način pretraživanja elementa na popisu. Preskače nepotrebnu usporedbu. Kao što naziv govori, pretraga je podijeljena u dva dijela. Fokusira se na stranu popisa, koja je blizu broja koji tražimo.
Raspravili smo obje metode za pronalaženje indeksne pozicije zadanog broja.
=>