Linearno pretraživanje: Python, C++ Primjer

⚡ Pametni sažetak

Linearno pretraživanje sekvencijalno ispituje svaki element popisa dok se ne pronađe ciljna vrijednost ili dok se popis ne završi. Ova metoda ne zahtijeva sortirane podatke, radi u vremenu O(n) i učinkovito odgovara malim ili neuređenim kolekcijama.

  • 🔍 Osnovni mehanizam: Linearno pretraživanje uspoređuje cilj sa svakim elementom od indeksa nula dok se ne pronađe odgovarajuća pozicija ili dok se skeniranje ne završi vraćanjem -1.
  • Ponašanje funkcije: Rutina vraća indeks između 0 i n-1 kada je vrijednost prisutna, ili -1 kada element pretraživanja nije prisutan u polju.
  • 💻 Code Implementacije: Rad C++ i Python primjeri prolaze kroz cjelobrojni niz jednom petljom i ispisuju indeks gdje se pojavljuje tražena vrijednost.
  • 📊 Profil složenosti: Vremenska složenost doseže O(n) u najgorem i prosječnom slučaju, O(1) u najboljem, dok prostorna složenost ostaje O(n) ukupno.
  • 🚀 Tehnike optimizacije: Transpozicija i Pomicanje prema naprijed preuređuju često tražene tipke prema naprijed, smanjujući usporedbe između ponovljenih pretraživanja.

Algoritam linearnog pretraživanja

Što je algoritam pretraživanja?

Algoritam pretraživanja osmišljen je za pronalaženje elementa ili objekta iz zbirke elemenata ili objekata s danom strukturom podataka. Na primjer, pretraživanje minimalne visine s danog popisa visina ili pretraživanje najviše oznake s popisa ili niza brojeva. Nekoliko popularnih algoritama pretraživanja uključuje "linearno pretraživanje", "binarno pretraživanje", "pretragu sa skokom", "Fibonaccijevo pretraživanje" itd.

Što je linearno pretraživanje?

Linearno pretraživanje je jedan od najjednostavnijih algoritama pretraživanja. Iz zadanog popisa ili niza pretražuje zadane elemente jedan po jedan. Linearno pretraživanje iterira kroz cijeli popis i provjerava je li bilo koji određeni element jednak traženom elementu. Također se naziva i sekvencijalno pretraživanje.

Što radi funkcija linearnog pretraživanja?

Niz cijelih brojeva zadan je kao "Numbers,” a varijabla “item” sadrži cijeli broj za pretraživanje.

Sada, algoritam linearnog pretraživanja može dati sljedeći rezultat:

  • „-1“; to znači da se zadani element ne nalazi u nizu.
  • Bilo koji broj između 0 do n-1; znači da je traženi element pronađen i vraća indeks elementa u nizu. Ovdje "n" predstavlja veličinu niza.

Kako radi linearno pretraživanje?

Recimo da je niz koji sadrži cijele brojeve. Zadatak je pronaći zadani broj u nizu.

  • Ako se broj nalazi u nizu, moramo vratiti indeks tog broja.
  • Ako zadani broj nije pronađen, vratit će -1.

U dijagramu toka, "Podaci" su niz cijelih brojeva, "N" je veličina niza, a "stavka" je broj koji želimo pretraživati ​​u nizu.

Dijagram toka za algoritam linearnog pretraživanja:

Dijagram toka za algoritam linearnog pretraživanja

Evo koraka dijagrama toka:

Korak 1) Pročitajte stavku pretraživanja, "stavka".

Korak 2) Inicijalizirajte i=0 i indeks=-1.

Korak 3) Ako ja

Korak 4) Ako je Data[i] jednako "item", tada idite na korak 5. Inače idite na korak 6.

Korak 5) Indeks = i (Budući da se stavka nalazi na indeksu br. i). Idi na korak 8.

Korak 6) i = i +1.

Korak 7) Idite na korak 3.

Korak 8) Zaustavite.

Radi jednostavnosti, dajemo primjer s nizom cijelih brojeva. Linearno pretraživanje također je primjenjivo u nizu, nizu objekata ili strukturi.

Nadimak Code za algoritam sekvencijalnog pretraživanja

Sljedeći pseudokod obuhvaća logiku linearnog pretraživanja opisanog gore. Obilazi niz od prvog indeksa i vraća poziciju na podudarnosti, inače vraća -1.

function linearSearch: in → Data[], item
    foundAt = -1
    for i in (0 to data.length):
        if data[i] equals item:
            // item is found in the array
            // returning the index
            return i
    // item not found in the array
    // -1 means no item found, as a negative index is not valid
    return -1

C++ Code Primjer linearnog pretraživanja

Evo je potpuni C++ program koji implementira sekvencijalno pretraživanje i ispisuje indeks tražene vrijednosti.

#include <bits/stdc++.h>
using namespace std;

int linearSearch(int *arr, int item, int n) {
    int idx = -1;
    for (int i = 0; i < n; i++) {
        if (arr[i] == item) {
            idx = i;
            break;
        }
    }
    return idx;
}

int main() {
    int array[] = {1, 9, 8, 7, 6, 3, 11, 4, 6, 9, 7, 2, 0, 19, -10};
    int n = sizeof(array) / sizeof(array[0]);
    int item;
    cout << "Enter a number to search: ";
    cin >> item;
    int idx = linearSearch(array, item, n);
    if (idx >= 0) {
        cout << item << " is found at index " << idx << endl;
    } else {
        cout << "Could not find " << item << " in the array" << endl;
    }
}

Izlaz:

Enter a number to search: -10
-10 is found at index 14

Python Code Primjer linearnog pretraživanja

Ista logika u Python koristi jednu petlju preko indeksa liste i vraća poziciju odgovarajućeg elementa.

def linearSearch(data, item):
    for i in range(len(data)):
        if data[i] == item:
            return i
    return -1

data = [1, 9, 8, 7, 6, 3, 11, 4, 6, 9, 7, 2, 0, 19, -10]
item = int(input("Enter a number to search: "))
idx = linearSearch(data, item)
if idx >= 0:
    print("{} is found at index {}".format(item, idx))
else:
    print("{} was not found".format(item))

Izlaz:

Enter a number to search: -10
-10 is found at index 14

Analiza složenosti algoritma linearnog pretraživanja

Općenito, vremenska složenost znači količinu CPU vremena potrebnog za izvršavanje određenog zadatka. U linearnom algoritmu pretraživanja, zadatak je pronaći ključ pretraživanja iz elemenata niza.

Tri vrste vremenske složenosti su:

  • Najgori scenarij
  • Najbolji scenarij
  • Scenarij prosječnog slučaja

Vremenska složenost linearne pretrage u najgorem scenariju:

Recimo da trebamo izvršiti linearno pretraživanje u nizu veličine "n". Možemo pronaći traženi element između indeksa 0 i n-1. U najgorem slučaju, algoritam će pokušati pronaći sve elemente iz niza koji odgovaraju traženom elementu.

U tom slučaju, najgora moguća složenost bit će O(n). Ovdje „O“ — oznaka velikog O — označava funkciju složenosti.

Vremenska složenost linearne pretrage u scenariju najboljeg slučaja:

Recimo da tražimo element koji se nalazi na prvoj poziciji niza. U ovom scenariju, linearni algoritam pretraživanja neće tražiti svih n elemenata u nizu. Dakle, složenost će biti O(1). To znači konstantno vrijeme.

Vremenska složenost linearne pretrage u prosječnom slučaju:

Kada se element nađe na srednjem indeksu niza, tada se može reći da je prosječna složenost slučaja za linearno pretraživanje O(N), gdje N označava duljinu niza.

Prostorna složenost linearnog algoritma pretraživanja:

Prostorna složenost za linearno pretraživanje je uvijek O(N) jer ne moramo pohranjivati ​​ili koristiti bilo kakvu privremenu varijablu u funkciji linearnog pretraživanja.

Kako poboljšati algoritam linearnog pretraživanja

Pretraživanje se može izvršiti više puta tijekom životnog ciklusa programa. Također je moguće da pokrećemo linearni algoritam pretraživanja i tražimo bilo koji određeni ključ nekoliko puta. Možemo koristiti "Algoritam binarnog pretraživanja” ako je polje sortirano polje.

Pretpostavimo da se niz sastoji od 10 tisuća brojeva, a ciljni element se nalazi na 5000. indeksu. Dakle, algoritam će pokušati usporediti 5000 elemenata. Sada su usporedbe teški zadaci CPU-a. Za optimizaciju algoritma linearnog pretraživanja imamo dvije mogućnosti.

  • Transpozicija
  • Pomakni naprijed

Transpozicija:

U ovoj metodi zamijenit ćemo element pretraživanja s njegovim prethodnim elementom u nizu. Na primjer, recimo da imate niz poput sljedećeg:

Podaci[] = {1,5,9,8,7,3,4,11}

Sada želimo pretražiti 4. koraka transpozicije:

Transpozicija u linearnom pretraživanju

Korak 1) “4” se nalazi na indeksu 6. Bilo je potrebno šest usporedbi.

Korak 2) Zamijenite podatke[6] i podatke[5]. Tada će niz podataka izgledati ovako:

Podaci[] = {1,5,9,8,7,4,3,11}

Korak 3) Ponovno pretražite 4. Pronađeno u indeksu 5. Ovaj put je bilo potrebno pet usporedbi.

Korak 4) Zamijenite podatke[5] i podatke[4]. Tada će niz podataka izgledati ovako:

Podaci[] = {1,5,9,8,4,7,3,11}

Ako primijetite, što se češće traži ključ, to se više smanjuje indeks. Time se smanjuje i broj usporedbi.

Pomakni naprijed:

U ovoj metodi mijenjamo element pretraživanja na 0. indeks. Jer ako se ponovno pretražuje, možemo ga pronaći u vremenu O(1).

Pomaknite se naprijed u linearnom pretraživanju

Primjena algoritma linearnog pretraživanja

Evo nekoliko aplikacija za linearno pretraživanje koje možemo koristiti.

  • Za male nizove ili samo nekoliko elemenata na popisu, lakše je koristiti linearno pretraživanje.
  • Metoda linearnog pretraživanja može se koristiti u jednom ili višedimenzionalni nizovi ili druge strukture podataka.
  • Općenito, linearna pretraga je jednostavna i učinkovita za pretraživanje u "neuređenim" podacima. Lako možemo dohvatiti jedan podatak s danog nesređenog popisa.

Pitanja i odgovori

Linearno pretraživanje skenira neuređene popise značajki, male tablice pretraživanja i skupove oznaka tijekom predobrade podataka. AI cjevovodi često ga koriste za lociranje vrijednosti kada su podaci nesortirani ili premali da bi se opravdala izrada indeksa.

Da. AI asistenti mogu pisati linearno pretraživanje u Python, C++, ili Java iz jednostavnog opisa. Logika je jednostavna, pa su pogreške rijetke, ali ipak biste trebali testirati rubne slučajeve poput praznog niza ili nedostajućeg elementa.

Linearno pretraživanje provjerava svaki element u nizu i radi s nesortiranim podacima u vremenu O(n). Binarna pretraga više puta prepolovi sortirani niz u vremenu O(log n), što ga čini puno bržim za velike sortirane kolekcije.

Koristite linearno pretraživanje kada su podaci mali, nesortirani ili se često mijenjaju, budući da bi prvo sortiranje koštalo više od izravnog skeniranja. Također je prikladno za povezane liste i pretraživanja u jednom prolazu gdje slučajni pristup nije dostupan.

Sažmite ovu objavu uz: