Strukture podataka i algoritmi

Vodič za strukturu podataka hash tablice

Vodič za strukturu podataka hash tablice
U računalnim znanostima riječ "karta" znači povezati stavku iz jednog skupa s drugom stavkom u drugom skupu. Zamislite da se na stranici nalaze riječi u krugu s lijeve strane, a s desne strane iste stranice nalazi se još jedan krug unutar kojeg postoje druge riječi. Pretpostavimo da su u svakom krugu riječi napisane nasumično, raštrkane unutar kruga. Također, pretpostavimo da se riječi u lijevom krugu nazivaju ključevima, a riječi u desnom krugu vrijednostima. Ako se iz svake riječi slijeva povuče strelica u svaku riječ s desne strane, tada bi se reklo da su tipke preslikane u vrijednosti.

Pretpostavite da ste vlasnik velike trgovine s namirnicama u okrugu u kojem živite. Pretpostavimo da živite na velikom području, koje nije komercijalno područje. Niste jedini koji imaju trgovinu namirnicama na tom području; imate nekoliko konkurenata. A onda vam padne na pamet da biste u bilježnicu trebali zabilježiti telefonske brojeve svojih kupaca. Naravno, vježbenica je mala i ne možete zabilježiti sve brojeve telefona za sve svoje kupce.

Stoga ste odlučili snimati samo telefonske brojeve svojih stalnih kupaca. I tako imate tablicu s dva stupca. Stupac s lijeve strane sadrži imena kupaca, a stupac s desne strane odgovarajući telefonski brojevi. Na taj način postoji mapiranje imena kupaca i telefonskih brojeva. Desni stupac tablice može se smatrati jezgrom hash tablice. Imena kupaca sada se zovu ključevi, a telefonski brojevi vrijednosti. Imajte na umu da kada kupac krene s prijenosom, morat ćete otkazati njegov redak, dopuštajući da redak bude prazan ili da se zamijeni s novim redovnim kupcem. Također imajte na umu da se s vremenom broj redovitih kupaca može povećati ili smanjiti, pa će stol moći rasti ili se smanjivati.

Kao još jedan primjer mapiranja, pretpostavimo da u županiji postoji klub poljoprivrednika. Naravno, neće svi poljoprivrednici biti članovi kluba. Neki članovi kluba neće biti redoviti članovi (uz prisustvo i doprinos). Bar-čovjek može odlučiti zabilježiti imena članova i njihov izbor pića. Razvija tablicu od dva stupca. U lijevu kolonu upisuje imena članova kluba. U desni stupac upisuje odgovarajući izbor pića.

Ovdje postoji problem: u desnom su stupcu duplikati. Odnosno, isto ime pića nalazi se više puta. Drugim riječima, različiti članovi piju isto slatko piće ili isto alkoholno piće, dok drugi članovi piju drugo slatko ili alkoholno piće. Čovjek sa šankom odlučuje riješiti ovaj problem umetanjem uskog stupca između dva stupca. U ovom srednjem stupcu, počevši od vrha, on broji retke koji počinju od nule (tj.e. 0, 1, 2, 3, 4 itd.), prema dolje, jedan indeks po retku. Ovim je riješen njegov problem, jer se ime člana sada preslikava na indeks, a ne na ime pića. Dakle, kako se piće identificira indeksom, ime kupca preslikava se u odgovarajući indeks.

Samo stupac vrijednosti (pića) čini osnovnu tablicu raspršivanja. U izmijenjenoj tablici stupac indeksa i njima pridružene vrijednosti (sa ili bez duplikata) čine normalnu hash tablicu - dolje je data potpuna definicija hash tablice. Tipke (prvi stupac) nisu nužno dio hash tablice.

Kao još jedan primjer, uzmimo mrežni poslužitelj na kojem korisnik sa svog klijentskog računala može dodati neke podatke, izbrisati neke podatke ili izmijeniti neke podatke. Postoji mnogo korisnika za poslužitelj.  Svako korisničko ime odgovara lozinci koja je pohranjena na poslužitelju. Oni koji održavaju poslužitelj mogu vidjeti korisnička imena i odgovarajuću lozinku te tako moći oštetiti rad korisnika.

Dakle, vlasnik poslužitelja odlučuje proizvesti funkciju koja šifrira lozinku prije nego što je pohranjena. Korisnik se prijavljuje na poslužitelj sa svojom normalno razumljivom lozinkom. Međutim, sada se svaka lozinka pohranjuje u šifriranom obliku. Ako netko vidi šifriranu lozinku i pokuša se prijaviti pomoću nje, to neće uspjeti, jer prijavom poslužitelj prima razumljivu lozinku, a ne šifriranu lozinku.

U ovom je slučaju razumljiva lozinka ključ, a šifrirana lozinka vrijednost. Ako se šifrirana lozinka nalazi u stupcu šifriranih lozinki, tada je taj stupac osnovna hash tablica. Ako tom stupcu prethodi drugi stupac s indeksima koji počinju od nule, tako da je svaka šifrirana lozinka povezana s indeksom, tada i stupac indeksa i stupac šifrirane lozinke čine normalnu tablicu raspršivanja. Tipke nisu nužno dio hash tablice.

U ovom slučaju imajte na umu da svaki ključ, koji je razumljiva lozinka, odgovara korisničkom imenu. Dakle, postoji korisničko ime koje odgovara ključu koji je preslikan u indeks, a koje je povezano s vrijednošću koja je šifrirani ključ.

Definicija hash funkcije, puna definicija hash tablice, značenje niza i drugi detalji dati su u nastavku. Morate imati znanje o pokazivačima (referencama) i povezanim popisima kako biste uvažili ostatak ovog vodiča.

Značenje Hash funkcije i Hash tablice

Polje

Niz je skup uzastopnih memorijskih mjesta. Sva su mjesta iste veličine. Vrijednosti na prvom mjestu pristupa se indeksom 0; vrijednosti na drugom mjestu pristupa se indeksom 1; trećoj se vrijednosti pristupa indeksom 2; četvrti s indeksom, 3; i tako dalje. Niz se normalno ne može povećati ili smanjiti. Da bi se promijenila veličina (duljina) niza, mora se stvoriti novi niz i kopirati odgovarajuće vrijednosti u novi niz. Vrijednosti niza su uvijek istog tipa.

Hash funkcija

U softveru, hash funkcija je funkcija koja uzima ključ i stvara odgovarajući indeks za ćeliju niza. Niz je fiksne veličine (fiksne duljine). Broj tipki je proizvoljne veličine, obično veći od veličine polja. Indeks koji proizlazi iz hash funkcije naziva se hash vrijednost ili sažetak ili hash kôd ili jednostavno hash.

Hash tablica

Hash tablica je niz s vrijednostima na čije se indekse preslikavaju ključevi. Tipke se neizravno preslikavaju na vrijednosti. Zapravo se kaže da se ključevi preslikavaju na vrijednosti, jer je svaki indeks povezan s vrijednošću (sa ili bez duplikata). Međutim, funkcija koja vrši mapiranje (tj.e. hashing) odnosi ključeve na indekse polja, a ne zapravo na vrijednosti, jer u vrijednostima mogu biti duplikati. Sljedeći dijagram ilustrira hash tablicu imena ljudi i njihovih telefonskih brojeva. Ćelije niza (utora) nazivaju se segmentima.

Primijetite da su neke kante prazne. Hash tablica ne mora nužno imati vrijednosti u svim svojim segmentima. Vrijednosti u segmentima ne moraju nužno biti u uzlaznom redoslijedu. Međutim, indeksi s kojima su povezani rastućim su redoslijedom. Strelice označavaju mapiranje. Primijetite da tipke nisu u polju. Ne moraju biti u bilo kojoj strukturi. Hash funkcija uzima bilo koji ključ i raspršuje indeks za niz. Ako u segmentu ne postoji vrijednost povezana s raspršenim indeksom, u taj segment može se staviti nova vrijednost. Logični odnos je između ključa i indeksa, a ne između ključa i vrijednosti pridružene indeksu.

Vrijednosti niza, poput vrijednosti ove hash tablice, uvijek su iste vrste podataka. Hash tablica (sefice) može povezati ključeve s vrijednostima različitih tipova podataka. U ovom su slučaju vrijednosti polja sve pokazivači koji upućuju na različite vrste vrijednosti.

Hash tablica je niz s hash funkcijom. Funkcija uzima ključ i raspršuje odgovarajući indeks i tako povezuje ključeve s vrijednostima u polju. Tipke ne moraju biti dio hash tablice.

Zašto niz, a ne povezani popis za tablicu raspršivanja

Niz za hash tablicu može se zamijeniti povezanom strukturom podataka popisa, ali to bi mogao biti problem. Prvi element povezanog popisa prirodno je na indeksu 0; drugi je element prirodno pod indeksom 1; treći je prirodno u indeksu, 2; i tako dalje. Problem povezanog popisa je taj da se za dohvaćanje vrijednosti popis mora prelistati, a to zahtijeva vrijeme. Pristup vrijednosti u nizu vrši se slučajnim pristupom. Jednom kada je indeks poznat, vrijednost se dobiva bez ponavljanja; ovaj je pristup brži.

Sudar

Hash funkcija uzima ključ i raspršuje odgovarajući indeks, za čitanje pridružene vrijednosti ili za umetanje nove vrijednosti. Ako je svrha očitavanje vrijednosti, zasad nema problema (nema problema). Međutim, ako je svrha umetanje vrijednosti, raspršeni indeks možda već ima pridruženu vrijednost, a to je kolizija; nova vrijednost se ne može staviti tamo gdje već postoji vrijednost. Postoje načini za rješavanje sudara - vidi dolje.

Zašto dolazi do sudara

U gornjem primjeru trgovine s namirnicama ključna su imena kupaca, a vrijednosti pića su imena pića. Primijetite da je kupaca previše, iako niz ima ograničenu veličinu i ne može uzeti sve kupce. Dakle, u piće se pohranjuju samo pića redovitih kupaca. Do sudara bi došlo kad neredoviti kupac postane redovan. Kupci trgovine čine velik skup, dok je broj kanta za kupce u nizu ograničen.

Kod hash tablica bilježe se vrijednosti ključeva koje su vrlo vjerojatne. Kada ključ koji nije bio vjerojatan, postane vjerojatan, vjerojatno bi došlo do sudara. Zapravo se sudar uvijek događa s hash tablicama.

Osnove rješavanja sudara

Dva pristupa rješavanju sudara nazivaju se odvojeno ulančavanje i otvoreno adresiranje. U teoriji, ključevi ne bi trebali biti u strukturi podataka ili ne bi trebali biti dijelom hash tablice. Međutim, oba pristupa zahtijevaju da stupac ključa prethodi tablici raspršivanja i postane dio cjelokupne strukture. Umjesto da se ključevi nalaze u stupcu ključeva, pokazivači na tipke mogu se nalaziti u stupcu ključeva.

Praktična hash tablica uključuje stupac ključeva, ali ovaj stupac ključa službeno nije dio hash tablice.

Oba pristupa za razlučivanje mogu imati prazna područja, ne nužno na kraju niza.

Odvojeno ulančavanje

U odvojenom lancu, kada se dogodi sudar, nova vrijednost dodaje se desno (ne iznad ili ispod) sudarane vrijednosti. Dakle, dvije ili tri vrijednosti na kraju imaju isti indeks. Rijetko više od tri treba imati isti indeks.

Može li više od jedne vrijednosti zaista imati isti indeks u nizu? - Ne. Dakle, u mnogim slučajevima prva vrijednost indeksa je pokazivač na povezanu strukturu podataka popisa koja sadrži jednu, dvije ili tri sudarane vrijednosti. Sljedeći je dijagram primjer hash tablice za odvojeno ulančavanje kupaca i njihovih telefonskih brojeva:

Prazne kante označene su slovom x. Ostatak mjesta ima pokazivače na povezane popise. Svaki element povezanog popisa ima dva podatkovna polja: jedno za ime kupca i drugo za telefonski broj. Do sukoba dolazi zbog ključeva: Peter Jones i Suzan Lee. Odgovarajuće vrijednosti sastoje se od dva elementa jednog povezanog popisa.

Za sukobljene ključeve kriterij za umetanje vrijednosti isti je kriterij koji se koristi za lociranje (i čitanje) vrijednosti.

Otvoreno adresiranje

S otvorenim adresiranjem, sve se vrijednosti pohranjuju u polje s segmentima. Kada se dogodi sukob, nova se vrijednost ubacuje u prazan segment, nova odgovarajuća vrijednost za sukob, slijedeći neki kriterij. Kriterij koji se koristi za umetanje vrijednosti u sukobu isti je kriterij koji se koristi za lociranje (pretraživanje i čitanje) vrijednosti.

Sljedeći dijagram ilustrira rješavanje sukoba s otvorenim adresiranjem:

Funkcija raspršivanja uzima ključ Peter Jones i raspršuje indeks 152 i pohranjuje svoj telefonski broj u pripadajuću sekciju. Nakon nekog vremena, hash funkcija raspršuje isti indeks, 152 od ključa, Suzan Lee, sudarajući se s indeksom za Peter Jones. Da bi se to riješilo, vrijednost za Suzan Lee pohranjuje se u skup sljedećeg indeksa 153, koji je bio prazan. Hash funkcija raspršuje indeks, 153 za ključ, Robin Hood, ali ovaj je indeks već korišten za rješavanje sukoba za prethodni ključ. Dakle, vrijednost za Robin Hooda stavlja se u sljedeću praznu kantu, a to je vrijednost indeksa 154.

Metode rješavanja sukoba za odvojeno ulančavanje i otvoreno adresiranje

Odvojeno ulančavanje ima svoje metode rješavanja sukoba, a otvoreno adresiranje također ima svoje metode rješavanja sukoba.

Metode za rješavanje sukoba razdvojenih lanaca

Sada su ukratko objašnjene metode odvojenog ulančavanja hash tablica:

Odvojeno ulančavanje povezanim popisima

Ova metoda je kako je gore objašnjeno. Međutim, svaki element povezanog popisa ne mora nužno imati ključno polje (npr.g. gornje polje imena kupca).

Odvojeno ulančavanje s glavnim stanicama popisa

U ovoj se metodi prvi element povezanog popisa pohranjuje u seriju polja. To je moguće ako je vrsta podataka za niz element povezanog popisa.

Odvojeni lanci s drugim strukturama

Bilo koja druga struktura podataka, kao što je samobalansirajuće binarno stablo pretraživanja koja podržava tražene operacije, može se koristiti umjesto povezanog popisa - pogledajte kasnije.

Metode za rješavanje sukoba otvorenog adresiranja

Metoda za rješavanje sukoba u otvorenom adresiranju naziva se sekvenca sonde. Tri dobro poznata slijeda sondi sada su ukratko objašnjena:

Linearno sondiranje

Uz linearno sondiranje, kada se dogodi sukob, traži se najbliže prazno kanto ispod kante u sukobu. Također, s linearnim ispitivanjem, i ključ i njegova vrijednost pohranjuju se u isti segment.

Kvadratno sondiranje

Pretpostavimo da se sukob događa kod indeksa H. Sljedeći prazan utor (segment) s indeksom H + 12 koristi se; ako je to već zauzeto, sljedeći prazan na H + 22 koristi se, ako je to već zauzeto, sljedeći prazan na H + 32 koristi se i tako dalje. Postoje varijante ovoga.

Dvostruko raspršivanje

Kod dvostrukog raspršivanja postoje dvije funkcije raspršivanja. Prva izračunava (hešira) indeks. Ako se dogodi sukob, drugi pomoću istog ključa određuje koliko treba ubaciti vrijednost. Ima još toga - pogledajte kasnije.

Savršena hash funkcija

Savršena hash funkcija je hash funkcija koja ne može rezultirati bilo kakvim sudarom. To se može dogoditi kada je skup ključeva relativno malen i svaki se ključ preslikava na određeni cijeli broj u hash tablici.

U ASCII skupu znakova, velika slova mogu se preslikati u odgovarajuća mala slova pomoću hash funkcije. Slova su u memoriji računala predstavljena brojevima. U ASCII skupu znakova, A je 65, B je 66, C je 67, itd. a a je 97, b je 98, c je 99 itd. Za mapiranje od A do a dodajte 32 do 65; za mapiranje od B do b dodajte 32 do 66; za mapiranje od C do c dodajte 32 do 67; i tako dalje. Ovdje su velika slova tipke, a mala slova vrijednosti. Hash tablica za to može biti niz čije su vrijednosti pridruženi indeksi. Zapamtite, kante niza mogu biti prazne. Dakle, segmenti u nizu od 64 do 0 mogu biti prazni. Hash funkcija jednostavno dodaje 32 na veliki kodni broj da bi se dobio indeks, a time i malo slovo. Takva je funkcija savršena hash funkcija.

Raspršivanje od cjelovitih do cjelovitih indeksa

Postoje različite metode za raspršivanje cijelog broja. Jedan od njih naziva se Modulo Division Metoda (Funkcija).

Funkcija raspršivanja modula divizije

Funkcija u računalnom softveru nije matematička funkcija. U računalstvu (softver), funkcija se sastoji od skupa izjava kojima prethode argumenti. Za funkciju Modulo Division, tipke su cijeli brojevi i mapiraju se u indekse niza segmenata. Skup ključeva je velik, pa će se mapirati samo ključevi za koje je vrlo vjerojatno da će se pojaviti u aktivnosti. Dakle, dolazi do sudara kada se moraju mapirati nevjerojatni ključevi.

U izjavi,

20/6 = 3R2

20 je dividenda, 6 je djelitelj, a 3 ostatak 2 je količnik. Ostatak 2 naziva se i modulom. Napomena: moguće je imati modul 0.

Za ovo raspršivanje veličina tablice obično je snage 2, npr.g. 64 = 26 ili 256 = 28, itd.  Dijelnik ove funkcije raspršivanja prost je broj blizu veličine polja. Ova funkcija dijeli ključ djeliteljem i vraća modul. Modulo je indeks niza segmenata. Pridružena vrijednost u segmentu vrijednost je po vašem izboru (vrijednost za ključ).

Raspršivanje tipki promjenjive duljine

Ovdje su tipke skupa ključeva tekstovi različitih duljina. Različiti cijeli brojevi mogu se pohraniti u memoriju koristeći isti broj bajtova (veličina engleskog znaka je bajt). Kad su različiti ključevi različitih bajtova, kaže se da su promjenjive duljine. Jedna od metoda raspršivanja promjenjivih duljina naziva se Radix pretvorbom raspršivanja.

Hashing pretvorbe Radix

U nizu je svaki znak u računalu broj. U ovoj metodi,

Hash kod (indeks) = x0ak − 1+x1ak − 2+… + Xk − 2a1+xk − 1a0

Gdje su (x0, x1,…, xk − 1) znakovi ulaznog niza, a a je radix, e.g. 29 (vidi kasnije). k je broj znakova u nizu. Ima još toga - pogledajte kasnije.

Ključevi i vrijednosti

U paru ključ / vrijednost vrijednost ne mora nužno biti broj ili tekst. To može biti i rekord. Zapis je popis napisan vodoravno. U paru ključ / vrijednost svaki se ključ zapravo može odnositi na neki drugi tekst ili broj ili zapis.

Asocijativni niz

Popis je struktura podataka, gdje su stavke popisa povezane, a na popisu postoji niz operacija. Svaka stavka popisa može se sastojati od para stavki. Općenita hash tablica sa svojim ključevima može se smatrati strukturom podataka, ali ona je više sustav nego struktura podataka. Tipke i njihove odgovarajuće vrijednosti međusobno ne ovise previše. Nisu u međusobnoj vezi.

S druge strane, asocijativni niz je slična stvar, ali ključevi i njihove vrijednosti vrlo ovise jedni o drugima; vrlo su međusobno povezani. Na primjer, možete imati asocijativni niz voća i njihovih boja. Svako voće prirodno ima svoju boju. Ključno je ime ploda; boja je vrijednost. Tijekom umetanja umeta se svaki ključ sa svojom vrijednošću. Prilikom brisanja briše se svaki ključ sa svojom vrijednošću.

Asocijativni niz je struktura podataka hash tablice koja se sastoji od parova ključ / vrijednost, gdje ne postoji duplikat za ključeve. Vrijednosti mogu imati duplikate. U ovoj su situaciji tipke dio strukture. Odnosno, ključevi se moraju pohraniti, dok, s tablicom općih hasta, ključevi ne moraju biti pohranjeni. Problem dupliciranih vrijednosti prirodno se rješava indeksima niza segmenata. Ne brkajte između dupliciranih vrijednosti i sudara u indeksu.

Budući da je asocijativni niz struktura podataka, ima najmanje sljedeće operacije:

Operacije asocijativnog niza

umetnuti ili dodati

Ovo u kolekciju ubacuje novi par ključ / vrijednost, preslikavajući ključ na njegovu vrijednost.

ponovno dodijeliti

Ova operacija zamjenjuje vrijednost određenog ključa novom vrijednošću.

izbrisati ili ukloniti

Ovo uklanja ključ plus odgovarajuću vrijednost.

Pogledaj

Ova operacija traži vrijednost određenog ključa i vraća vrijednost (bez uklanjanja).

Zaključak

Struktura podataka hash tablice sastoji se od niza i funkcije. Funkcija se naziva hash funkcija. Funkcija preslikava ključeve u vrijednosti u nizu kroz indekse niza. Ključevi ne moraju nužno biti dio strukture podataka. Skup ključeva obično je veći od pohranjenih vrijednosti. Kada dođe do sudara, to se rješava ili pristupom odvojenog ulančavanja ili pristupom otvorenog adresiranja. Asocijativni niz je poseban slučaj strukture podataka hash tablice.

Kontrolirajte i upravljajte kretanjem miša između više monitora u sustavu Windows 10
Dvostruki zaslon upravitelja miša omogućuje vam kontrolu i konfiguriranje kretanja miša između više monitora, usporavajući njegovo kretanje blizu gran...
WinMouse vam omogućuje prilagodbu i poboljšanje kretanja pokazivača miša na Windows računalu
Ako želite poboljšati zadane funkcije pokazivača miša, upotrijebite besplatni program WinMouse. Dodaje više značajki koje će vam pomoći da na najbolji...
Lijevi gumb miša ne radi u sustavu Windows 10
Ako s prijenosnim računalom ili stolnim računalom koristite namjenski miš, ali lijevi gumb miša ne radi u sustavu Windows 10/8/7 iz nekog razloga evo ...