Hash tablica u strukturi podataka: Python Primjer

โšก Pametni saลพetak

Hash tablica u strukturama podataka pohranjuje vrijednosti kao parove kljuฤ-vrijednost, koristeฤ‡i hash funkciju za mapiranje svakog kljuฤa u indeks za brzo pretraลพivanje. Ovaj resurs objaลกnjava hash funkcije, kolizije, ulanฤavanje, ispitivanje, operacije i Python primjeri ukljuฤujuฤ‡i ugraฤ‘eni rjeฤnik.

  • ๐Ÿ”‘ Osnovna ideja: Hash tablica pohranjuje parove kljuฤ-vrijednost, gdje hash funkcija pretvara svaki kljuฤ u indeks polja.
  • ๐Ÿงฎ Hash funkcija: Uobiฤajena formula koristi operator modula, h(k) = k % m, kako bi kljuฤevi ostali unutar veliฤine tablice.
  • ๐Ÿ’ฅ Sudari: Kada se dva kljuฤa mapiraju na isti indeks, ulanฤavanje ili ispitivanje rjeลกava sukob.
  • โšก Performance: Prosjeฤno vrijeme pretraลพivanja, umetanja i brisanja u hash tablici je O(1) bez obzira na veliฤinu skupa podataka.
  • ๐Ÿ Python Primjer: Ugraฤ‘eni tip rjeฤnika je hash tablica koja automatski upravlja hashiranjem i kolizijama.

ล to je hashiranje?

Hash je vrijednost fiksne duljine, a generira se pomoฤ‡u matematiฤke formule. Hash vrijednosti se koriste u kompresiji podataka, kriptologiji, itd. U indeksiranju podataka, hash vrijednosti se koriste jer imaju fiksnu duljinu bez obzira na vrijednosti koje su koriลกtene za njihovo generiranje. ฤŒini da hash vrijednosti zauzimaju minimalan prostor u usporedbi s drugim vrijednostima razliฤitih duljina.

Rasprลกivanje koristi matematiฤki algoritam za pretvaranje kljuฤa u rasprลกivanje. Do sudara dolazi kada hash funkcija proizvede istu hash vrijednost za viลกe od jednog kljuฤa.

ล to je hash tablica?

A HASH TABLICA je podatkovna struktura koja pohranjuje vrijednosti koristeฤ‡i par kljuฤeva i vrijednosti. Svakoj vrijednosti dodijeljen je jedinstveni kljuฤ koji se generira pomoฤ‡u hash funkcije.

Ime kljuฤa koristi se za pristup pridruลพenoj vrijednosti. To ฤini pretraลพivanje vrijednosti u hash tablici vrlo brzim, bez obzira na broj stavki u hash tablici.

Hash funkcije

Na primjer, ako ลพelimo pohraniti evidenciju zaposlenika, a svaki zaposlenik je jedinstveno identificiran pomoฤ‡u broja zaposlenika.

Moลพemo koristiti broj zaposlenika kao kljuฤ i dodijeliti podatke o zaposleniku kao vrijednost.

Gornji pristup ฤ‡e zahtijevati dodatni slobodni prostor reda veliฤine (m * n2) gdje je varijabla m veliฤina poredak, a varijabla n je broj znamenki za broj zaposlenika. Ovaj pristup uvodi problem skladiลกnog prostora.

Hash funkcija rjeลกava gore navedeni problem dobivanjem broja zaposlenika i njegovim koriลกtenjem za generiranje hash cjelobrojne vrijednosti, fiksnih znamenki i optimiziranje prostora za pohranu. Svrha hash funkcije je stvaranje kljuฤa koji ฤ‡e se koristiti za referenciranje vrijednosti koju ลพelimo pohraniti. Funkcija prihvaฤ‡a vrijednost koju treba spremiti, a zatim koristi algoritam za izraฤun vrijednosti kljuฤa.

Slijedi primjer jednostavne hash funkcije

h(k) = k1 % m

OVDJE,

  • h(k) je hash funkcija koja prihvaฤ‡a parametar k. Parametar k je vrijednost za koju ลพelimo izraฤunati kljuฤ.
  • k1 % m je algoritam za naลกu hash funkciju gdje je k1 vrijednost koju ลพelimo pohraniti, a m je veliฤina popisa. Za izraฤunavanje kljuฤa koristimo operator modula.

Primjer

Pretpostavimo da imamo popis s fiksnom veliฤinom 3 i sljedeฤ‡im vrijednostima

[1,2,3]

Moลพemo upotrijebiti gornju formulu za izraฤun pozicija koje svaka vrijednost treba zauzimati.

Sljedeฤ‡a slika prikazuje dostupne indekse u naลกoj hash tablici.

Hash funkcije

Korak 1) Izraฤunajte poziciju koju ฤ‡e zauzeti prva vrijednost ovako

h(1) = 1 % 3

= 1

Vrijednost 1 ฤ‡e zauzeti prostor na indeks 1

Korak 2) Izraฤunajte poziciju koju ฤ‡e zauzeti druga vrijednost

h(2) = 2 % 3

= 2

Vrijednost 2 ฤ‡e zauzeti prostor na indeks 2

Korak 3) Izraฤunajte poziciju koju ฤ‡e zauzeti treฤ‡a vrijednost.

h(3) = 3 % 3

= 0

Vrijednost 3 ฤ‡e zauzeti prostor na indeks 0

Konaฤni rezultat

Naลกa ispunjena hash tablica sada ฤ‡e biti sljedeฤ‡a.

Hash funkcije

Kvalitete dobre hash funkcije

Dobra hash funkcija trebala bi imati sljedeฤ‡e kvalitete.

  • Formula za generiranje hasha trebala bi koristiti vrijednost podataka koja se pohranjuje u algoritam.
  • Funkcija rasprลกivanja treba generirati jedinstvene vrijednosti rasprลกivanja ฤak i za ulazne podatke koji imaju istu koliฤinu.
  • Funkcija bi trebala minimizirati broj kolizija. Do sudara dolazi kada se ista vrijednost generira za viลกe od jedne vrijednosti.
  • Vrijednosti moraju biti dosljedno rasporeฤ‘ene na sve moguฤ‡e hash vrijednosti.

Sudar

Do sudara dolazi kada algoritam generira isti hash za viลกe od jedne vrijednosti.

Pogledajmo primjer.

Pretpostavimo da imamo sljedeฤ‡i popis vrijednosti

[3,2,9,11,7]

Pretpostavimo da je veliฤina hash tablice 7, a mi ฤ‡emo koristiti formulu (k1 % m) gdje je m veliฤina hash tablice.

Sljedeฤ‡a tablica prikazuje hash vrijednosti koje ฤ‡e se generirati.

Kljuฤ Hash algoritam (k1 % m) Rasprลกena vrijednost
3 3 % 7 3
2 2 % 7 2
9 9 % 7 2
11 11 % 7 4
7 7 % 7 0

Kao ลกto moลพemo vidjeti iz gornjih rezultata, vrijednosti 2 i 9 imaju istu hash vrijednost i ne moลพemo pohraniti viลกe od jedne vrijednosti na svakoj poziciji.

Zadani problem moลพe se rijeลกiti ulanฤavanjem ili ispitivanjem. Sljedeฤ‡i odjeljci detaljno govore o ulanฤavanju i ispitivanju.

Ulanฤavanje

Ulanฤavanje je tehnika koja se koristi za rjeลกavanje problema kolizije koriลกtenjem povezanih popisa od kojih svaki ima jedinstvene indekse.

Sljedeฤ‡a slika vizualizira kako izgleda lanฤana lista

Ulanฤavanje

I 2 i 9 zauzimaju isti indeks, ali su pohranjeni kao povezani popisi. Svaki popis ima jedinstveni identifikator.

Prednosti lanฤanih popisa

Sljedeฤ‡e su prednosti lanฤanih popisa:

  • Lanฤane liste imaju bolje performanse pri umetanju podataka jer je redoslijed umetanja O(1).
  • Nije potrebno mijenjati veliฤinu hash tablice koja koristi ulanฤani popis.
  • Moลพe lako primiti veliki broj vrijednosti sve dok ima slobodnog prostora.

Sondiranje

Druga tehnika koja se koristi za rjeลกavanje sudara je sondiranje. Kada koristimo metodu sondiranja, ako doฤ‘e do sudara, moลพemo jednostavno krenuti dalje i pronaฤ‡i prazan utor za pohranu naลกe vrijednosti.

Sljedeฤ‡e su metode sondiranja:

naฤin Description
Linearno sondiranje Baลก kao ลกto naziv sugerira, ova metoda traลพi prazne utore linearno poฤevลกi od pozicije gdje je doลกlo do sudara i kreฤ‡e se prema naprijed. Ako se dosegne kraj popisa i nije pronaฤ‘en nijedan prazan utor. Ispitivanje poฤinje na poฤetku popisa.
Kvadratno ispitivanje Ova metoda koristi izraze kvadratnog polinoma za pronalaลพenje sljedeฤ‡eg slobodnog mjesta.
Double rasprลกivanje Ova tehnika koristi sekundarni algoritam hash funkcije za pronalaลพenje sljedeฤ‡eg slobodnog dostupnog mjesta.

Koristeฤ‡i naลก gornji primjer, hash tablica nakon koriลกtenja sondiranja izgledala bi ovako:

Sondiranje

Operacije s hash tablicom

Ovdje su Operacije koje podrลพavaju Hash tablice:

  • Umetanje - ovo Operation se koristi za dodavanje elementa u hash tablicu
  • Pretraลพivanje - ovo Operation se koristi za traลพenje elemenata u hash tablici pomoฤ‡u kljuฤa
  • Brisanje - ovo Operation se koristi za brisanje elemenata iz hash tablice

Operacija umetanja podataka

Operacija umetanja koristi se za pohranjivanje vrijednosti u hash tablicu. Kada se nova vrijednost pohranjuje u hash tablicu, dodjeljuje joj se indeksni broj. Indeksni broj izraฤunava se pomoฤ‡u hash funkcije. Funkcija rasprลกivanja rjeลกava sve kolizije do kojih doฤ‘e prilikom izraฤunavanja broja indeksa.

Traลพenje podatkovne operacije

Operacija pretraลพivanja koristi se za traลพenje vrijednosti u hash tablici pomoฤ‡u broja indeksa. Operacija pretraลพivanja vraฤ‡a vrijednost koja je povezana s brojem indeksa pretraลพivanja. Na primjer, ako pohranimo vrijednost 6 pod indeksom 2, operacija pretraลพivanja s indeksom broj 2 vratit ฤ‡e vrijednost 6.

Operacija brisanja podataka

Operacija brisanja koristi se za uklanjanje vrijednosti iz hash tablice. Za brisanje Operacija se vrลกi pomoฤ‡u broja indeksa. Nakon ลกto je vrijednost izbrisana, indeksni broj postaje slobodan. Moลพe se koristiti za pohranjivanje drugih vrijednosti pomoฤ‡u operacije umetanja.

Implementacija hash tablice sa Python Primjer

Pogledajmo jednostavan primjer koji izraฤunava hash vrijednost kljuฤa

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Hash tablica Code Objaลกnjenje

Hash tablica Code Objaลกnjenje

OVDJE,

  1. Definira funkciju hash_key koja prihvaฤ‡a parametre key i m.
  2. Koristi jednostavnu operaciju modula za odreฤ‘ivanje hash vrijednosti
  3. Definira varijablu m koja je inicijalizirana na vrijednost 7. Ovo je veliฤina naลกe hash tablice
  4. Izraฤunava i ispisuje hash vrijednost 3
  5. Izraฤunava i ispisuje hash vrijednost 2
  6. Izraฤunava i ispisuje hash vrijednost 9
  7. Izraฤunava i ispisuje hash vrijednost 11
  8. Izraฤunava i ispisuje hash vrijednost 7

Izvrลกenje gornjeg koda daje sljedeฤ‡e rezultate.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Python Primjer rjeฤnika

Python dolazi s ugraฤ‘enim tipom podataka pod nazivom Rjeฤnik. Rjeฤnik je primjer hash tablice. Pohranjuje vrijednosti koristeฤ‡i par kljuฤeva i vrijednosti. Vrijednosti rasprลกivanja automatski se generiraju za nas, a sve kolizije rjeลกavaju se za nas u pozadini.

Sljedeฤ‡i primjer pokazuje kako moลพete koristiti tip podataka rjeฤnika u piton 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Python Primjer rjeฤnika

OVDJE,

  1. Definira varijablu rjeฤnika zaposlenik. Naziv kljuฤa koristi se za pohranu vrijednosti John Doe, dob pohranjuje 36, a pozicija pohranjuje vrijednost Business Manager.
  2. Dohvaฤ‡a vrijednost naziva kljuฤa i ispisuje je u terminalu
  3. Aลพurira vrijednost kljuฤne pozicije na vrijednost Software Engineer
  4. Ispisuje vrijednosti naziva i poloลพaja tipki
  5. Briลกe sve vrijednosti koje su pohranjene u naลกoj varijabli rjeฤnika zaposlenik
  6. Ispisuje vrijednost zaposlenika

Pokretanje gornjeg koda daje sljedeฤ‡e rezultate.

The name of the employee is John Doe.
The position of John Doe is a Software Engineer.
{}

Analiza sloลพenosti

Hash tablice imaju prosjeฤnu vremensku sloลพenost od O (1) u najboljem sluฤaju. Vremenska sloลพenost u najgorem sluฤaju je O(n). Najgori scenarij dogaฤ‘a se kada mnoge vrijednosti generiraju isti hash kljuฤ, a mi moramo rijeลกiti koliziju ispitivanjem.

Prijave iz stvarnog svijeta

U stvarnom svijetu, hash tablice se koriste za pohranu podataka za

  • Baze podataka
  • Asocijativni nizovi
  • Kompleti
  • Predmemorija memorije

Prednosti hash tablica

Ovdje su prednosti/prednosti koriลกtenja hash tablica:

  • Hash tablice imaju visoku izvedbu pri traลพenju podataka, umetanju i brisanju postojeฤ‡ih vrijednosti.
  • Vremenska sloลพenost za hash tablice je konstantna bez obzira na broj stavki u tablici.
  • Rade vrlo dobro ฤak i kada rade s velikim skupovima podataka.

Nedostaci hash tablica

Evo nedostataka upotrebe hash tablica:

  • Ne moลพete koristiti vrijednost null kao kljuฤ.
  • Ne mogu se izbjeฤ‡i kolizije prilikom generiranja kljuฤeva koriลกtenjem. hash funkcije. Do sudara dolazi kada se generira kljuฤ koji je veฤ‡ u upotrebi.
  • Ako funkcija rasprลกivanja ima mnogo kolizija, to moลพe dovesti do smanjenja izvedbe.

Pitanja i odgovori

Niz koristi sekvencijalne cjelobrojne indekse, pa pronalaลพenje elementa po vrijednosti znaฤi skeniranje. Hash tablica preslikava bilo koji kljuฤ u indeks putem hash funkcije, dajuฤ‡i prosjeฤno O(1) pretraลพivanje, umetanje i brisanje bez obzira na veliฤinu.

Faktor optereฤ‡enja je omjer pohranjenih unosa i ukupnog broja mjesta u hash tablici. Visok faktor optereฤ‡enja poveฤ‡ava kolizije i usporava operacije, pa mnoge implementacije mijenjaju veliฤinu i ponovno hashiraju nakon ลกto faktor optereฤ‡enja prijeฤ‘e prag.

Ulanฤavanje pohranjuje kolizirajuฤ‡e kljuฤeve u povezane liste na svakom utoru, tako da tablica moลพe sadrลพavati viลกe stavki nego utora. Otvoreno adresiranje (ispitivanje) drลพi sve unose unutar polja, traลพeฤ‡i sljedeฤ‡i slobodni utor. Ulanฤavanje bolje podnosi veliko optereฤ‡enje.

Haลกiranje podrลพava umjetnu inteligenciju putem haลกiranja znaฤajki ili trika haลกiranja, koji mapira velike tekstualne ili kategoriฤke znaฤajke u vektor fiksne veliฤine. To ลกtedi memoriju i ubrzava uฤenje, iako sudari haลกiranja mogu spojiti razliฤite znaฤajke.

Da. Umjetna inteligencija moลพe predloลพiti dizajn hash funkcija, testirati ih na ravnomjernu distribuciju i procijeniti stope sudara na uzorku podataka. Pomaลพe u usporedbi opcija, ali ipak biste trebali usporediti funkciju sa stvarnim radnim optereฤ‡enjem prije nego ลกto je usvojite.

Saลพmite ovu objavu uz: