Linearno heširanje
Linearno heširanje je dinamička heš tabela. Algoritam koji je izmislio Vitold Litvin (1980),[1] a kasnije popularizovao Paul Larson. Linearno heširanje omogućava proširenje jednog slota heš tabele u isto vreme. Često se zasebnim slotom za proširenje mogu veoma efikasno kontrolisati dužine lanaca sudara. Troškovi heš tabele ekspanzije se širi preko svake operacije heš tabela umetanja, za razliku od onih koje nastanu odjednom.[2] Linearno heširanje je stoga pogodno za interaktivne aplikacije.
Detalji algoritma
[uredi | uredi izvor]Prvo početna heš tabela je postavljena sa nekim proizvoljnim početnim brojem kofi(engl. buckets). Sledeće vrednosti treba da budu praćenje:
- : : Početni broj kofi.
- : Sadašnji nivo koji je ceo broj koji ukazuje na logaritamsku skalu,otprilike koliko je sto porastao u broju. To je u početku .
- : Pokazivač koji ukazuje na korpu. To ukazuje na početak prvog segmenta u tabeli.
Kofa sudari mogu se rešavati na različite načine, ali je tipično da imaju prostor za dva predmeta u svakom segmentu i da dodate još kofi kad god preliva. Više od dve stavke mogu da se koriste kada je implementacija otklanjanja grešaka. Adrese se izračunava na sledeći način:
- Primenite heš funkciju ključa i pozvati rezultat .
- Ako je adresa koja dolazi pre , adresa je .
- Ako je ili adresa koja dolazi nakon ,adresa je .
Da biste dodali kofu:
- Dodati novu kantu na kraj stola.
- Ako ukazuje na kantu u tabeli, resetovati(postaviti na 0) i povećati .
- Inače povećati .
Efekat svega ovoga je da tabela je podeljena u tri dela;odeljak pre , deonica od to , i deonica posle . Prva i poslednja sekcije su uskladištene korišćenjem i i srednji deo koji se čuva koristeći . Svaki put dostigne njto je duplo uvećan sto.
Poeni za prenos
[uredi | uredi izvor]- Pune kofe nije heophodno da budu podeljene,i potreban prostor za prekoračenja. U spoljne memorije, to bi moglo da znači drugi fajl.
- Kofe nisu pune.
- Svaka kofa bi bila pre ili kasnije podeljena i vraćeno prekoračenje.
- Split pokazivač ukazuje koja će biti podeljena
- s je nezavisna od pune kofe
- Na nivou i, s je između 0 i 2^i
- s se povećava i na kraju,vraćena na 0.
- pošto kašika s je podeljena onda s se povećava,samo kašike pre imaju dupli udvostručeni heš prostor.
- veliki dobar pseudo slučajni broj se dobija prvo, a zatim je bitno-maskiran sa (2^i) - 1 ili (2^(i+1)) -1, ali kasnije primenjuje samo ako je k, slučajni broj, bitno-maskiran sa (2^i) - 1, koji je manji od S, pa veći raspon heš vrednosti odnose samo na segmente koji su već podeljeni.
Za bitovsko-maskiranje broja koristi se x & 0111 , gde je & AND operacija, 111 je binarno 7 , gde je 7 = 8 - 1 i 8 je 2^3 i i = 3.
- hi (k)= h(k) mod(2^i n)
- hi+1 udvostručuje domet hi
Algoritam za umetanje 'k' i provere stanje prekoračenja
[uredi | uredi izvor]- b = h0(k)
- ako b < pokazivača onda
- b = h1(k)
Pretraživanje u heš tabeli za 'k'
[uredi | uredi izvor]- b = h0(k)
- Ako b < pokazivača
- b = h1(k)
Usvajanje u jezičkim sistemima
[uredi | uredi izvor]Grisvold i Tovnsend[3] su razgovarali o usvajanju linearnog heširanje u jeziku Ikonica. Oni su razgovarali o alternativama dinamičkog niza algoritma koji se koristi u implementaciji linearnog heširanja,i predstavio poređenja performansi korišćenja lista u aplkikaciji za Ikonice.
Usvajanje u sistemima baza podataka
[uredi | uredi izvor]Linearno heširanje se koristi u sistemu baze podataka BDB Berkli, koji zauzvrat koristi od strane mnogih softverskih sistema, kao što su OpenLDAP, koristeći implementaciju C izveden iz CACM članka i prvi objavljen u Usenet u 1988 od strane Esmond Pitt.
Reference
[uredi | uredi izvor]- ^ Litwin, Witold (1980), „Linear hashing: A new tool for file and table addressing” (PDF), Proc. 6th Conference on Very Large Databases: 212—223
- ^ Larson, Per-Åke (april 1988), „Dynamic Hash Tables”, Communications of the ACM, 31 (4): 446—457, doi:10.1145/42404.42410
- ^ Griswold, William G.; Townsend, Gregg M. (april 1993), „The Design and Implementation of Dynamic Hashing for Sets and Tables in Icon”, Software - Practice and Experience, 23 (4): 351—367
Dodatni linkovi
[uredi | uredi izvor]- Sorted Linear Hash Table, C++ implementation of a Linear Hashtable
- TommyDS, C implementation of a Linear Hashtable
- An in Memory Go Implementation with Explanation
- Paul E. Black, linear hashing at the National Institute of Standards and Technology, Dictionary of Algorithms and Data Structures.
- A C++ Implementation of Linear Hashtable which Supports Both Filesystem and In-Memory Storage