Filme porno

Categorii

Advertising

Implementare HashMap pentru Java

HashMap este o structura de date a dictionarului furnizata de java. Este o clasa de colectare bazata pe harta, care este utilizata pentru a stoca date in perechi cheie si valoare. In acest articol, vom crea propria noastra implementare hashmap.

Avantajul utilizarii acestei structuri de date este recuperarea mai rapida a datelor. In cel mai bun caz, are o complexitate de acces la date O (1).

In termeni laici, a pentru fiecare cheie obtinem valoarea asociata.

Pentru a implementa aceasta structura,

  1. Avem nevoie de o lista pentru a stoca toate cheile
  2. Cheie – Relatie valoare pentru a obtine valoare bazata pe cheie

Putem avea o lista care contine toate cheile, valorile si pentru a accesa trebuie sa le cautam pe toate.

Dar punctul principal al hartii hash este de a accesa tastele mai repede in timp de acces 0 (1).

Aici intra in joc hashing. Putem hash cheia si o putem asocia cu indexul pentru a prelua datele mai repede.

Array

Hash vine si cu o problema, coliziune. Este intotdeauna recomandat sa utilizati o functie hash mai buna, care poate reduce sansele de coliziune.

Mai multe hash pot avea aceeasi cheie hash. Din acest motiv, exista o galeata sau un container pentru fiecare cheie in care toate valorile sunt stocate daca are loc o coliziune.

Sa ne scufundam intr-o implementare de baza a hashmap-ului nostru.

In primul rand, avem nevoie de o matrice pentru a stoca toate cheile, un model de bucket pentru a stoca toate intrarile si un wrapper pentru cheia noastra, perechea de valori.

public class MyKeyValueEntry <K, V> {

cheie K privata;

valoare V privata;

public MyKeyValueEntry (cheie K, valoare V) {

this.key = cheie;

this.value = valoare;

}

// getters & seters

// hashCode & egals

}

Bucket pentru a stoca toate valorile cheie

public class MyMapBucket {

private List <MyKeyValueEntry> intrari;

public MyMapBucket () {

if (entries == null) {

entries = new LinkedList <> ();

}

}

public List <MyKeyValueEntry> getEntries () {

return entry;

}

public void addEntry (MyKeyValueEntry entry) {

this.

entries.add (intrare);

}

public void removeEntry (intrarea MyKeyValueEntry) {

this.entries.remove (intrare);

}

}

In cele din urma, implementarea hashmap-ului nostru

public class MyHashMap <K, V> {

private int CAPACITY = 10;

private MyMapBucket [] bucket;

private int size = 0;

public MyHashMap () {

this.bucket = new MyMapBucket [CAPACITY];

}

private int getHash (cheia K) {

return (key.hashCode () & 0xfffffff)% CAPACITY;

}

private MyKeyValueEntry getEntry (cheie K) {

int hash = getHash (cheie);

for (int i = 0; i <bucket [hash] .getEntries (). size (); i ++) {

MyKeyValueEntry myKeyValueEntry = bucket [hash] .getEntries (). get (i);

if (myKeyValueEntry.getKey (). equals (key)) {

return myKeyValueEntry;

}

}

return nul;

}

public void pus (cheie K, valoare V) {

if (

contineCheie (cheie)) { MyKeyValueEntry entry = getEntry (cheie);

entry.setValue (valoare);

} else {

int hash = getHash (cheie);

if (bucket [hash] == null) {

bucket [hash] = new MyMapBucket ();

}

bucket [hash] .addEntry (new MyKeyValueEntry <> (cheie, valoare));

dimensiune ++;

}

}

public V get (cheie K) {

returnare contineCheie (cheie)? (V) getEntry (cheie) .getValue (): nul;

}

booleanul public contine Cheie (cheie K) { int hash = getHash (cheie);

return! (Objects. isNull (bucket [hash]) || Objects. isNull (getEntry (cheie)));

}

public void delete (cheie K) {

if (

contineCheie (cheie) ) { int hash = getHash (cheie);

bucket [hash] .removeEntry (getEntry (cheie));

marimea–;

}

}

public int size () {

return size;

}

}

Puneti pe harta:

  1. Daca cheia exista deja, actualizati valoarea acelei chei.
  2. In caz contrar, adaugati o intrare in cupa.

Obtineti de pe harta:

  1. Verificati daca exista cheia si returnati datele.

Contine:

  1. Verificati daca cupa este nula
  2. Daca nu, atunci cupa contine cheia.

Performanta:

Are performanta de O (1) in cel mai bun caz si de O (n) in cel mai rau caz.

Imbunatatirea Java:

  1. Din versiunea Java 8, toate implementarile de Harti bazate pe hash: HashMap, Hashtable, LinkedHashMap, WeakHashMap si ConcurrentHashMap sunt modificate pentru a utiliza un algoritm de hash imbunatatit pentru tastele siruri atunci cand capacitatea tabelului hash a crescut vreodata peste 512 intrari. Implementarea imbunatatita a hashului foloseste algoritmul de hash murmur3 impreuna cu seminte hash aleatorii si masti index. Aceste imbunatatiri atenueaza cazurile in care valorile de hash String in coliziune ar putea duce la un blocaj de performanta. Implementare alternativa a hashului String
  2. Din versiunea Java 8, odata ce numarul de articole dintr-o galeata de hash creste peste un anumit prag, acea galeata va trece de la utilizarea unei liste legate de intrari la un arbore echilibrat. In cazul coliziunilor mari de hash, acest lucru va imbunatati performantele cele mai nefavorabile de la O (n) la O (log n). Manipulati frecvente coliziuni HashMap cu copaci echilibrati.

Caracteristici Java Hashmap:

  • Capacitatea initiala implicita este 16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

  • Factorul de incarcare utilizat atunci cand niciunul nu este specificat in constructor.

float final static DEFAULT_LOAD_FACTOR = 0,75f;

  • Pragul de numarare a cosurilor pentru utilizarea unui copac, mai degraba decat pentru o lista. Cosurile sunt convertite in copaci atunci cand se adauga un element intr-un cos cu cel putin atat de multe noduri.

static final int TREEIFY_THRESHOLD = 8;

  • Pragul de numarare a cosului pentru dezarhivarea unui cos (divizat) in timpul unei operatii de redimensionare.

static final int UNTREEIFY_THRESHOLD = 6;

  • O instanta a HashMap are doi parametri care ii afecteaza performanta: capacitatea initiala si factorul de incarcare .

    * Capacitatea este numarul de galeti din tabelul hash si

    * capacitatea initiala este pur si simplu capacitatea in momentul crearii tabelei hash. Factorul de sarcina e o masura a cat de plin este permisa tabelul hash pentru a obtine inainte de capacitatea sa este crescuta in mod automat. Atunci cand numarul de intrari in tabelul hash depaseste produsul factorului de incarcare si capacitatea curenta, tabelul hash este refacut (adica structurile de date interne sunt reconstruite), astfel incat tabelul hash are aproximativ de doua ori numarul de cupe.

  • Ca regula generala, factorul de incarcare implicit (.75) ofera un bun compromis intre costurile de timp si spatiu.

    * Valorile mai mari scad cheltuielile de spatiu, dar cresc costul de cautare (reflectat in majoritatea operatiunilor clasei HashMap, inclusiv get si put).

    Numarul asteptat de intrari pe harta si factorul de incarcare al acesteia ar trebui sa fie luate in considerare la stabilirea capacitatii sale initiale, astfel incat sa se minimizeze numarul de operatii de reharire.

    * In cazul in care capacitatea initiala este mai mare decat numarul maxim de intrari impartit la factorul de incarcare, nu vor avea loc niciodata operatii de remaniere.

Acest articol este postat si in blogul meu personal.

Video Description:

HashMap este o structura de date a dictionarului furnizata de java. Este o clasa de colectare bazata pe harta, care este utilizata pentru a stoca date in perechi cheie si valoare. In acest articol, vom crea propria noastra implementare hashmap.Avantajul utilizarii acestei structuri de date este recuperarea mai rapida a datelor. In cel mai bun caz, are o complexitate de acces la date O (1).In termeni laici, a pentru fiecare cheie obtinem valoarea asociata.Pentru a implementa aceasta structura,Avem nevoie de o lista pentru a stoca toate cheileCheie - Relatie valoare pentru a obtine valoare bazata pe cheiePutem avea o lista care contine toate cheile, valorile si pentru a accesa trebuie sa le cautam pe toate.Dar punctul principal al hartii hash este de a accesa tastele mai repede in timp de acces 0 (1).Aici intra in joc hashing. Putem hash cheia si o putem asocia cu indexul pentru a prelua datele mai repede. Array Hash vine si cu o problema, coliziune. Este intotdeauna recomandat sa utilizati o functie hash mai buna, care poate reduce sansele de coliziune.Mai multe hash pot avea aceeasi cheie hash. Din acest motiv, exista o galeata sau un container pentru fiecare cheie in care toate valorile sunt stocate daca are loc o coliziune.Sa ne scufundam intr-o implementare de baza a hashmap-ului nostru.In primul rand, avem nevoie de o matrice pentru a stoca toate cheile, un model de bucket pentru a stoca toate intrarile si un wrapper pentru cheia noastra, perechea de valori.public class MyKeyValueEntry <K, V> { cheie K privata; valoare V privata;public MyKeyValueEntry (cheie K, valoare V) { this.key = cheie; this.value = valoare; }// getters & seters // hashCode & egals }Bucket pentru a stoca toate valorile cheiepublic class MyMapBucket { private List <MyKeyValueEntry> intrari;public MyMapBucket () { if (entries == null) { entries = new LinkedList <> (); } }public List <MyKeyValueEntry> getEntries () { return entry; }public void addEntry (MyKeyValueEntry entry) { this. porno femme noir mynationalamusements.biz porno vint iface.net porno legging staging.pro porno 1900 www.littlesamaritan.net petite bite porno www.cmc-bio.net porno asmr palmsholding.net premier casting porno www.ajcampos.org porno maroc carhack.org kinsey wolanski porno chanl.com deutsch porno www.uonuma-kome.com porno hu mimosalonandspa.com tournage film porno www.factorydirectgift.com porno teen deltaemail.com ecoliere porno karennagore.net porno cunilingus www.kkpgitamandir.org.pm porno taxi ata-karateforkids.com fre porno www.tasteofginger.com porno malgache choupalfresh.biz porno ado gay wdg.sarahlawrence.net porno belle soeur www.turnerdrake.com entries.add (intrare); }public void removeEntry (intrarea MyKeyValueEntry) { this.entries.remove (intrare); } }In cele din urma, implementarea hashmap-ului nostrupublic class MyHashMap <K, V> { private int CAPACITY = 10; private MyMapBucket [] bucket; private int size = 0;public MyHashMap () { this.bucket = new MyMapBucket [CAPACITY]; } private int getHash (cheia K) { return (key.hashCode () & 0xfffffff)% CAPACITY; }private MyKeyValueEntry getEntry (cheie K) { int hash = getHash (cheie); for (int i = 0; i <bucket [hash] .getEntries (). size (); i ++) { MyKeyValueEntry myKeyValueEntry = bucket [hash] .getEntries (). get (i); if (myKeyValueEntry.getKey (). equals (key)) { return myKeyValueEntry; } } return nul; }public void pus (cheie K, valoare V) { if ( contineCheie (cheie)) { MyKeyValueEntry entry = getEntry (cheie); entry.setValue (valoare); } else { int hash = getHash (cheie); if (bucket [hash] == null) { bucket [hash] = new MyMapBucket (); } bucket [hash] .addEntry (new MyKeyValueEntry <> (cheie, valoare)); dimensiune ++; } }public V get (cheie K) { returnare contineCheie (cheie)? (V) getEntry (cheie) .getValue (): nul; }booleanul public contine Cheie (cheie K) { int hash = getHash (cheie); return! (Objects. isNull (bucket [hash]) || Objects. isNull (getEntry (cheie))); }public void delete (cheie K) { if ( contineCheie (cheie) ) { int hash = getHash (cheie); bucket [hash] .removeEntry (getEntry (cheie)); marimea--; } } public int size () { return size; } }Puneti pe harta:Daca cheia exista deja, actualizati valoarea acelei chei.In caz contrar, adaugati o intrare in cupa.Obtineti de pe harta:Verificati daca exista cheia si returnati datele.Contine:Verificati daca cupa este nulaDaca nu, atunci cupa contine cheia.Performanta:Are performanta de O (1) in cel mai bun caz si de O (n) in cel mai rau caz.Imbunatatirea Java:Din versiunea Java 8, toate implementarile de Harti bazate pe hash: HashMap, Hashtable, LinkedHashMap, WeakHashMap si ConcurrentHashMap sunt modificate pentru a utiliza un algoritm de hash imbunatatit pentru tastele siruri atunci cand capacitatea tabelului hash a crescut vreodata peste 512 intrari. Implementarea imbunatatita a hashului foloseste algoritmul de hash murmur3 impreuna cu seminte hash aleatorii si masti index. Aceste imbunatatiri atenueaza cazurile in care valorile de hash String in coliziune ar putea duce la un blocaj de performanta. Implementare alternativa a hashului StringDin versiunea Java 8, odata ce numarul de articole dintr-o galeata de hash creste peste un anumit prag, acea galeata va trece de la utilizarea unei liste legate de intrari la un arbore echilibrat. In cazul coliziunilor mari de hash, acest lucru va imbunatati performantele cele mai nefavorabile de la O (n) la O (log n). Manipulati frecvente coliziuni HashMap cu copaci echilibrati.Caracteristici Java Hashmap:Capacitatea initiala implicita este 16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;Factorul de incarcare utilizat atunci cand niciunul nu este specificat in constructor.float final static DEFAULT_LOAD_FACTOR = 0,75f;Pragul de numarare a cosurilor pentru utilizarea unui copac, mai degraba decat pentru o lista. Cosurile sunt convertite in copaci atunci cand se adauga un element intr-un cos cu cel putin atat de multe noduri.static final int TREEIFY_THRESHOLD = 8;Pragul de numarare a cosului pentru dezarhivarea unui cos (divizat) in timpul unei operatii de redimensionare.static final int UNTREEIFY_THRESHOLD = 6;O instanta a HashMap are doi parametri care ii afecteaza performanta: capacitatea initiala si factorul de incarcare . * Capacitatea este numarul de galeti din tabelul hash si * capacitatea initiala este pur si simplu capacitatea in momentul crearii tabelei hash. Factorul de sarcina e o masura a cat de plin este permisa tabelul hash pentru a obtine inainte de capacitatea sa este crescuta in mod automat. Atunci cand numarul de intrari in tabelul hash depaseste produsul factorului de incarcare si capacitatea curenta, tabelul hash este refacut (adica structurile de date interne sunt reconstruite), astfel incat tabelul hash are aproximativ de doua ori numarul de cupe.Ca regula generala, factorul de incarcare implicit (.75) ofera un bun compromis intre costurile de timp si spatiu. * Valorile mai mari scad cheltuielile de spatiu, dar cresc costul de cautare (reflectat in majoritatea operatiunilor clasei HashMap, inclusiv get si put). Numarul asteptat de intrari pe harta si factorul de incarcare al acesteia ar trebui sa fie luate in considerare la stabilirea capacitatii sale initiale, astfel incat sa se minimizeze numarul de operatii de reharire. * In cazul in care capacitatea initiala este mai mare decat numarul maxim de intrari impartit la factorul de incarcare, nu vor avea loc niciodata operatii de remaniere.Acest articol este postat si in blogul meu personal.

Categorie:
Taguri:
Data adaugarii: