Lineaarinen haku: Python, C++ esimerkki

Mikä on hakualgoritmi?

Hakualgoritmi on suunniteltu etsimään elementti tai objekti kokoelmasta elementtejä tai objekteja, joilla on tietty tietorakenne. Voit esimerkiksi etsiä vähimmäiskorkeutta tietystä korkeusluettelosta tai etsiä korkeinta arvoa luettelosta tai lukujoukosta. Muutamia suosittuja hakualgoritmeja ovat "Lineaarinen haku", "Binaarihaku", "Jump Search", "Fibonacci Search" jne.

Mikä on lineaarinen haku?

Lineaarinen haku on yksi yksinkertaisimmista hakualgoritmeista. Tietystä luettelosta tai taulukosta se etsii tiettyä elementtiä yksitellen. Lineaarinen haku toistuu koko luettelossa ja tarkistaa, vastaako jokin tietty elementti hakuelementin kanssa. Sitä kutsutaan myös peräkkäinen haku.

Mitä lineaarinen hakutoiminto tekee?

Kokonaislukujen joukko annetaan muodossa "Numbers”, ja muuttuja ”item” sisältää haettavan kokonaisluvun.

Lineaarinen hakualgoritmi voi nyt tarjota seuraavan tuloksen:

  • "-1"; tämä tarkoittaa, että annettua elementtiä ei löydy taulukosta
  • Mikä tahansa luku väliltä 0 - n-1; tarkoittaa, että hakuelementti löytyy, ja se palauttaa taulukossa olevan elementin indeksin. Tässä "n" edustaa taulukon kokoa.

Kuinka lineaarinen haku toimii?

Oletetaan taulukko, joka sisältää kokonaislukuja. Tehtävänä on löytää taulukosta tietty numero.

  • Jos numero sijaitsee taulukossa, meidän on palautettava kyseisen luvun indeksi.
  • Jos annettua numeroa ei löydy, se palauttaa -1.

Vuokaaviossa "Data" on kokonaislukutaulukko, "N" on taulukon koko ja "tuote" on numero, jonka haluamme etsiä taulukosta.

Lineaarisen hakualgoritmin vuokaavio:

Lineaarisen hakualgoritmin vuokaavio

Tässä ovat vuokaavion vaiheet:

Vaihe 1) Lue hakukohde "tuote".

Vaihe 2) Aloita i=0 ja index=-1

Vaihe 3) Jos minä

Vaihe 4) Jos Data[i] on yhtä kuin "tuote", siirry vaiheeseen 5. Muussa tapauksessa siirry vaiheeseen 6.

Vaihe 5) Indeksi = i (Koska kohde löytyy indeksistä nro i). Siirry vaiheeseen 8.

Vaihe 6) i = i +1.

Vaihe 7) Siirry vaiheeseen 3.

Vaihe 8) Lopeta.

Yksinkertaisuuden vuoksi tarjoamme esimerkin, jossa on joukko kokonaislukuja. Lineaarihakua voidaan käyttää myös merkkijonossa, objektijoukossa tai rakenteessa.

Pseudokoodi peräkkäiselle hakualgoritmille

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 negative index is not valid
return -1

C++ Koodiesimerkki Lineaarinen haku

#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(arr[0]);
    int item;
    cout << "Enter a number to search: ";
    cin >> item;
    int idx = linearSearch(arr, item, n);
    if (idx >= 0) {
        cout << item << " is found at index " << idx << endl;
    } else {
        cout << "Could not find " << item << " in the array" << endl;
    }
}

lähtö:

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

Python Koodiesimerkki Lineaarinen haku

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))

lähtö:

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

Lineaarisen hakualgoritmin monimutkaisuusanalyysi

Yleisesti aikamonimutkaisuus tarkoittaa sitä, kuinka paljon suorittimen aikaa tietyn tehtävän suorittamiseen kuluu. Lineaarisessa hakualgoritmissa tehtävänä on löytää hakuavain taulukon elementistä.

Kolmen tyyppisiä aikakomplikaatioita ovat:

  • Pahimmassa tapauksessa
  • Paras tapaus
  • Keskimääräinen tapausskenaario

Lineaarisen haun aika monimutkaisuus pahimmassa mahdollisessa skenaariossa:

Oletetaan, että meidän on suoritettava lineaarinen haku taulukossa, jonka koko on “n”. Löydämme hakukohteen indeksien 0 ja n-1 välillä. Pahimmassa tapauksessa algoritmi yrittää sovittaa kaikki taulukon elementit hakuelementtiin.

Siinä tapauksessa pahimman tapauksen monimutkaisuus on O(n). Tässä "O"-iso O-merkintä tarkoittaa monimutkaisuusfunktiota.

Lineaarisen haun aika monimutkaisuus parhaassa tapauksessa:

Oletetaan, että etsimme elementtiä, joka sijaitsee taulukon ensimmäisessä paikassa. Tässä skenaariossa lineaarinen hakualgoritmi ei etsi kaikkia taulukon n elementtiä. Joten monimutkaisuus on O(1). Tämä tarkoittaa jatkuvaa aikaa.

Aika Lineaarisen haun monimutkaisuus keskimääräisessä tapauksessa:

Kun elementti löytyy taulukon keskiindeksistä, voidaan sanoa, että keskimääräinen tapausten kompleksisuus lineaarihaussa on O(N), missä N tarkoittaa taulukon pituutta.

Lineaarisen hakualgoritmin avaruuden monimutkaisuus

Lineaarihaun avaruuden monimutkaisuus on aina O(N), koska meidän ei tarvitse tallentaa tai käyttää mitään väliaikaista muuttujaa lineaarihakufunktiossa.

Lineaarisen hakualgoritmin parantaminen

Haku voidaan tehdä useita kertoja ohjelman elinkaaren aikana. On myös mahdollista, että käytämme lineaarista hakualgoritmia ja etsimme mitä tahansa tiettyä avainta useita kertoja. Voimme käyttää "Binäärihakualgoritmi", jos taulukko on lajiteltu matriisi.

Oletetaan, että taulukko koostuu 10 tuhannesta numerosta ja kohdeelementti löytyy 5000. indeksistä. Joten algoritmi yrittää vertailla 5000 elementtiä. Nyt vertailut ovat prosessoriraskaita tehtäviä. Lineaarisen hakualgoritmin optimoimiseksi meillä on kaksi vaihtoehtoa.

  • saattaminen osaksi
  • Siirrä Eteen

Transponointi:

Tässä menetelmässä vaihdamme hakuelementin sen edellisen elementin kanssa taulukossa. Oletetaan esimerkiksi, että sinulla on seuraavanlainen taulukko:

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

Nyt haluamme etsiä 4. Transponoinnin vaiheet:

Transponointi lineaarisessa haussa

Vaihe 1) "4" löytyy indeksistä 6. Vertailua tarvittiin kuusi.

Vaihe 2) Vaihda tiedot[6] ja tiedot[5]. Sitten datataulukko näyttää tältä:

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

Vaihe 3) Etsi 4 uudelleen. Löytyy indeksistä 5. Tällä kertaa vertailua tarvittiin viisi.

Vaihe 4) Vaihda tiedot [5] ja tiedot[4]. Sitten datataulukko näyttää tältä:

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

Jos nyt huomaat, mitä useammin avainta etsitään, sitä enemmän se pienentää indeksiä. Näin ollen vertailujen määrä vähenee.

Siirry eteen:

Tässä menetelmässä vaihdamme hakuelementin 0. indeksissä. Koska jos sitä etsitään uudelleen, voimme löytää sen O(1) aikaan.

Siirry etupuolelle lineaarisessa haussa

Lineaarisen hakualgoritmin soveltaminen

Tässä on joitain lineaarisia hakusovelluksia, joita voimme käyttää.

  • Pienikokoisille taulukoille tai vain muutamalle listan elementille on helpompi käyttää lineaarihakua.
  • Lineaarista hakumenetelmää voidaan käyttää yksittäisessä tai moniulotteisia taulukoita tai muita tietorakenteita.
  • Yleensä lineaarinen haku on yksinkertainen ja tehokas haun suorittamiseen "järjestämättömästä" tiedosta. Voimme hakea yksittäisen tiedon annetusta järjestämättömästä luettelosta helposti.