Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Sfat achizitionare laptop gaming

Telefonul Oppo a74 mi-a blocat ca...

A inviat Mudava

Import china alibaba
 Facultate

Vouchere de vacanta

Cand One United nu mai vand isi v...

Mandolina feliat legume
 Atestat consilier de siguranta

alarma auto Autowatch 346 RLI

Ce se intampla cu actualii tineri...

Descifrare reteta
 Zapp fix

Rulment pt diferential 4motion

Lipire filtru la baterie ikea

Meserias nu mai vine sa termine l...
 

Hashtable

- - - - -
  • Please log in to reply
12 replies to this topic

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007
Buna ziua

Ati vazut cat de usoara si rapida este cautarea intr-un vector dupa indice: a[1], a[3000] ...
Ce ne facem insa daca vrem sa cautam dupa un sir de caractere, de exemplu a["blabla"] ?
Va prezint pentru asta un hashtable. Cautarea este foarta rapida si aproape independenta de numarul de inregistrari. Totodata este case-insensitive.

Orice critica e bine venita.
Arhiva contine si un program de test.

#2
AndreiASM

AndreiASM

    Active Member

  • Grup: Members
  • Posts: 1,021
  • Înscris: 24.06.2007
Interesant, bine gandit si util. Felicitari.

#3
msmihai

msmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 5,271
  • Înscris: 02.09.2006
L-am testat si eu . E ok clasa si din cate vad, merge cam la fel ca aceea din std ( map cred ca se numeste ) ... Bravo  ^_^

#4
sapho

sapho

    Active Member

  • Grup: Members
  • Posts: 1,578
  • Înscris: 22.09.2002
Critica :) :

- cel mai grav, din punctul meu de vedere - nu are documentatie...
- nu are unit teste - nu poti dovedi cat e de fiabil. Unit testele constituie si o buna documentatie la o adica.
- nu are un fel de insertOrChange() (put() ii zice in HashMap-ul din Java) - nu tot timpul cand ai ceva de pus in hashtable stii daca e sau nu deja introdus, si poate nici nu te intereseaza.

N-as folosi in nici un caz aceasta clasa in productie fara documentatie si unit teste...

Am gasit si vreo doua buguri (vezi, daca n-ai unit teste... :)):
	cls1::hashtable<string> htb13("");
	htb13.insert("key1", "val1");
	htb13.insert("key2", "val2");

	cout << "bug 1:" << endl;
	cout << "current = " << htb13.current().key << "; " <<  htb13.current().value << endl;
	htb13.move_next();
	cout << "current = " << htb13.current().key << "; " <<  htb13.current().value << endl;
	htb13.move_next();
	cout << "current = " << htb13.current().key << "; " <<  htb13.current().value << endl;

// aici crapa prima data, move_next() dereferentiaza ceva pointer NULL (cred).
	htb13.move_next();


// aici ai a doua problema (comenteaza codul de deasupra ca sa treaca de prima):

	cout << "bug 2:" << endl;

	htb13.begin();
	htb13.removeall();

// surprise! 
	cout << "current = " << htb13.current().key << "; " <<  htb13.current().value << endl;

// daca nu mai faci move_next() ca sa crape, nici n-ai zice ca tocmai ai facut removeall()...

	htb13.move_next();
	cout << "current = " << htb13.current().key << "; " <<  htb13.current().value << endl;
	htb13.move_next();
	cout << "current = " << htb13.current().key << "; " <<  htb13.current().value << endl;
	htb13.move_next();

spor

Edited by sapho, 06 October 2008 - 20:11.


#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007
Ms mult pentru pareri in special sapho
Am reparat cele doua bug'uri si am adaugat si changeorinsert

Documentia va urma :)

#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Nu m-am uitat pe cod, dar e reentrant/thread safe?

#7
johnnyl

johnnyl

    Junior Member

  • Grup: Members
  • Posts: 204
  • Înscris: 04.08.2004
Sper sa nu te deranjeze, dar am si eu cateva obiectii/pareri:
- codul e un pic dezordonat;
- insertOrChange() sugerata de cineva e de fapt functia de inserare, dar care nu esueaza daca exista deja cheia in hashtable; nu cred ca are rost sa existe doua functii pentru chestia asta;
- un hashtable are doi parametri, capacitate maxima si gradul de umplere; fiind o clasa generica, fara un scop anumit si exact, ambii ar trebui sa poata fi modificati (cu valori default alese cu grija); capacitatea maxima e de obicei un numar prim; gradul de umplere default se alege in functie de metoda de hash pe care o folosesti; cand se ajunge la gradul de umplere, se mareste capacitatea la urmatorul numar prim si se face rehash la tot tabelul;
- in loc de begin(), move_next(), operator++(), eof(), poti sa faci un iterator;
- daca dupa begin() tabelul este modificat, mai ai garantia ca te poti baza pe valoarea curenta? Daca tot s-a adus vorba de Java, implementarile din Java si C# invalideaza iteratorul daca se modifica tabelul;
- ar trebui sa faci niste teste sa vezi cat de "imprastiate" sunt cheile sau cum se distribuie in tabel;
- ar trebui sa faci niste teste sa vezi daca get/put bat spre timp constant.

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007

Quote

Nu m-am uitat pe cod, dar e reentrant/thread safe?

Nu am verificat inca.

View Postjohnnyl, on Oct 8 2008, 15:09, said:

Sper sa nu te deranjeze, dar am si eu cateva obiectii/pareri:
- codul e un pic dezordonat;

De acord, cu timpul tot mai imbunatatesc stilul.

- insertOrChange() sugerata de cineva e de fapt functia de inserare, dar care nu esueaza daca exista deja cheia in hashtable; nu cred ca are rost sa existe doua functii pentru chestia asta;

Le voi impreuna, va esua atunci doar daca sunt probleme cu memoria.

- un hashtable are doi parametri, capacitate maxima si gradul de umplere; fiind o clasa generica, fara un scop anumit si exact, ambii ar trebui sa poata fi modificati (cu valori default alese cu grija); capacitatea maxima e de obicei un numar prim; gradul de umplere default se alege in functie de metoda de hash pe care o folosesti; cand se ajunge la gradul de umplere, se mareste capacitatea la urmatorul numar prim si se face rehash la tot tabelul;

Urmeaza


- in loc de begin(), move_next(), operator++(), eof(), poti sa faci un iterator;

M-am gandit la asta dar nu stiu sa il fac.

- daca dupa begin() tabelul este modificat, mai ai garantia ca te poti baza pe valoarea curenta? Daca tot s-a adus vorba de Java, implementarile din Java si C# invalideaza iteratorul daca se modifica tabelul;

Nu te mai poti baza, cand apelezi insert() sau remove() se reapeleaza automat si begin(). Aici vor mai aparea schimbari dupa ce ma prind cum sa fac iteratorul

- ar trebui sa faci niste teste sa vezi cat de "imprastiate" sunt cheile sau cum se distribuie in tabel;

Urmeaza

- ar trebui sa faci niste teste sa vezi daca get/put bat spre timp constant.

Asta am probat. E ~ timp constant: cand am 1 milion de inregistrari cautarea are loc in ~ 6e-06 secunde, cand sunt 10 are loc in 4.5e-06 secunde. Asta depinde si de distributie


#9
johnnyl

johnnyl

    Junior Member

  • Grup: Members
  • Posts: 204
  • Înscris: 04.08.2004

View Postdani.user, on Oct 10 2008, 16:59, said:

Asta am probat. E ~ timp constant: cand am 1 milion de inregistrari cautarea are loc in ~ 6e-06 secunde, cand sunt 10 are loc in 4.5e-06 secunde. Asta depinde si de distributie

La teste cu 1 mil/10 mil de chei, de acord, timpii pot parea OK, dar nu ai cu ce sa-i compari ca sa vezi daca sunt liniari sau nu. In loc de timpul efectiv, incearca sa numeri operatiile (cate chei se verifica pana este gasita aia pe care o cauti). De aici iti poti face si o idee despre distributie. Timpul efectiv nu inseamna mare lucru. Mai ales ca la implementarea actuala cu siguranta este O(n) nu constant, pentru ca nu creste capacitatea maxima a tabelului.

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007
Ok, mersi de sugestie.
Cand am zis 10, ma refer la 10 nu 10 milioane :)

#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007
Update major :)
- Am rescris o parte din cod; acuma e mai "frumos" si usor de urmarit/inteles
- Am invatat cum sa fac un iterator

#12
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007
Am reparat un memory leak.

Attached Files



#13
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,259
  • Înscris: 24.02.2007
Cum s-a creat noul subforum Articole si cod sursa, cred ca acest topic s-ar potrivi acolo :)

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate