Podatkovne strukture in algoritmi

Vadnica za strukturo podatkov tabel razprševanja

Vadnica za strukturo podatkov tabel razprševanja
V računalništvu beseda "zemljevid" pomeni povezavo elementa iz enega sklopa z drugim predmetom drugega sklopa. Predstavljajte si, da so na strani besede v krogu na levi, na desni strani iste strani pa je še en krog, znotraj katerega so druge besede. Predpostavimo, da so v vsakem krogu besede zapisane naključno, razpršene znotraj kroga. Predpostavimo tudi, da se besede v levem krogu imenujejo ključi, besede v desnem krogu pa vrednosti. Če je puščica narisana od vsake besede na levi do vsake besede na desni, potem bi rekli, da so tipke preslikane na vrednosti.

Predpostavimo, da ste lastnik velike trgovine z živili v okrožju, kjer živite. Predpostavimo, da živite na velikem območju, ki ni komercialno območje. Niste edini, ki ima na tem območju trgovino z živili; imate nekaj konkurentov. In potem se vam zdi, da bi morali v vadnico zapisati telefonske številke svojih strank. Vaja je seveda majhna in ne morete posneti vseh telefonskih številk za vse svoje stranke.

Tako ste se odločili, da boste snemali samo telefonske številke svojih rednih strank. Tako imate tabelo z dvema stolpcema. V stolpcu na levi so imena strank, v stolpcu na desni pa ustrezne telefonske številke. Na ta način obstaja preslikava med imeni strank in telefonskimi številkami. Desni stolpec tabele lahko štejemo za jedrno razpršeno tabelo. Imena strank se zdaj imenujejo tipke, telefonske številke pa vrednosti. Ko kupec preide na prenos, boste morali njegovo vrstico preklicati, tako da bo vrstica prazna ali jo bo zamenjala nova vrstica. Upoštevajte tudi, da se sčasoma število rednih strank lahko poveča ali zmanjša, zato lahko miza raste ali se skrči.

Kot drug primer kartiranja predpostavimo, da v okrožju obstaja klub kmetov. Seveda vsi kmetje ne bodo člani kluba. Nekateri člani kluba ne bodo redni člani (udeleženci in prispevki). Moški se lahko odloči, da bo zapisal imena članov in njihovo izbiro pijače. Razvije tabelo iz dveh stolpcev. V levi stolpec zapiše imena članov kluba. V desni stolpec napiše ustrezno izbiro pijače.

Tukaj je težava: v desnem stolpcu so dvojniki. To pomeni, da isto ime pijače najdemo večkrat. Z drugimi besedami, različni člani pijejo isto sladko pijačo ali isto alkoholno pijačo, medtem ko drugi člani pijejo drugačno sladko ali alkoholno pijačo. Človek se odloči rešiti to težavo tako, da med oba stolpca vstavi ozek stolpec. V tem srednjem stolpcu, začenši z vrha, oštevilči vrstice, ki se začnejo od nič (tj.e. 0, 1, 2, 3, 4 itd.), navzdol, en indeks na vrstico. S tem je rešen njegov problem, saj se ime člana zdaj preslika v indeks in ne v ime pijače. Ko je pijača identificirana z indeksom, se ime stranke preslika v ustrezni indeks.

Samo stolpec vrednosti (pijače) tvori osnovno razpredelnico. V spremenjeni tabeli stolpec indeksov in z njimi povezane vrednosti (z dvojniki ali brez njih) tvorijo normalno razpršeno tabelo - spodaj je navedena celotna opredelitev razpredelnice. Ključi (prvi stolpec) niso nujno del razpredelnice.

Kot drug primer znova razmislite o omrežnem strežniku, kjer lahko uporabnik iz odjemalskega računalnika doda nekatere informacije, izbriše nekatere podatke ali spremeni nekatere podatke. Uporabnikov strežnika je veliko.  Vsako uporabniško ime ustreza geslu, ki je shranjeno v strežniku. Tisti, ki vzdržujejo strežnik, lahko vidijo uporabniška imena in pripadajoča gesla ter tako poškodujejo delo uporabnikov.

Torej se lastnik strežnika odloči, da bo ustvaril funkcijo, ki šifrira geslo, preden je shranjeno. Uporabnik se prijavi v strežnik s svojim običajnim razumevanjem gesla. Vendar je zdaj vsako geslo shranjeno v šifrirani obliki. Če kdo vidi šifrirano geslo in se poskuša prijaviti z njim, to ne bo delovalo, ker se prijava prejme s strani strežnika in ne šifriranega gesla.

V tem primeru je razumevanje gesla ključ, šifrirano geslo pa vrednost. Če je šifrirano geslo v stolpcu šifriranih gesel, je ta stolpec osnovna zgoščevalna tabela. Če je pred tem stolpcem drug stolpec z indeksi, ki se začnejo od nič, tako da je vsako šifrirano geslo povezano z indeksom, potem tako stolpec indeksov kot šifrirani geslo tvorijo običajno razpršeno tabelo. Ključi niso nujno del razpredelnice.

V tem primeru upoštevajte, da vsak ključ, ki je razumljeno geslo, ustreza uporabniškemu imenu. Torej, obstaja uporabniško ime, ki ustreza ključu, ki je preslikan v indeks, ki je povezan z vrednostjo, ki je šifrirani ključ.

Definicija zgoščevalne funkcije, popolna definicija razpršilne tabele, pomen matrike in druge podrobnosti so podane spodaj. Če želite ceniti preostanek te vaje, morate imeti znanje o kazalcih (referencah) in povezanih seznamih.

Pomen funkcije razpršitve in razpredelnice

Matrika

Matrika je niz zaporednih pomnilniških mest. Vse lokacije so enake velikosti. Vrednost na prvi lokaciji je dostopna z indeksom 0; vrednost na drugem mestu je dostopna z indeksom 1; do tretje vrednosti se dostopa z indeksom 2; četrti z indeksom, 3; in tako naprej. Matrika se običajno ne more povečati ali skrčiti. Če želite spremeniti velikost (dolžino) polja, je treba ustvariti novo polje in v novo polje kopirati ustrezne vrednosti. Vrednosti polja so vedno istega tipa.

Funkcija razpršitve

V programski opremi je zgoščevalna funkcija funkcija, ki sprejme ključ in ustvari ustrezen indeks za celico matrike. Matrika je fiksne velikosti (fiksna dolžina). Število ključev je poljubne velikosti, običajno večje od velikosti matrike. Indeks, ki izhaja iz zgoščevalne funkcije, se imenuje razpršena vrednost ali izvleček ali razpršilna koda ali preprosto razpršitev.

Hash tabela

Hash tabela je matrika z vrednostmi, na katere indeksi so preslikani ključi. Tipke so posredno preslikane na vrednosti. Dejansko naj bi bili ključi preslikani na vrednosti, saj je vsak indeks povezan z vrednostjo (z dvojniki ali brez njih). Vendar pa funkcija, ki izvaja preslikavo (tj.e. hashing) poveže ključe z indeksi matrike in ne zares z vrednostmi, saj lahko v vrednostih obstajajo dvojniki. Naslednji diagram prikazuje razpršilno tabelo za imena ljudi in njihove telefonske številke. Celice matrike (reže) se imenujejo segmenti.

Upoštevajte, da so nekatera vedra prazna. Tabela razpršitve ne sme imeti nujno vrednosti v vseh svojih segmentih. Vrednosti v vedrih ne smejo biti nujno v naraščajočem vrstnem redu. Indeksi, s katerimi so povezani, pa so v naraščajočem vrstnem redu. Puščice označujejo preslikavo. Upoštevajte, da tipk ni v polju. Ni treba, da so v kakršni koli strukturi. Razpršilna funkcija sprejme kateri koli ključ in razprši indeks matrike. Če v vedru, ki je povezan s zgoščenim indeksom, ni vrednosti, se lahko v to vedro vnese nova vrednost. Logična povezava je med ključem in indeksom in ne med ključem in vrednostjo, povezano z indeksom.

Vrednosti matrike, kot so vrednosti v tej razpršeni tabeli, so vedno istega podatkovnega tipa. Hash tabela (vedra) lahko poveže ključe z vrednostmi različnih podatkovnih vrst. V tem primeru so vrednosti polja vsi kazalci, ki kažejo na različne vrste vrednosti.

Hash tabela je matrika s hash funkcijo. Funkcija vzame ključ in razprši ustrezen indeks ter tako poveže ključe z vrednostmi v matriki. Ni nujno, da so tipke del razpršilne tabele.

Zakaj matrika in ne povezan seznam za razpršeno tabelo

Matriko za razpršilno tabelo je mogoče nadomestiti s povezano strukturo podatkovnih seznamov, vendar bi prišlo do težave. Prvi element povezanega seznama je po naravi indeks 0; drugi element je po naravi indeks 1; tretji je po naravi indeks 2; in tako naprej. Težava povezanega seznama je v tem, da je za pridobitev vrednosti treba seznam predelati, kar traja nekaj časa. Dostopanje do vrednosti v matriki poteka z naključnim dostopom. Ko je indeks znan, se vrednost dobi brez ponovitve; ta dostop je hitrejši.

Trčenje

Funkcija zgoščevanja vzame ključ in zgosti ustrezni indeks, da prebere povezano vrednost ali vstavi novo vrednost. Če je namen branje vrednosti, zaenkrat še ni nobene težave (ni problema). Če pa je namen vstaviti vrednost, ima morda zgoščeni indeks povezano vrednost in to je trk; nove vrednosti ni mogoče postaviti tam, kjer vrednost že obstaja. Obstajajo načini za rešitev trka - glej spodaj.

Zakaj pride do trka

V zgornjem primeru prodajalne so imena kupcev ključi, imena pijač pa vrednosti. Upoštevajte, da je strank preveč, medtem ko je polje omejeno in ne more sprejeti vseh strank. Tako so v paleti shranjene samo pijače rednih strank. Do trčenja bi prišlo, ko neredna stranka postane redna. Kupci trgovine tvorijo velik nabor, medtem ko je število veder za stranke v nizu omejeno.

Pri hash tabelah se zabeležijo vrednosti za ključe, ki so zelo verjetne. Ko ključ, ki ni bil verjeten, postane verjeten, bi verjetno prišlo do trka. Dejansko se trčenje vedno zgodi pri zgoščenih tabelah.

Osnove reševanja trkov

Dva pristopa k reševanju trkov se imenuje Ločeno veriženje in Odprto naslavljanje. V teoriji ključi ne smejo biti v podatkovni strukturi ali ne smejo biti del razpršilne tabele. Vendar oba pristopa zahtevata, da je stolpec s ključi pred zgoščeno tabelo in postane del celotne strukture. Namesto da so ključi v stolpcu tipk, so lahko kazalci na tipke v stolpcu ključev.

Praktična razpršena tabela vključuje stolpec ključev, vendar ta stolpec ključev uradno ni del razpredelnice.

Vsak pristop za reševanje ima lahko prazna vedra, ne nujno na koncu polja.

Ločeno veriženje

V ločenem veriženju, ko pride do trka, se nova vrednost doda na desno (ne zgoraj ali spodaj) trčene vrednosti. Torej imajo dve ali tri vrednosti enak indeks. Redko več kot tri bi morale imeti enak indeks.

Ali ima lahko več kot ena vrednost zares enak indeks v matriki? - Ne. V mnogih primerih je torej prva vrednost indeksa kazalec na povezano strukturo podatkov seznama, ki vsebuje eno, dve ali tri trčene vrednosti. Naslednji diagram je primer zgoščevalne tabele za ločeno veriženje strank in njihovih telefonskih številk:

Prazna vedra so označena s črko x. Preostala mesta imajo kazalce na povezane sezname. Vsak element povezanega seznama ima dve podatkovni polji: eno za ime stranke in drugo za telefonsko številko. Do konflikta pride pri tipkah: Peter Jones in Suzan Lee. Ustrezne vrednosti so sestavljene iz dveh elementov enega povezanega seznama.

Pri nasprotujočih si ključih je merilo za vstavljanje vrednosti enako merilo, ki se uporablja za iskanje (in branje) vrednosti.

Odprite naslavljanje

Pri odprtem naslavljanju so vse vrednosti shranjene v matriki vedrov. Ko pride do konflikta, se nova vrednost vstavi v prazen vedro, nova ustrezna vrednost za konflikt, po nekem kriteriju. Kriterij, ki se uporablja za vstavitev vrednosti v sporu, je isti kriterij, ki se uporablja za iskanje (iskanje in branje) vrednosti.

Naslednji diagram prikazuje reševanje konfliktov z odprtim naslavljanjem:

Funkcija razpršitve sprejme ključ Peter Jones in razprši indeks 152 in shrani svojo telefonsko številko v pripadajoči segment. Čez nekaj časa hash funkcija zgosti isti indeks, 152 od ključa Suzan Lee, ki trči v indeks Petra Jonesa. Da bi to rešili, je vrednost za Suzan Lee shranjena v vedru naslednjega indeksa 153, ki je bil prazen. Funkcija zgoščevanja zgosti indeks, 153 za ključ, Robin Hood, vendar je bil ta indeks že uporabljen za reševanje konflikta za prejšnji ključ. Torej je vrednost za Robin Hooda postavljena v naslednje prazno vedro, to je vrednost indeksa 154.

Metode reševanja konfliktov za ločeno veriženje in odprto naslavljanje

Ločeno veriženje ima svoje metode reševanja konfliktov, odprto naslavljanje pa ima tudi svoje metode reševanja konfliktov.

Metode za reševanje ločenih verižnih konfliktov

Metode za ločeno veriženje hash tabel so na kratko razložene zdaj:

Ločeno veriženje s povezanimi seznami

Ta metoda je opisana zgoraj. Vendar pa ni nujno, da ima vsak element povezanega seznama ključno polje (npr.g. zgoraj polje z imenom stranke).

Ločeno veriženje s celicami glave seznama

Pri tej metodi se prvi element povezanega seznama shrani v vedro polja. To je mogoče, če je podatkovni tip za matriko element povezanega seznama.

Ločeno veriženje z drugimi strukturami

Namesto povezanega seznama je mogoče uporabiti katero koli drugo podatkovno strukturo, na primer samo-uravnoteženo binarno drevo iskanja, ki podpira zahtevane operacije - glej kasneje.

Metode za reševanje konfliktov pri odprtem naslavljanju

Metoda za reševanje konflikta pri odprtem naslavljanju se imenuje zaporedje sonde. Zdaj so na kratko razložena tri dobro znana zaporedja sond:

Linearno sondiranje

Pri linearnem tipanju se ob konfliktu poišče najbližje prazno vedro pod vedrom v konfliktu. Tudi pri linearnem sondiranju se tako ključ kot njegova vrednost shranita v isti segment.

Kvadratno sondiranje

Predpostavimo, da do konflikta pride pri indeksu H. Naslednja prazna reža (vedro) z indeksom H + 12 se uporablja; če je to že zasedeno, potem naslednje prazno pri H + 22 se uporabi, če je ta že zaseden, potem naslednja prazna pri H + 32 se uporablja itd. Obstajajo različice tega.

Dvojno razprševanje

Pri dvojnem zgoščevanju obstajata dve funkciji zgoščevanja. Prvi izračuna indeks (zgosti ga). Če pride do konflikta, drugi z istim ključem določi, kako daleč naj se vstavi vrednost. To je še več - glej kasneje.

Popolna funkcija razpršitve

Popolna hash funkcija je hash funkcija, ki ne more povzročiti trka. To se lahko zgodi, ko je nabor ključev razmeroma majhen in se vsak ključ preslika na določeno celo število v razpršeni tabeli.

V naboru znakov ASCII je mogoče velike znake preslikati v ustrezne male črke s pomočjo zgoščevalne funkcije. Črke so v pomnilniku računalnika predstavljene kot številke. V naboru znakov ASCII je A 65, B 66, C 67 67 itd. in a je 97, b je 98, c je 99 itd. Če želite preslikati od A do a, dodajte 32 do 65; za preslikavo od B do b dodajte 32 do 66; za preslikavo od C do c dodajte 32 do 67; in tako naprej. Tu so velike črke tipke, male črke pa vrednosti. Hash tabela za to je lahko matrika, katere vrednosti so povezani indeksi. Ne pozabite, da so vedra polja lahko prazna. Torej so lahko vedra v polju od 64 do 0 prazna. Funkcija zgoščevanja preprosto doda 32 številki velike črke, da dobi indeks, in s tem majhno črko. Takšna funkcija je popolna zgoščevalna funkcija.

Razprševanje med celoštevilčnimi indeksi

Obstajajo različne metode za razprševanje celih števil. Eden od njih se imenuje metoda delitve Modulo (funkcija).

Funkcija razpršitve oddelka Modulo

Funkcija v računalniški programski opremi ni matematična funkcija. Pri računalništvu (programska oprema) je funkcija sestavljena iz niza stavkov, pred katerimi so argumenti. Za funkcijo Modulo Division so tipke cela števila in so preslikane v indekse polja vedrov. Nabor ključev je velik, zato bodo preslikane samo tipke, za katere je zelo verjetno, da se bodo pojavile v dejavnosti. Torej pride do trkov, kadar je treba preslikati malo verjetne ključe.

V izjavi,

20/6 = 3R2

20 je dividenda, 6 je delilec in 3 preostanek 2 je količnik. Preostanek 2 se imenuje tudi modulo. Opomba: možno je imeti modul 0.

Za to zgoščevanje je velikost tabele običajno moč 2, npr.g. 64 = 26 ali 256 = 28, itd.  Delitelj te razpršilne funkcije je prosto število, ki je blizu velikosti matrike. Ta funkcija deli tipko s delilnikom in vrne modul. Modulo je indeks polja vedrov. Povezana vrednost v segmentu je vrednost po vaši izbiri (vrednost za ključ).

Razprševanje tipk s spremenljivo dolžino

Tu so tipke nabora tipk besedila različnih dolžin. Različna cela števila je mogoče shraniti v pomnilnik z enakim številom bajtov (velikost angleškega znaka je bajt). Kadar so različni ključi različnih velikosti bajtov, naj bi bili spremenljive dolžine. Eden od načinov razprševanja spremenljivih dolžin se imenuje Radix pretvorbeno razprševanje.

Razprševanje pretvorbe Radix

V nizu je vsak znak v računalniku številka. Pri tej metodi,

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

Kjer so (x0, x1,…, xk − 1) znaki vhodnega niza in a je polmer, e.g. 29 (glej kasneje). k je število znakov v nizu. To je še več - glej kasneje.

Ključi in vrednote

V paru ključ / vrednost ni nujno, da je število ali besedilo. Lahko je tudi zapis. Zapis je seznam, napisan vodoravno. V paru ključ / vrednost se lahko vsak ključ dejansko nanaša na neko drugo besedilo ali številko ali zapis.

Asociativni niz

Seznam je podatkovna struktura, pri kateri so postavke seznama povezane, na seznamu pa je nabor operacij. Vsak element seznama je lahko sestavljen iz para postavk. Splošno razpršeno tabelo s ključi lahko obravnavamo kot podatkovno strukturo, vendar gre bolj za sistem kot za podatkovno strukturo. Tipke in njihove ustrezne vrednosti niso medsebojno odvisne. Med seboj niso zelo povezani.

Po drugi strani je asociativno polje podobno, vendar so ključi in njihove vrednosti zelo odvisni drug od drugega; so med seboj zelo povezani. Na primer, lahko imate asociativno paleto sadja in njihovih barv. Vsako sadje ima naravno svojo barvo. Ključno je ime sadja; barva je vrednost. Med vstavljanjem se vstavi vsaka tipka s svojo vrednostjo. Pri brisanju se vsak ključ izbriše s svojo vrednostjo.

Asociativno polje je podatkovna struktura razpršene tabele, sestavljena iz parov ključ / vrednost, kjer ni ključa za ključe. Vrednosti imajo lahko dvojnike. V tem primeru so ključi del strukture. To pomeni, da je treba shraniti ključe, medtem ko v splošni tabeli najnovejših ključev ni treba shraniti. Problem podvojenih vrednosti se naravno reši z indeksi polja nizov. Ne mešajte med podvojenimi vrednostmi in trkom v indeksu.

Ker je asociativno polje podatkovna struktura, ima vsaj naslednje operacije:

Operacije asociativnih nizov

vstavi ali dodaj

To v zbirko vstavi nov par ključ / vrednost in preslika ključ na njegovo vrednost.

ponovno dodeli

Ta operacija nadomesti vrednost določenega ključa na novo vrednost.

izbriši ali odstrani

S tem odstranite ključ in ustrezno vrednost.

Poglej gor

Ta operacija išče vrednost določenega ključa in vrne vrednost (ne da bi jo odstranila).

Zaključek

Struktura podatkov razpršene tabele je sestavljena iz polja in funkcije. Funkcija se imenuje zgoščevalna funkcija. Funkcija preslika ključe v vrednosti v matriki skozi indekse matrike. Ključi ne smejo biti nujno del podatkovne strukture. Nabor ključev je običajno večji od shranjenih vrednosti. Ko pride do trka, ga reši bodisi pristop ločenega veriženja bodisi pristop odprtega naslavljanja. Asociativno polje je poseben primer strukture podatkov razpršene tabele.

Kazalec skoči ali se naključno premika med tipkanjem v sistemu Windows 10
Če ugotovite, da kazalec miške med tipkanjem v prenosnem računalniku ali računalniku Windows samodejno, naključno preskakuje ali se premika sam, vam l...
Kako obrniti smer drsenja miške in sledilne ploščice v sistemu Windows 10
Miška in Sledilna ploščicaRačunalništvo ni samo enostavno, ampak bolj učinkovito in manj zamudno. Življenja brez teh naprav si ne moremo predstavljati...
Kako spremeniti miškin kazalec in velikost, barvo in shemo kazalca v sistemu Windows 10
Kazalec miške in kazalec v operacijskem sistemu Windows 10 sta zelo pomembna vidika operacijskega sistema. To lahko rečemo tudi za druge operacijske s...