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.

ล 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.
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.
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
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:
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
OVDJE,
- Definira funkciju hash_key koja prihvaฤa parametre key i m.
- Koristi jednostavnu operaciju modula za odreฤivanje hash vrijednosti
- Definira varijablu m koja je inicijalizirana na vrijednost 7. Ovo je veliฤina naลกe hash tablice
- Izraฤunava i ispisuje hash vrijednost 3
- Izraฤunava i ispisuje hash vrijednost 2
- Izraฤunava i ispisuje hash vrijednost 9
- Izraฤunava i ispisuje hash vrijednost 11
- 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)
OVDJE,
- Definira varijablu rjeฤnika zaposlenik. Naziv kljuฤa koristi se za pohranu vrijednosti John Doe, dob pohranjuje 36, a pozicija pohranjuje vrijednost Business Manager.
- Dohvaฤa vrijednost naziva kljuฤa i ispisuje je u terminalu
- Aลพurira vrijednost kljuฤne pozicije na vrijednost Software Engineer
- Ispisuje vrijednosti naziva i poloลพaja tipki
- Briลกe sve vrijednosti koje su pohranjene u naลกoj varijabli rjeฤnika zaposlenik
- 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.






