Lineární vyhledávání: Python, C++ Příklad

⚡ Chytré shrnutí

Lineární vyhledávání prověřuje každý prvek seznamu postupně, dokud není nalezena cílová hodnota nebo dokud seznam neskončí. Tato metoda nevyžaduje žádná seřazená data, pracuje v čase O(n) a efektivně se hodí pro malé nebo neuspořádané kolekce.

  • 🔍 Základní mechanismus: Lineární vyhledávání porovnává cíl s každým prvkem od indexu nula, dokud shoda nevrátí jeho pozici, nebo dokud skenování nevrací -1.
  • ⚙️ Chování funkce: Rutina vrací index mezi 0 a n-1, pokud je hodnota přítomna, nebo -1, pokud hledaný prvek v poli chybí.
  • 💻 Code Implementace: Pracovní C++ a Python Příklady procházejí celočíselným polem jednou smyčkou a vypisují index, kde se hledaná hodnota objevuje.
  • 📊 Profil složitosti: Časová složitost dosahuje v nejhorším a průměrném případě O(n), v nejlepším případě O(1), zatímco prostorová složitost celkově zůstává O(n).
  • ???? Optimalizační techniky: Transpozice a přesun dopředu mění pořadí často vyhledávaných klíčů směrem dopředu, čímž se snižuje počet porovnávání při opakovaném hledání.

Lineární vyhledávací algoritmus

Co je vyhledávací algoritmus?

Vyhledávací algoritmus je navržen tak, aby našel prvek nebo objekt z kolekce prvků nebo objektů s danou datovou strukturou. Například hledá minimální výšku z daného seznamu výšek nebo hledá nejvyšší hodnotu ze seznamu nebo pole čísel. Mezi několik populárních vyhledávacích algoritmů patří „lineární vyhledávání“, „binární vyhledávání“, „skokové vyhledávání“, „Fibonacciho vyhledávání“ atd.

Co je lineární vyhledávání?

Lineární vyhledávání je jeden z nejjednodušších vyhledávacích algoritmů. Z daného seznamu nebo pole hledá daný prvek jeden po druhém. Lineární vyhledávání iteruje celým seznamem a kontroluje, zda je nějaký konkrétní prvek shodný s hledaným prvkem. Nazývá se také sekvenční vyhledávání.

Co dělá funkce lineárního vyhledávání?

Pole celých čísel je uvedeno jako „Numbers,“ a proměnná „item“ obsahuje celé číslo, které se má hledat.

Nyní může algoritmus lineárního vyhledávání poskytnout následující výstup:

  • „-1“; to znamená, že daný prvek se v poli nenachází.
  • Libovolné číslo mezi 0 až n-1; znamená, že vyhledávací prvek je nalezen a vrací index prvku v poli. Zde „n“ představuje velikost pole.

Jak funguje lineární vyhledávání?

Řekněme, že máme pole obsahující celá čísla. Úkolem je najít v tomto poli dané číslo.

  • Pokud se číslo nachází v poli, musíme vrátit index tohoto čísla.
  • Pokud se dané číslo nenajde, vrátí -1.

Ve vývojovém diagramu je „Data“ celočíselné pole, „N“ je velikost pole a „položka“ je číslo, které chceme v poli hledat.

Vývojový diagram pro lineární vyhledávací algoritmus:

Vývojový diagram pro lineární vyhledávací algoritmus

Zde jsou kroky vývojového diagramu:

Krok 1) Přečtěte si hledanou položku „položka“.

Krok 2) Inicializujte i=0 a index=-1.

Krok 3) Kdybych

Krok 4) Pokud se Data[i] rovná „položke“, přejděte ke kroku 5. Jinak přejděte ke kroku 6.

Krok 5) Index = i (Protože se položka nachází na indexu č. i). Přejděte ke kroku 8.

Krok 6) i = i +1.

Krok 7) Přejděte na krok 3.

Krok 8) Přestaň.

Pro jednoduchost uvádíme příklad s polem celých čísel. Lineární vyhledávání je také použitelné v řetězci, poli objektů nebo struktuře.

Nepravý Code pro algoritmus sekvenčního vyhledávání

Následující pseudokód zachycuje logiku výše popsaného lineárního vyhledávání. Prochází pole od prvního indexu a vrací pozici v případě shody, jinak vrací -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 Příklad lineárního vyhledávání

Zde je kompletní C++ program, který implementuje sekvenční vyhledávání a vypíše index hledané hodnoty.

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

Výstup:

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

Python Code Příklad lineárního vyhledávání

Stejná logika v Python používá jednu smyčku přes indexy seznamu a vrací pozici odpovídajícího prvku.

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

Výstup:

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

Analýza složitosti lineárního vyhledávacího algoritmu

Časová složitost obecně znamená množství času CPU potřebného k provedení určité úlohy. V algoritmu lineárního vyhledávání je úkolem najít klíč k vyhledávání z prvků pole.

Existují tři typy časové složitosti:

  • Scénář nejhoršího případu
  • Nejlepší případový scénář
  • Průměrný případový scénář

Časová složitost lineárního vyhledávání ve scénáři nejhoršího případu:

Řekněme, že potřebujeme provést lineární vyhledávání v poli o velikosti „n“. Hledaný prvek můžeme najít v rozmezí indexů 0 až n-1. V nejhorším případě se algoritmus pokusí najít všechny prvky z pole odpovídající hledanému prvku.

V takovém případě bude nejhorší případ složitosti O(n). Zde „O“ – velké O – znamená funkci složitosti.

Časová složitost lineárního vyhledávání v nejlepším scénáři:

Řekněme, že hledáme prvek, který se nachází na první pozici pole. V tomto scénáři lineární vyhledávací algoritmus neprohledá všech n prvků v poli. Složitost tedy bude O(1). To znamená konstantní čas.

Časová složitost lineárního vyhledávání v průměrném scénáři:

Když je prvek nalezen na středním indexu pole, pak lze říci, že průměrná složitost případu pro lineární vyhledávání je O(N), kde N znamená délku pole.

Prostorová složitost lineárního vyhledávacího algoritmu:

Prostorová složitost pro lineární vyhledávání je vždy O(N), protože v lineární vyhledávací funkci nemusíme ukládat ani používat žádnou dočasnou proměnnou.

Jak zlepšit lineární vyhledávací algoritmus

Vyhledávání lze provést několikrát během životního cyklu programu. Je také možné, že spouštíme lineární vyhledávací algoritmus a hledáme libovolný konkrétní klíč několikrát. Můžeme použít „Binární vyhledávací algoritmus” pokud je pole seřazené pole.

Předpokládejme, že pole se skládá z 10 tisíc čísel a cílový prvek se nachází na 5000. indexu. Algoritmus se tedy pokusí porovnat 5000 prvků. Nyní jsou srovnání úlohy náročné na CPU. Pro optimalizaci lineárního vyhledávacího algoritmu máme dvě možnosti.

  • Transpozice
  • Přesuňte se dopředu

Transpozice:

V této metodě prohodíme hledaný prvek s jeho předchozím prvkem v poli. Řekněme například, že máte pole podobné tomuto:

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

Nyní chceme hledat 4. Kroky transpozice:

Transpozice v lineárním vyhledávání

Krok 1) „4“ se nachází u indexu 6. Bylo potřeba šest srovnání.

Krok 2) Vyměňte data[6] a data[5]. Poté bude datové pole vypadat takto:

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

Krok 3) Hledejte znovu 4. Nalezeno na indexu 5. Tentokrát to vyžadovalo pět srovnání.

Krok 4) Prohoďte data[5] a data[4]. Datové pole pak bude vypadat takto:

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

Pokud si všimnete, čím častěji se klíč prohledává, tím více se snižuje index. Tím se snižuje počet porovnání.

Přesuňte se dopředu:

V této metodě prohodíme hledaný prvek na 0. index. Protože pokud se prohledá znovu, najdeme ho za O(1) čas.

Přesuňte se dopředu v lineárním vyhledávání

Aplikace lineárního vyhledávacího algoritmu

Zde jsou některé lineární vyhledávací aplikace, které můžeme použít.

  • Pro malá pole nebo pouze s několika prvky v seznamu je snazší použít lineární vyhledávání.
  • Metodu lineárního vyhledávání lze použít v jednoduchém resp vícerozměrná pole nebo jiné datové struktury.
  • Obecně je lineární vyhledávání jednoduché a efektivní pro provádění vyhledávání v „neuspořádaných“ datech. Z daného neuspořádaného seznamu můžeme snadno načíst jednotlivá data.

Nejčastější dotazy

Lineární vyhledávání prohledává neuspořádané seznamy funkcí, malé vyhledávací tabulky a sady popisků během předzpracování dat. Kanály umělé inteligence jej často používají k nalezení hodnoty, když jsou data netříděná nebo příliš malá na to, aby bylo nutné vytvořit index.

Ano. Asistenti s umělou inteligencí mohou psát lineární vyhledávání v Python, C++nebo Java z jednoduchého popisu. Logika je jednoduchá, takže chyby jsou vzácné, ale i tak byste měli testovat okrajové případy, jako je prázdné pole nebo chybějící prvek.

Lineární vyhledávání kontroluje každý prvek v pořadí a pracuje s netříděnými daty v čase O(n). Binární vyhledávání opakovaně rozpolcuje seřazené pole v čase O(log n), což výrazně zrychluje práci s velkými seřazenými kolekcemi.

Lineární vyhledávání použijte, pokud jsou data malá, netříděná nebo se často mění, protože první třídění by bylo dražší než přímé prohledávání. Je také vhodné pro propojené seznamy a jednorázové vyhledávání, kde není k dispozici náhodný přístup.

Shrňte tento příspěvek takto: