Hashing JavaScriptissä
Hashing on suosittu tekniikka, jota käytetään tietojen tallentamiseen ja hakemiseen mahdollisimman nopeasti. Pääsyy hajautusten käyttämiseen on se, että se suorittaa lisäys-, poisto-, haku- ja muita toimintoja
Miksi käyttää Hashingia?
Hashingissa kaikki toiminnot, kuten lisääminen, etsiminen ja poistaminen, voidaan suorittaa O(1):ssä eli vakioajassa. Hajautusajan pahimman tapauksen monimutkaisuus on edelleen O(n), mutta keskimääräinen tapauksen ajan monimutkaisuus on O(1).
HashTable
Käytetään uuden hash-taulukon luomiseen.
Syntaksi:
// function to delete a key from the hashtable delete (key) { const index = this._setKey(key); if (this.table[index]) { this.table[index] = []; this.size--; return true; } else { return false; } } Perustoiminnot syntaksin kanssa
Saada:
Käytetään avaimen etsimiseen hash-taulukon sisällä ja tuohon avaimeen liittyvän arvon palauttamiseen.
Syntaksi:
// function inside hashtable class to // access a value using its key get(key) { const target = this._setKey(key); return this.table[target]; } Lisää:
Käytetään uuden avain-arvo-parin lisäämiseen hash-taulukon sisään.
Syntaksi:
// function to insert a value in the // hash table using setKey function insert(value) { const index = this._setKey(value); this.table[index] = value; this.size++; } Hae:
Käytetään arvon etsimiseen.
Syntaksi:
// search a value (by getting its // key using setKey function) search(value){ const index = this._setKey(value); if(this.table[index]==value) console.log('The value is found at index : ',index); else console.log('Not found'); } Poistaa:
Käytetään tietyn avain-arvo-parin poistamiseen hash-taulukosta.
Syntaksi:
// function to delete a key from the hashtable delete (key) { const index = this._setKey(key); if (this.table[index]) { this.table[index] = []; this.size--; return true; } else { return false; } } Hashing-komponentit Javascriptissä
1. Hash-taulukko: Hash-taulukko on taulukon yleistys. Se tarjoaa toiminnallisuuden, johon tietokokoelma tallennetaan siten, että ne on helppo löytää myöhemmin tarvittaessa. Tämä tekee elementin etsimisestä erittäin tehokasta.
2. Hash-funktio: Hajautusfunktiota käytetään muuttamaan tietty avain tietyksi paikkaindeksiksi. sitä käytetään yhdistämään jokainen mahdollinen avain yksilölliseen paikkahakemistoon. Jos jokainen avain on kartoitettu yksilölliseen paikkaindeksiin, tiivistefunktio tunnetaan täydellisenä hash-funktiona. Täydellisen hash-funktion luominen on erittäin vaikeaa, mutta meidän tehtävämme ohjelmoijana on luoda sellainen hash-funktio, jonka avulla törmäyksiä on mahdollisimman vähän.
Hyvällä hash-funktiolla tulee olla seuraavat ominaisuudet:
- Tehokkaasti laskettavissa.
- Pitäisi jakaa avaimet tasaisesti (Jokainen pöytäpaikka on yhtä todennäköinen jokaiselle).
- Pitäisi minimoida törmäykset.
- Pitäisi olla alhainen käyttöaste (taulukon kohteiden määrä jaettuna taulukon koolla).
3. Törmäyskäsittely: Koska hash-funktio saa meille pienen luvun suurelle avaimelle, on mahdollista, että kaksi avainta johtavat samaan arvoon. Tilannetta, jossa äskettäin lisätty avain kohdistuu hash-taulukon jo varattuun paikkaan, kutsutaan törmäykseksi ja se on käsiteltävä jollakin törmäyksenkäsittelytekniikalla. Seuraavat tavat käsitellä törmäyksiä:
- Ketjutus: Ajatuksena on saada jokainen hash-taulukon solu osoittamaan linkitettyä luetteloa tietueista, joilla on sama hash-funktion arvo. Ketjuttaminen on yksinkertaista, mutta vaatii lisämuistia pöydän ulkopuolella.
- Avoin osoite: Avoimessa osoittamisessa kaikki elementit tallennetaan itse hash-taulukkoon. Jokainen taulukkomerkintä sisältää joko tietueen tai NIL:n. Elementtiä haettaessa tarkastellaan taulukkopaikkoja yksitellen, kunnes haluttu elementti löytyy tai on selvää, ettei elementtiä ole taulukossa.
Toteutus esimerkillä:
Vaihe 1: Luo HashTable-luokka taulukon ja koon alkuominaisuuksilla.
Vaihe 2: Lisää yksityinen setKey(avain) -funktio avainten muuntamiseksi indekseiksi.
Vaihe 3: Lisää insert()- ja get()-funktiot avainarvo-parien lisäämistä ja käyttöä varten taulukosta.
Vaihe 4: Lisää poista()-funktio poistaaksesi avaimen hash-taulukosta.
Esimerkki 1: Oletetaan, että meidän on tallennettava 5 numeroa 100, 87, 86, 12, 25 ja 9 hash-taulukkoon. Tässä tapauksessa luomme setKey-funktion, jossa otamme arvon argumenttina ja muunnamme sen hash-taulukon indeksiksi. Alla toteutus.
Javascript
// HashTable Implementation> class HashTable {> > constructor() {> > this> .table => new> Array(10);> > this> .size = 0;> > }> > // private function to convert key to index> > // _ shows that the function is private> > _setKey(key) {> > return> key % 10;> > }> > // insert value in the hashtable> > insert(value) {> > const index => this> ._setKey(value);> > this> .table[index] = value;> > this> .size++;> > }> > get(key) {> > const target => this> ._setKey(key);> > return> this> .table[target];> > }> > search(value) {> > const index => this> ._setKey(value);> > if> (> this> .table[index] == value)> > console.log(> 'The value is found at index : '> , index);> > else> > console.log(> 'Not found'> );> > }> > delete> (key) {> > const index => this> ._setKey(key);> > if> (> this> .table[index]) {> > this> .table[index] = [];> > this> .size--;> > return> true> ;> > }> else> {> > return> false> ;> > }> > }> }> const hashExample => new> HashTable();> // insert> hashExample.insert(100);> hashExample.insert(87);> hashExample.insert(86);> hashExample.insert(12);> hashExample.insert(9);> console.log(hashExample.table);> // ->näyttää hash-taulukon> // search> hashExample.search(87);> // found> hashExample.search(10);> // not found> // delete> hashExample.> delete> (12);> // showing table after deletion> console.log(hashExample.table);> |
Lähtö:
[ 100, , 12, , 86, 87, , 9 ] The value is found at index : 7 Not found [ 100, , [], , 86, 87, , 9 ]
Tulosteessa tai näyttää, että taulukossa on 1 tai 3 peräkkäistä tyhjää tilaa/indeksiä.
Esimerkki 2: Oletetaan, että haluamme tallentaa 5-jäsenisen perheen yhteystiedot hash-taulukkoon. Tätä varten luomme hash-taulukon, jonka koko on 10 ja tallennamme yhteystiedot. Indeksi asetetaan käyttämällä setKey private -toimintoa, joka muuntaa yhteyshenkilön numeron viimeisen numeron hash-taulukon indeksiksi.
Javascript
// HashTable Implementation> class HashTable {> > constructor() {> > this> .table => new> Array(10);> > this> .size = 0;> > }> > // private function to convert key to index> > // _ shows that the function is private> > _setKey(key) {> > const lastDigit = key % 10;> > return> lastDigit;> > }> > // insert value in the hashtable> > insert(value) {> > const index => this> ._setKey(value);> > this> .table[index] = value;> > this> .size++;> > }> > get(key) {> > const target => this> ._setKey(key);> > return> this> .table[target];> > }> > search(value) {> > const index => this> ._setKey(value);> > if> (> this> .table[index] == value)> > console.log(> 'The contact number is found at index : '> , index);> > else> > console.log(> 'Contact Number not found'> );> > }> > delete> (key) {> > const index => this> ._setKey(key);> > if> (> this> .table[index]) {> > this> .table[index] = [];> > this> .size--;> > return> true> ;> > }> else> {> > return> false> ;> > }> > }> }> const hashExample => new> HashTable();> // insert> hashExample.insert(98754525);> hashExample.insert(98747512);> hashExample.insert(94755523);> hashExample.insert(92752521);> hashExample.insert(98556529);> console.log(hashExample.table);> // ->näyttää hash-taulukon> // search> hashExample.search(92752521);> // found> hashExample.search(92755784);> // not found> // delete> hashExample.> delete> (92752521);> // showing table after deletion> console.log(hashExample.table);> |
Lähtö:
[ , 92752521, 98747512, 94755523, , 98754525, , 98556529 ] The contact number is found at index : 1 Contact Number not found [ , [], 98747512, 94755523, , 98754525, , 98556529 ]
Tulosteessa tai näyttää, että taulukossa on 1 tai 3 peräkkäistä tyhjää tilaa/indeksiä.