Tutorial 7.1 - Frequency vector

Frequency vector

Ne dorim:

  • să arătăm funcționalitățile unui HashTable
  • să simulăm funcționalitățile unui vector de frecvență

Frequency vector

În acest tutorial vom folosi clasa std::map din STL. Pentru mai multe detalii, vă sugerăm să citiți documentația oficială ( std::map).

Atenție! Este nevoie să includem biblioteca queue.

#include <map> // std::map

Clasa std::map oferă toate funcționalitățile uzuale pentru un HashTable. Menționăm că nu există o implementare unică, astfel încât apar diferențe față de implementările sugerate în articol (de exemplu cheile din map sunt unice). În continuare ne vom referi doar la următoatele funcționalități:

  • metoda insert - inserează o pereche (key, value)
  • metoda erase - șterge valoarea asociată cu o anumită cheie
  • metoda empty - verifică dacă structura nu conține nici o pereche
  • metoda size - returnează numărul de perechi din map
  • operatorul de indexare [] - care primește ca paramtru o cheie și returnează referință către valoarea asociată (dacă cheia nu exista în map, aceasta va fi introdusă automat iar valoarea asociată este data de constructorul default al tipului pe care il au valorile)

Implementare cu std::map

Se dă un număr n foarte mare și n stringuri. Se cere să se afișeze pe ecran numărul de apariții al fiecărui string utilizând un spațiu de memorie cât mai mic.

Soluție: Vom simula funcționalitatea unui vector de frecvență folosinf std::map.

#include <iostream> // std::cout
#include <map> // std::map
 
int main() {
	int n; // numarul de elemente din lista
	std::string x; // variabila temporara
	std::map <std::string, int> hash; // map-ul (hash-ul) folosit
 
	// citire elemente si adaugare in stiva
	std::cout << "n = ";
	std::cin >> n;
	for (int i = 0; i < n; ++i) {
		// citeste un alt element
		std::cout << "x = ";
		std::cin >> x; 
 
		// adauga o aparitie a lui x
		++hash[ x ]; 
 
		// afisare statistici
		std::cout << x  << " apare de " << hash[x] << " ori; hash size = " << hash.size() << "\n";
	}
 
	// parcurgerea elementelor din hash
	std::cout << "Stare finala hash\n";
	std::cout << "hash size = " << hash.size() << '\n';
 
	for (std::map <std::string, int> :: iterator it = hash.begin(); it != hash.end(); ++it) {
		// extrag key si value
		std::string key = it->first;
		int value = it->second;
 
		// afisez de cate ori a fost intalnit key
		std::cout << key  << " apare de " << value << " ori\n";
	}
 
	std::cout << "Golesc hash\n";
	hash.clear();
	std::cout << (hash.empty() ? "Hash gol" : "Hash contine elemente") << '\n';
 
	return 0;
}

Testare

Compilare

g++ main.cpp -o main

Exemple:

./main
 
n = 10
 
x = SD
SD apare de 1 ori; hash size = 1
 
x = PL
PL apare de 1 ori; hash size = 2
 
x = MN
MN apare de 1 ori; hash size = 3
 
x = SD
SD apare de 2 ori; hash size = 3
 
x = SD
SD apare de 3 ori; hash size = 3
 
x = PL
PL apare de 2 ori; hash size = 3
 
x = CMOS
CMOS apare de 1 ori; hash size = 4
 
x = BUCURIE
BUCURIE apare de 1 ori; hash size = 5
 
x = cmos
cmos apare de 1 ori; hash size = 6
 
x = proiect
proiect apare de 1 ori; hash size = 7
 
Stare finala hash
hash size = 7
 
BUCURIE apare de 1 ori
CMOS apare de 1 ori
MN apare de 1 ori
PL apare de 2 ori
SD apare de 3 ori
cmos apare de 1 ori
proiect apare de 1 ori
 
Golesc hash
Hash gol
sd-ca/2016/articole/tutorial-07-1.txt · Last modified: 2017/02/04 23:00 by alexandru.olteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0