Lineær søgning: Python, C++ Eksempel

⚡ Smart opsummering

Lineær søgning undersøger hvert element i en liste sekventielt, indtil målværdien er fundet, eller listen slutter. Denne metode kræver ingen sorterede data, fungerer i O(n) tid og passer effektivt til små eller uordnede samlinger.

  • 🔍 Kernemekanisme: Lineær søgning sammenligner målet med hvert element fra indeks nul, indtil et match returnerer dets position, eller scanningen slutter og returnerer -1.
  • 🇧🇷 Funktionsadfærd: Rutinen returnerer et indeks mellem 0 og n-1, når værdien er til stede, eller -1, når søgeelementet ikke er til stede i arrayet.
  • 💻 Code Implementeringer: Arbejde C++ og Python eksempler gennemløber et heltalsarray med et enkelt loop og udskriver indekset, hvor den søgte værdi vises.
  • 📊 Kompleksitethedsprofil: Tidskompleksiteten når O(n) i de værst tænkelige og gennemsnitlige tilfælde, O(1) i bedste fald, mens rumkompleksiteten forbliver O(n) samlet set.
  • 🚀 Optimeringsteknikker: Transponering og flytning foran omarrangerer ofte søgte nøgler fremad, hvilket reducerer sammenligninger på tværs af gentagne søgninger.

Lineær søgealgoritme

Hvad er søgealgoritme?

En søgealgoritme er designet til at finde et element eller objekt fra en samling af elementer eller objekter med en given datastruktur. For eksempel kan man søge efter minimumshøjden fra en given liste over højder, eller søge efter det højeste mærke fra en liste eller et array af tal. Nogle populære søgealgoritmer inkluderer "Lineær søgning", "Binær søgning", "Jump-søgning", "Fibonacci-søgning" osv.

Hvad er lineær søgning?

Lineær søgning er en af ​​de enkleste søgealgoritmer. Fra en given liste eller et given array søger den efter det givne element ét efter ét. Lineær søgning itererer over hele listen og kontrollerer, om et bestemt element er lig med søgeelementet. Det kaldes også sekventiel søgning.

Hvad gør lineær søgefunktion?

En matrix af heltal er givet som "Numbers," og en variabel "item" indeholder det heltal, der skal søges i.

Nu kan den lineære søgealgoritme give følgende output:

  • "-1"; dette betyder, at det givne element ikke findes i arrayet.
  • Ethvert tal mellem 0 og n-1; betyder, at søgeelementet er fundet, og det returnerer indekset for elementet på arrayet. Her repræsenterer "n" størrelsen af ​​arrayet.

Hvordan virker lineær søgning?

Lad os sige et array, der indeholder heltal. Opgaven er at finde et givet tal i arrayet.

  • Hvis tallet er placeret i arrayet, skal vi returnere indekset for dette tal.
  • Hvis det givne tal ikke findes, vil det returnere -1.

I rutediagrammet er "Data" heltalsarrayet, "N" er størrelsen på arrayet, og "elementet" er det nummer, vi ønsker at søge i arrayet.

Flowchart for lineær søgealgoritme:

Flowchart for lineær søgealgoritme

Her er trinene i rutediagrammet:

Trin 1) Læs søgepunktet, "vare".

Trin 2) Initier i=0 og indeks=-1.

Trin 3) Hvis jeg

Trin 4) Hvis Data[i] er lig med "element", så gå til trin 5. Ellers gå til trin 6.

Trin 5) Indeks = i (Da elementet findes ved indeks nr. i). Gå til trin 8.

Trin 6) i = i +1.

Trin 7) Gå til trin 3.

Trin 8) Stop.

For nemheds skyld giver vi et eksempel med en række heltal. Lineær søgning er også anvendelig i strengen, en række objekter eller strukturen.

Kaldenavn Code til sekventiel søgealgoritme

Følgende pseudokode indfanger logikken i den lineære søgning beskrevet ovenfor. Den gennemgår arrayet fra det første indeks og returnerer positionen ved et match, ellers returnerer den -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 Eksempel på lineær søgning

Her er en komplet C++ program, der implementerer den sekventielle søgning og udskriver indekset for den søgte værdi.

#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;
    }
}

Output:

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

Python Code Eksempel på lineær søgning

Den samme logik i Python bruger et enkelt loop over listeindekserne og returnerer positionen af ​​det matchede element.

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

Output:

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

Kompleksitetsanalyse af lineær søgealgoritme

Generelt betyder tidskompleksitet den mængde CPU-tid, det tager at udføre en bestemt opgave. I den lineære søgealgoritme er opgaven at finde søgenøglen ud fra elementerne i arrayet.

Tre typer tidskompleksiteter er:

  • Værste tilfælde
  • Bedste Case Scenario
  • Gennemsnitligt tilfælde

Tidskompleksitet af lineær søgning i Worst-Case Scenario:

Lad os sige, at vi skal udføre en lineær søgning i et array med størrelsen "n". Vi kan finde søgeelementet mellem indeks 0 og n-1. I værste fald vil algoritmen forsøge at matche alle elementerne fra arrayet med søgeelementet.

I så fald vil den værst tænkelige kompleksitet være O(n). Her betyder "O" — stor O-notation — kompleksitetsfunktionen.

Tidskompleksitet af lineær søgning i Bedste-Case Scenario:

Lad os sige, at vi søger efter et element, der befinder sig i den første position i arrayet. I dette scenarie vil den lineære søgealgoritme ikke søge efter alle n elementer i arrayet. Så kompleksiteten vil være O(1). Det betyder konstant tid.

Tidskompleksitet af lineær søgning i gennemsnitsscenarie:

Når et element findes ved det midterste indeks af arrayet, så kan man sige, at den gennemsnitlige sagskompleksitet for lineær søgning er O(N), hvor N betyder længden af ​​arrayet.

Rumkompleksiteten af ​​den lineære søgealgoritme:

Rumkompleksiteten for den lineære søgning er altid O(N), fordi vi ikke behøver at gemme eller bruge nogen form for midlertidig variabel i den lineære søgefunktion.

Sådan forbedres lineær søgealgoritme

Søgning kan udføres flere gange i løbet af programmets livscyklus. Det er også muligt, at vi kører den lineære søgealgoritme og søger efter en specifik nøgle flere gange. Vi kan bruge "Binær søgealgoritme” hvis arrayet er et sorteret array.

Antag, at arrayet består af 10 tusinde numre, og at målelementet findes ved det 5000. indeks. Så algoritmen vil forsøge at sammenligne 5000 elementer. Nu er sammenligninger CPU-tunge opgaver. For at optimere den lineære søgealgoritme har vi to muligheder.

  • Transponering
  • Flyt til fronten

Omrokering:

I denne metode bytter vi søgeelementet ud med dets forrige element i arrayet. Lad os for eksempel sige, at du har et array som det følgende:

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

Nu vil vi søge efter 4. Transponeringstrin:

Transponering i lineær søgning

Trin 1) "4" findes i indeks 6. Det krævede seks sammenligninger.

Trin 2) Byt data[6] og data[5]. Så vil dataarrayet se sådan ud:

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

Trin 3) Søg 4 igen. Fundet ved indeks 5. Denne gang tog det fem sammenligninger.

Trin 4) Byt om på data[5] og data[4]. Datamatrixen vil så se sådan ud:

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

Hvis du bemærker det, jo oftere en nøgle søges, desto mere mindskes indekset. Dermed mindskes antallet af sammenligninger.

Flyt til fronten:

I denne metode bytter vi søgeelementet til det 0. indeks. Fordi hvis det søges igen, kan vi finde det på O(1) tidspunktet.

Flyt til fronten i lineær søgning

Anvendelse af lineær søgealgoritme

Her er nogle lineære søgeapplikationer, vi kan bruge.

  • For små arrays eller kun få elementer på listen er det nemmere at bruge lineær søgning.
  • Lineær søgemetode kan bruges i enkelt eller multidimensionelle arrays eller andre datastrukturer.
  • Generelt er lineær søgning enkel og effektiv til at udføre en søgning i de "uordnede" data. Vi kan nemt hente en enkelt data fra den givne uordnede liste.

Ofte Stillede Spørgsmål

Lineær søgning scanner uordnede funktionslister, små opslagstabeller og etiketsæt under dataforbehandling. AI-pipelines bruger det ofte til at finde en værdi, når dataene er usorterede eller for små til at retfærdiggøre opbygningen af ​​et indeks.

Ja. AI-assistenter kan skrive lineær søgning i Python, C++ eller Java ud fra en simpel beskrivelse. Logikken er simpel, så fejl er sjældne, men du bør stadig teste kanttilfælde såsom et tomt array eller et manglende element.

Lineær søgning kontrollerer hvert element i rækkefølge og arbejder på usorterede data i O(n) tid. Binær søgning halverer gentagne gange et sorteret array i O(log n) tid, hvilket gør det langt hurtigere for store sorterede samlinger.

Brug lineær søgning, når dataene er små, usorterede eller ofte ændrer sig, da først at sortere ville koste mere end en direkte scanning. Det er også velegnet til linkede lister og single-pass-søgninger, hvor tilfældig adgang ikke er tilgængelig.

Opsummer dette indlæg med: