Andmestruktuurid ja algoritmid

Hash tabeli andmete struktuuri õpetus

Hash tabeli andmete struktuuri õpetus
Arvutiteaduses tähendab sõna "kaart" ühe komplekti üksuse linkimist teise komplekti teise elemendiga. Kujutage ette, et ühel lehel on sõnu vasakul ringil ja sama lehe paremal küljel on veel üks ring, mille sees on muid sõnu. Oletame, et igas ringis on sõnad kirjutatud juhuslikult, hajutatud ringi sees. Oletame ka, et vasaku ringi sõnu nimetatakse võtmeteks ja parema ringi sõnu väärtusteks. Kui vasakult igalt sõnalt tõmmatakse nool paremale, siis öeldakse, et klahvid on vastendatud väärtustele.

Oletame, et olete maakonnas, kus elate, suure toidupoe omanik. Oletame, et elate suurel alal, mis ei ole kaubanduspind. Teil pole selles piirkonnas ainus toidupood; teil on vähe konkurente. Ja siis tuleb pähe, et peaksite oma klientide telefoninumbrid märkmikusse märkima. Muidugi on vihik väike ja te ei saa kõigi klientide jaoks kõiki telefoninumbreid salvestada.

Nii otsustate salvestada ainult oma püsiklientide telefoninumbrid. Ja nii on teil kahe veeruga tabel. Vasakpoolses veerus on klientide nimed ja paremal asuvas veerus on vastavad telefoninumbrid. Sel moel toimub kliendinimede ja telefoninumbrite kaardistamine. Tabeli parempoolset veergu võib pidada tuumaräsi tabeliks. Kliendinimesid nimetatakse nüüd võtmeteks ja telefoninumbreid nimetatakse väärtusteks. Pange tähele, et kui klient läheb ülekandele, peate tema rea ​​tühistama, lubades rida tühjaks või asendama uue püsikliendi reaga. Pange tähele ka seda, et aja jooksul võib püsiklientide arv suureneda või väheneda ja nii võib laud kasvada või kahaneda.

Teise kaardistamise näitena oletame, et maakonnas tegutseb põllumeeste klubi. Muidugi ei saa kõik põllumehed klubi liikmeks. Mõned klubi liikmed ei ole tavalised liikmed (osalevad ja osalevad). Baarimees võib otsustada salvestada liikmete nimed ja nende valitud joogid. Ta töötab välja kahest tulbast koosneva tabeli. Vasakusse veergu kirjutab ta klubiliikmete nimed. Parempoolsesse veergu kirjutab ta vastava joogivaliku.

Siin on probleem: paremas veerus on duplikaadid. See tähendab, et joogi sama nime leidub rohkem kui üks kord. Teisisõnu, erinevad liikmed joovad sama magusat jooki või sama alkohoolset jooki, teised aga erinevat magusat või alkohoolset jooki. Baarimees otsustab selle probleemi lahendada, lisades kahe veeru vahele kitsa veeru. Selles keskmises veerus, alustades ülevalt, nummerdab ta nullist algavad read (st.e. 0, 1, 2, 3, 4 jne.), laskudes alla, üks indeks rea kohta. Sellega on tema probleem lahenenud, kuna liikme nimi kaardistatakse nüüd indeksiga, mitte joogi nimega. Niisiis, kuna jooki identifitseeritakse indeksiga, kaardistatakse kliendi nimi vastava indeksiga.

Ainult väärtuste (jookide) veerg moodustab põhilise räsitabeli. Muudetud tabelis moodustab indeksite ja nendega seotud väärtuste veerg (koos duplikaatidega või ilma) tavalise räsitabeli - räsitabeli täielik määratlus on toodud allpool. Klahvid (esimene veerg) ei pruugi tingimata olla räsitabeli osa.

Teise näitena kaaluge uuesti võrguserverit, kuhu klientarvutist pärit kasutaja saab lisada teavet, kustutada teavet või muuta teavet. Serveri jaoks on palju kasutajaid.  Iga kasutajanimi vastab serverisse salvestatud paroolile. Serveri hooldajad näevad kasutajanimesid ja vastavat parooli ning saavad seega kasutajate tööd rikkuda.

Seega otsustab serveri omanik luua funktsiooni, mis krüpteerib parooli enne selle salvestamist. Kasutaja logib serverisse oma tavalise arusaadava parooliga. Kuid nüüd on iga parool krüptitud kujul salvestatud. Kui keegi näeb krüpteeritud parooli ja proovib seda kasutades sisse logida, siis see ei toimi, kuna sisselogimine saab serverilt aru mõistetud parooli, mitte krüpteeritud parooli.

Sellisel juhul on võtmeks mõistetud parool ja väärtuseks krüptitud parool. Kui krüpteeritud parool on krüpteeritud paroolide veerus, on see veerg põhiline räsitabel. Kui sellele veerule eelneb teine ​​veerg, mille indeksid algavad nullist, nii et iga krüpteeritud parool on seotud indeksiga, moodustavad nii indeksite veerg kui ka krüpteeritud parooli veerg tavalise räsitabeli. Võtmed pole tingimata räsi tabeli osad.

Pange tähele, et antud juhul vastab iga võti, mis on arusaadav parool, kasutajanimele. Niisiis, on olemas kasutajanimi, mis vastab indeksile vastendatud võtmele, mis on seotud krüpteeritud võtmega.

Räsifunktsiooni määratlus, räsitabeli täielik määratlus, massiivi tähendus ja muud üksikasjad on toodud allpool. Selle juhendaja ülejäänud osa hindamiseks peab teil olema teadmisi viidetes (viidetes) ja lingitud loendites.

Hashi funktsiooni ja räsi tabeli tähendus

Massiiv

Massiiv on järjestikuste mälupaikade kogum. Kõik asukohad on ühesuurused. Esimese asukoha väärtusele pääseb juurde indeksiga 0; teises asukohas olevale väärtusele pääseb juurde indeksiga 1; kolmandale väärtusele pääseb juurde indeksiga 2; neljas indeksiga, 3; ja nii edasi. Massiiv ei saa tavaliselt suureneda ega kahaneda. Massiivi suuruse (pikkuse) muutmiseks tuleb luua uus massiiv ja vastavad väärtused kopeerida uude massiivi. Massiivi väärtused on alati sama tüüpi.

Räsifunktsioon

Tarkvaras on räsifunktsioon funktsioon, mis võtab võtme ja loob massiiarakule vastava indeksi. Massiiv on kindla suurusega (fikseeritud pikkusega). Võtmete arv on suvalise suurusega, tavaliselt suurem kui massiivi suurus. Räsifunktsioonist tulenevat indeksit nimetatakse räsi väärtuseks või kokkuvõtteks või räsikoodiks või lihtsalt räsiks.

Hash tabel

Räsitabel on väärtustega massiiv, mille indeksite, võtmete järgi kaardistatakse. Klahvid on kaudselt kaardistatud väärtustega. Tegelikult on võtmed vastendatud väärtustele, kuna iga indeks on seotud väärtusega (duplikaatidega või ilma). Kuid funktsioon, mis teeb kaardistamise (st.e. räsimine) seostab võtmed massiiviindeksitega ja mitte tegelikult väärtustega, kuna väärtustes võib olla duplikaate. Järgmine skeem illustreerib inimeste nimede ja nende telefoninumbrite räsitabelit. Massiivrakke (pesasid) nimetatakse ämbriteks.

Pange tähele, et mõned ämbrid on tühjad. Räsitabeli kõigis ämbrites ei pruugi olla väärtusi. Ämbrite väärtused ei pea tingimata olema kasvavas järjekorras. Indeksid, millega nad on seotud, on aga tõusvas järjekorras. Nooled tähistavad kaardistamist. Pange tähele, et võtmed pole massiivis. Need ei pea olema üheski struktuuris. Räsifunktsioon võtab suvalise klahvi ja räsib massiivi indeksi. Kui indeksi räsimisega seotud rühmas pole väärtust, võidakse sellesse rühma lisada uus väärtus. Loogiline seos on võtme ja indeksi vahel, mitte võtme ja indeksiga seotud väärtuse vahel.

Massiivi väärtused, nagu ka selle räsitabeli väärtused, on alati sama tüüpi andmetega. Räsitabel (ämbrid) saab ühendada võtmeid erinevate andmetüüpide väärtustega. Sellisel juhul on massiivi väärtused kõik osutajad, osutades erinevatele väärtustüüpidele.

Räsitabel on räsifunktsiooniga massiiv. Funktsioon võtab võtme ja räsib vastava indeksi ning ühendab võtmed massiivi väärtustega. Võtmed ei pea olema räsitabeli osa.

Miks massiivi ja mitte linkitud loendit räsitabeli jaoks

Räsitabeli massiivi saab asendada lingitud loendi andmestruktuuriga, kuid sellega oleks probleem. Lingitud loendi esimene element on loomulikult indeksis 0; teine ​​element on loomulikult indeksis 1; kolmas on loomulikult indeksis 2; ja nii edasi. Lingitud loendi probleem seisneb selles, et väärtuse hankimiseks tuleb loend läbi korrata ja see võtab aega. Massiivi väärtusele pääseb juurde juhusliku juurdepääsu abil. Kui indeks on teada, saadakse väärtus ilma iteratsioonita; see juurdepääs on kiirem.

Kokkupõrge

Räsifunktsioon võtab seotud väärtuse lugemiseks või uue väärtuse sisestamiseks võtme ja räsib vastava indeksi. Kui eesmärk on väärtuse lugemine, pole siiani probleemi (pole probleemi). Kui aga eesmärk on väärtuse sisestamine, võib räsitud indeksil olla juba seotud väärtus ja see on kokkupõrge; uut väärtust ei saa panna sinna, kus väärtus on juba olemas. Kokkupõrke lahendamiseks on viise - vt allpool.

Miks toimub kokkupõrge

Ülaltoodud toidupoe näites on võtmeteks klientide nimed ja väärtused on jookide nimed. Pange tähele, et kliente on liiga palju, samas kui massiivi suurus on piiratud ja see ei saa kõiki kliente võtta. Niisiis, massiivi salvestatakse ainult püsiklientide joogid. Kokkupõrge toimub siis, kui mittekorrapärane klient muutub regulaarseks. Poe kliendid moodustavad suure komplekti, samas kui massiivi klientide ämbrite arv on piiratud.

Räsitabelite puhul salvestatakse väga tõenäoliselt võtmete väärtused. Kui võti, mis ei olnud tõenäoline, muutub tõenäoliseks, toimub tõenäoliselt kokkupõrge. Tegelikult toimub kokkupõrge alati räsitabelitega.

Kokkupõrke lahendamise alused

Kokkupõrke lahendamise kahte lähenemisviisi nimetatakse eraldi aheldamiseks ja avatud adresseerimiseks. Teoreetiliselt ei tohiks võtmed asuda andmestruktuuris ega tohiks olla räsitabeli osa. Mõlemad lähenemised eeldavad siiski, et võtmeveeru eelneb räsitabelile ja muutub üldstruktuuri osaks. Selle asemel, et klahvid oleksid võtmete veerus, võivad osutused võtmetele asuda võtmete veerus.

Praktiline räsitabel sisaldab võtmeveeru, kuid see võtmeveeru ei kuulu ametlikult räsitabeli koosseisu.

Mõlemal lahutusviisil võivad olla tühjad ämbrid, mitte tingimata massiivi lõpus.

Eraldi aheldamine

Eraldi aheldamisel lisatakse kokkupõrke korral uus väärtus kokkupõrkega väärtuse paremale (mitte ülalt ega alla). Nii et lõpuks on kahel või kolmel väärtusel sama indeks. Harva peaks üle kolme olema sama indeks.

Kas enam kui ühel väärtusel võib massiivis olla sama indeks?? - Ei. Nii et paljudel juhtudel on indeksi esimene väärtus viidatud lingitud andmestruktuurile, mis hoiab ühte, kahte või kolme kokku põrganud väärtust. Järgmine diagramm on räsi tabeli näide klientide ja nende telefoninumbrite eraldi aheldamiseks:

Tühjad ämbrid on tähistatud tähega x. Ülejäänud teenindusaegadel on viidatud lingitud loenditele. Igal lingitud loendi elemendil on kaks andmevälja: üks kliendi nime ja teine ​​telefoninumbri jaoks. Konflikt tekib võtmete osas: Peter Jones ja Suzan Lee. Vastavad väärtused koosnevad ühe lingitud loendi kahest elemendist.

Konfliktsete võtmete puhul on väärtuse sisestamise kriteerium sama kriteerium, mida kasutatakse väärtuse leidmiseks (ja lugemiseks).

Avage aadressimine

Avatud adresseerimise korral salvestatakse kõik väärtused rühma massiivi. Konflikti tekkimisel lisatakse uus väärtus tühja ämbrisse, mis vastab mõnele kriteeriumile, järgides konflikti vastavat väärtust. Kriteerium, mida kasutatakse konflikti väärtuse sisestamiseks, on sama kriteerium, mida kasutatakse väärtuse leidmiseks (otsimiseks ja lugemiseks).

Järgmine diagramm illustreerib konfliktide lahendamist avatud pöördumisega:

Räsifunktsioon võtab võtme, Peter Jones, räsib indeksi 152 ja salvestab oma telefoninumbri seotud ämbrisse. Mõne aja pärast räsifunktsioon räsib sama indeksi, 152 võtmest, Suzan Lee, põrkudes Peter Jonesi indeksiga. Selle lahendamiseks salvestatakse Suzan Lee väärtus järgmise indeksi 153 ämbrisse, mis oli tühi. Räsifunktsioon räsib võtme, Robin Hood, indeksi 153, kuid seda indeksit on juba kasutatud eelmise võtme konflikti lahendamiseks. Nii et Robin Hoodi väärtus paigutatakse järgmisse tühja ämbrisse, mis on indeks 154.

Konfliktide lahendamise meetodid eraldi aheldamise ja avatud adresseerimise jaoks

Eraldi aheldamisel on oma meetodid konfliktide lahendamiseks ja avatud pöördumisel on ka oma meetodid konfliktide lahendamiseks.

Eraldatud ahelduskonfliktide lahendamise meetodid

Räsitabelite eraldi aheldamise meetodeid on nüüd lühidalt selgitatud:

Eraldage aheldamine lingitud loenditega

See meetod on nagu eespool selgitatud. Kuid lingitud loendi igal elemendil ei pea olema tingimata võtmeväli (nt.g. ülal olev kliendi nime väli).

Eraldage ketid loendis olevate pearakkudega

Selles meetodis salvestatakse lingitud loendi esimene element massiivi ämbrisse. See on võimalik, kui massiivi andmetüüp on lingitud loendi element.

Eraldage ketid teiste konstruktsioonidega

Lingitud loendi asemel saab kasutada mis tahes muid andmestruktuure, näiteks nõutavaid toiminguid toetavat isetasakaalustuvat binaarotsingupuud - vt hiljem.

Meetodid avatud adresseerimiskonfliktide lahendamiseks

Meetodit konflikti lahendamiseks avatud adresseerimisel nimetatakse sondijärjestuseks. Kolm tuntud sondijärjestust on nüüd lühidalt selgitatud:

Lineaarne sondeerimine

Lineaarse sondeerimisega otsitakse konflikti korral lähimat tühja ämbrit konflikti all. Samuti salvestatakse lineaarse sondeerimisega nii võti kui ka selle väärtus samasse ämbrisse.

Teise astme sondeerimine

Oletame, et konflikt tekib indeksis H. Järgmine tühi pesa (ämber) indeksis H + 12 kasutatakse; kui see on juba hõivatud, siis järgmine tühi H + 2 juures2 kasutatakse, kui see on juba hõivatud, siis järgmine tühi H + 3 juures2 kasutatakse jne. Sellel on variante.

Topelt räsimine

Topelt räsimisel on kaks räsimisfunktsiooni. Esimene arvutab (räsib) indeksi. Konflikti ilmnemisel kasutab teine ​​sama klahvi, et määrata, kui kaugele peaks väärtus lisama. Selles on veel midagi - vaata hiljem.

Täiuslik räsifunktsioon

Täiuslik räsifunktsioon on räsifunktsioon, mis ei saa põhjustada kokkupõrget. See võib juhtuda, kui võtmekogum on suhteliselt väike ja iga võti kaardistab räsitabeli konkreetse täisarvu.

ASCII märgistikus saab räsifunktsiooni abil kaardistada suurtähed vastavate väiketähtedega. Tähed on arvuti mälus esindatud numbritena. ASCII tähemärkide komplektis A on 65, B on 66, C on 67 jne. ja a on 97, b on 98, c on 99 jne. A-st kaardistamiseks lisage 32 kuni 65; kaardistamiseks punktist B punkti b lisage 32 kuni 66; kaardistamiseks C-st c-ni lisage 32 kuni 67; ja nii edasi. Siin on suurtähed klahvid ja väiketähed on väärtused. Selle räsitabel võib olla massiiv, mille väärtused on seotud indeksid. Pidage meeles, et massiivi ämbrid võivad olla tühjad. Nii võivad massiivi vahemikud 64 kuni 0 olla tühjad. Räsifunktsioon lisab indeksi saamiseks suurte koodide numbrile lihtsalt 32 ja seega ka väikese tähe. Selline funktsioon on täiuslik räsifunktsioon.

Räsimine täisarvust täisarvuni

Täisarvu räsimiseks on erinevaid meetodeid. Ühte neist nimetatakse Modulo jagamismeetodiks (funktsioon).

Modulo rajooni räsimisfunktsioon

Arvutitarkvara funktsioon ei ole matemaatiline funktsioon. Arvutuses (tarkvara) koosneb funktsioon lausete kogumist, millele eelnevad argumendid. Funktsiooni Modulo Division korral on võtmed täisarvud ja need on kaardistatud ämbrite massiivi indeksitega. Võtmehulk on suur, nii et kaardistataks ainult need võtmed, mis võivad tegevuses väga tõenäoliselt esineda. Nii et kokkupõrked toimuvad siis, kui ebatõenäolised võtmed tuleb kaardistada.

Avalduses,

20/6 = 3R2

20 on dividend, 6 on jagaja ja 3 ülejäänud 2 on jagatis. Ülejäänud osa 2 nimetatakse ka mooduliks. Märkus: on võimalik, et moodul on 0.

Selle räsimise jaoks on laua suurus tavaliselt 2, st.g. 64 = 26 või 256 = 28, jne.  Selle räsimisfunktsiooni jagur on massiivi suurusele lähedane algarv. See funktsioon jagab võtme jagajaga ja tagastab mooduli. Modul on ämbrite massiivi indeks. Seotud väärtus ämbris on teie valitud väärtus (võtme väärtus).

Muutuva pikkusega võtmete räsimine

Siin on võtmekomplekti võtmed erineva pikkusega tekstid. Erinevaid täisarvusid saab mällu salvestada sama baitide arvuga (inglise tähemärgi suurus on bait). Kui erinevad klahvid on erineva baidi suurusega, öeldakse, et need on erineva pikkusega. Üheks muutuva pikkusega räsimise meetodiks nimetatakse Radix Conversion Hashing.

Radixi teisendamise räsimine

Stringis on arvuti iga märk number. Selles meetodis,

Räsikood (indeks) = x0ak − 1+x1ak − 2+… + Xk − 2a1+xk − 1a0

Kus (x0, x1,…, xk − 1) on sisendstringi tähemärgid ja a on radiks, e.g. 29 (vt hiljem). k on stringi märkide arv. Selles on veel midagi - vaata hiljem.

Võtmed ja väärtused

Võtme / väärtuse paaris ei pruugi väärtus olla tingimata arv või tekst. See võib olla ka plaat. Kirje on horisontaalselt kirjutatud loend. Võtme / väärtuse paaris võib iga võti viidata mõnele muule tekstile või numbrile või kirjele.

Assotsiatiivne massiiv

Loend on andmestruktuur, kus loendiüksused on seotud ja loendis toimib hulk toiminguid. Iga loendiüksus võib koosneda paarist. Üldist räsitabelit koos võtmetega võib pidada küll andmestruktuuriks, kuid see on pigem süsteem kui andmestruktuur. Klahvid ja neile vastavad väärtused ei sõltu üksteisest eriti. Nad pole üksteisega väga seotud.

Teiselt poolt on assotsiatiivne massiiv sarnane asi, kuid võtmed ja nende väärtused sõltuvad üksteisest väga palju; nad on üksteisega väga seotud. Näiteks võib teil olla assotsiatiivne puuviljade ja nende värvide massiiv. Igal viljal on loomulikult oma värv. Puuvilja nimi on võti; värv on väärtus. Sisestamise ajal sisestatakse iga võti koos oma väärtusega. Kustutamisel kustutatakse iga võti koos selle väärtusega.

Assotsiatiivne massiiv on räsitabeli andmestruktuur, mis koosneb võtme / väärtuse paaridest, kus võtmete jaoks pole duplikaati. Väärtustel võib olla duplikaate. Selles olukorras on võtmed osa struktuurist. See tähendab, et võtmeid tuleb salvestada, samas kui üldise kiirustabeli korral ei pea võtmeid salvestama. Duplitseeritud väärtuste probleemi lahendavad loomulikult ämbrite massiivi indeksid. Ärge segage dubleeritud väärtusi ja kokkupõrget indeksis.

Kuna assotsiatiivne massiiv on andmestruktuur, on sellel vähemalt järgmised toimingud:

Assotsiatiivsed massiivioperatsioonid

lisada või lisada

See lisab kollektsiooni uue võtme / väärtuse paari, kaardistades võtme selle väärtusele.

ümber määrama

See toiming asendab konkreetse võtme väärtuse uue väärtusega.

kustutada või eemaldada

See eemaldab võtme ja selle vastava väärtuse.

Vaata üles

See toiming otsib konkreetse võtme väärtust ja tagastab väärtuse (seda eemaldamata).

Järeldus

Räsitabeli andmestruktuur koosneb massiivist ja funktsioonist. Funktsiooni nimetatakse räsifunktsiooniks. Funktsioon kaardistab massiivi indeksite kaudu võtmed massiivi väärtustele. Võtmed ei pea tingimata olema osa andmestruktuurist. Võtmekomplekt on tavaliselt suurem kui salvestatud väärtused. Kokkupõrke korral lahendatakse see kas eraldi aheldamismeetodi või avatud adresseerimismeetodi abil. Assotsiatiivne massiiv on räsitabeli andmestruktuuri erijuhtum.

Tomb Raider for Linuxi õpetus
Shadow of the Tomb Raider on kaheteistkümnes täiendus seeria Tomb Raider - tegevus- ja seiklusmängude frantsiisile, mille on loonud Eidos Montreal. Ni...
Kuidas FPS-i suurendada Linuxis?
FPS tähistab Kaadrit sekundis. FPS-i ülesanne on mõõta kaadrisagedust video taasesitamisel või mängude esitamisel. Lihtsamalt öeldes nimetatakse iga s...
Parimad Oculus App Lab mängud
Kui olete Oculuse peakomplekti omanik, peate olema teadlik külglaadimisest. Kõrvalaadimine on protsess, millega installitakse peakomplekti mitte-poesi...