Skip to content

Commit 25e3db9

Browse files
Merge pull request #12 from CodeSopranos/vadik_alp/dev
readme + code style
2 parents 200cfe8 + 160145c commit 25e3db9

18 files changed

+1028
-1267
lines changed

README.md

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,63 @@
1-
# hashing-algorithms
2-
3-
## Лабораторная работа №1 Построение идеальной хеш-таблицы (без коллизий).
4-
Целью данной работы является сравнение следующих подходов:
5-
1) Квадратичный подход к построению идеальной хеш-таблицы; (см. Кормен, 3-е издание,
6-
11.5 Идеальное хеширование, или видео запись)
7-
2) Двух-уровневый подход к построению идеальной хеш-таблицы; (см. Кормен, 3-е издание,
8-
11.5 Идеальное хеширование, или видео запись)
9-
3) (опционально) Графовый подход к построению идеальной хеш-таблицы
10-
(см. https://habrahabr.ru/post/254431/, вот исходная статья, обязательно посмотрите
11-
http://cmph.sourceforge.net/papers/chm92.pdf).
12-
Что измеряется?
13-
1) Время построения хеш-таблицы;
14-
2) Время операции поиска элемента;
15-
3) Затрачиваемая память
16-
Замечание: В качестве хеш-функций используйте только функции из универсальных
17-
семейств, про них рассказывалось на семинарах. Список универсальных хеш-функций
18-
можно найти здесь https://en.wikipedia.org/wiki/Universal_hashing.
19-
Замечание: Для двух-уровневой хеш-таблицы нужно обязательно провести эксперименты с
20-
разлиными значениями параметров, разобраться как различные значения параметров влияют
21-
на производительность и найти оптимальный выбор параметров. Без этих экспериментов
22-
работа не будет зачтена. Про какие именно параметры идет речь смотрите в записи лекции.
23-
Входные данные:
24-
a) Случайные натуральные числа.
25-
б) Случайные вектора или строки.
26-
с) Очень бы хотелось увидеть как поведут себя таблицы на real life данных, например на
27-
словарях или словах какого нибудь литературного произведения.
28-
Ваш вывод должен содержать:
29-
1) Графики сравнения скорости построения и количества занимаемой памяти для подхода 1)
30-
при различных значениях параметров. Выбор оптимального, с Вашей точки зрения, набора
31-
параметров.
32-
2) График сравнения скорости построения хеш-таблиц для подходов 1) 2) 3), причем для
33-
подхода 2) нужно использовать оптимальный набор параметров.
34-
3) График сравнения скорости поиска для обоих подходов.
35-
4) Все графики нужно продублировать, если Вы используете разные входные данные:
36-
случайные строки и real life данные.
37-
Итого, должно быть как минимум 4 картинки с несколькими кривыми на каждой.
38-
39-
## Лабораторная работа № 2. Сравнение различных подходов к хешированию.
40-
Целью данной работы является сравнение различных методов борьбы с коллизиями:
1+
# Сравнение различных подходов к хешированию.
2+
3+
Седунов Илья,<br>
4+
Альперович Вадим,<br>
5+
17 ПМИ
6+
7+
---
8+
9+
**Целью данной работы является сравнение различных методов борьбы с коллизиями:**
10+
4111
1) Метод цепочек;
12+
4213
2) Метод открытой адресации (см. Кормен, 3-е издание, 11.4 Открытая адреация);
14+
4315
3) Метод кукушки (см. https://en.wikipedia.org/wiki/Cuckoo_hashing).
44-
4) Для интереса, предлагается также сделать сравнения со стандартными средствами языка
45-
c++: std::map, std::hash_map. Вдруг получится их обогнать.
46-
Замечание: В качестве хеш-функций используйте только функции из универсальных
16+
17+
4) Для интереса, предлагается также сделать сравнения со стандартными средствами языка c++: std::map, std::hash_map. Вдруг получится их обогнать.
18+
19+
**Замечание:**
20+
В качестве хеш-функций используйте только функции из универсальных
4721
семейств, про них рассказывалось на семинарах. Список универсальных хеш-функций
4822
можно найти здесь https://en.wikipedia.org/wiki/Universal_hashing.
49-
Что измеряется?
23+
24+
**Что измеряется?**
25+
5026
1) Время вставки;
27+
5128
2) Время удаления;
29+
5230
3) Время поиска.
53-
Более конкретно об измерении:
31+
32+
**Более конкретно об измерении:**
5433
Нужно выбрать какое-то стартовое значение N, скажем 100, выбрать шаг step, скажем пусть
5534
step = 100, и выбрать максимальное значение, скажем 100 000. После чего нужно для каждого
5635
N с шагом step от минимального значения до максимального построить таблицу размера N
5736
(из случайных элементов, или сделать выборку из заранее подготовленной базы) и
5837
произвести одну или несколько операций (если несколько, скажем 10, то нужно усреднить).
5938
Измеряем именно время одной операции. Некоторые допускают ошибку и делают N вставок
6039
с замером времени, но не понятно, что в итоге Вы измерили.
61-
Входные данные:
40+
41+
**Входные данные:**
42+
6243
a) Случайные натуральные числа.
44+
6345
б) Случайные вектора или строки.
46+
6447
с) Очень бы хотелось увидеть как поведут себя таблицы на real life данных, например на
6548
словарях или словах какого нибудь литературного произведения.
66-
Ваш вывод должен содержать:
49+
50+
**Ваш вывод должен содержать:**
51+
6752
1) График зависимости скорости вставки от количества элементов в таблице;
53+
6854
2) График зависимости скорости удаления от количества элементов в таблице;
55+
6956
3) График зависимости скорости поиска от количества элементов в таблице;
57+
7058
На каждом графике должно быть несколько кривых, по одной или больше для каждого
71-
подхода. Заметим также, что таблицы из подходов 1) и 2) имеют дополнительный параметр m
59+
подхода.
60+
61+
Заметим также, что таблицы из подходов 1) и 2) имеют дополнительный параметр m
7262
– ёмкость таблицы. Хорошо бы построить на графиках кривые для разных значений m,
73-
например m = 2n, m = n, m = ½ n. Но это не обязательно.
63+
например m = 2n, m = n, m = ½ n. Но это не обязательно.

algorithm/include/ChainedHashMap.h

Lines changed: 73 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,103 @@
11
#pragma once
2-
#include <list>
3-
#include "VComparator.h"
4-
#include "UniversalHash.h"
52
#include "ChainedHashNode.h"
6-
3+
#include "UniversalHash.h"
4+
#include "VComparator.h"
5+
#include <list>
76

87
// Hash map class template
9-
template <typename K, typename V>
10-
class HashMap
11-
{
8+
template <typename K, typename V> class HashMap {
129
private:
13-
HashMap(const HashMap& other);
14-
const HashMap& operator=(const HashMap& other);
15-
// std::vector<HashNode<K, V>*> *table;
16-
KeyHash<K> hashFunc;
17-
HashNode<K, V>** table; // int *ptr;
18-
VComparator<K> comp;
19-
size_t tableSize;
10+
HashMap(const HashMap &other);
11+
const HashMap &operator=(const HashMap &other);
12+
// std::vector<HashNode<K, V>*> *table;
13+
KeyHash<K> hashFunc;
14+
HashNode<K, V> **table; // int *ptr;
15+
VComparator<K> comp;
16+
size_t tableSize;
2017

2118
public:
22-
HashMap(const size_t tableSize) :
23-
hashFunc(tableSize),
24-
comp()
25-
{
26-
this->tableSize = tableSize;
27-
table = new HashNode<K, V>*[tableSize]();
19+
HashMap(const size_t tableSize) : hashFunc(tableSize), comp() {
20+
this->tableSize = tableSize;
21+
table = new HashNode<K, V> *[tableSize]();
22+
}
23+
bool insert(const K &key, const V &value) {
24+
unsigned int hashValue = hashFunc[key];
25+
HashNode<K, V> *prev = NULL;
26+
HashNode<K, V> *entry = table[hashValue];
27+
// std::cout << "before while" << &entry <<std::endl;
28+
while (entry != NULL && !comp.compare(entry->getKey(), key)) {
29+
// std::cout << "entry != NULL" << std::endl;
30+
prev = entry;
31+
entry = entry->getNext();
2832
}
29-
bool insert(const K& key, const V& value)
30-
{
31-
unsigned int hashValue = hashFunc[key];
32-
HashNode<K, V>* prev = NULL;
33-
HashNode<K, V>* entry = table[hashValue];
34-
// std::cout << "before while" << &entry <<std::endl;
35-
while (entry != NULL && !comp.compare(entry->getKey(), key)) {
36-
// std::cout << "entry != NULL" << std::endl;
37-
prev = entry;
38-
entry = entry->getNext();
39-
}
4033

41-
if (entry == NULL) {
42-
// std::cout << "entry == NULL" << std::endl;
43-
entry = new HashNode<K, V>(key, value);
34+
if (entry == NULL) {
35+
// std::cout << "entry == NULL" << std::endl;
36+
entry = new HashNode<K, V>(key, value);
4437

45-
if (prev == NULL) {
46-
// insert as first bucket
47-
table[hashValue] = entry;
48-
return true;
38+
if (prev == NULL) {
39+
// insert as first bucket
40+
table[hashValue] = entry;
41+
return true;
4942

50-
}
51-
else {
52-
prev->setNext(entry);
53-
return true;
54-
}
43+
} else {
44+
prev->setNext(entry);
45+
return true;
46+
}
5547

56-
}
57-
else {
58-
// just update the value
59-
entry->setValue(value);
60-
return true;
61-
}
62-
return false;
48+
} else {
49+
// just update the value
50+
entry->setValue(value);
51+
return true;
6352
}
64-
bool search(const K& key, V& value)
65-
{
53+
return false;
54+
}
55+
bool search(const K &key, V &value) {
6656
unsigned int hashValue = hashFunc[key];
67-
HashNode<K, V>* entry = table[hashValue];
57+
HashNode<K, V> *entry = table[hashValue];
6858
unsigned int ccounter = 0;
6959
while (entry != NULL) {
70-
ccounter++;
71-
// std::cout << "hashkey: "<< hashValue << " value: " << entry->getValue() <<std::endl;
72-
if (comp.compare(entry->getKey(), key)) {
73-
value = entry->getValue();
74-
// std::cout << "Number of tries: "<< ccounter <<std::endl;
75-
return true;
76-
}
60+
ccounter++;
61+
// std::cout << "hashkey: "<< hashValue << " value: " << entry->getValue()
62+
// <<std::endl;
63+
if (comp.compare(entry->getKey(), key)) {
64+
value = entry->getValue();
65+
// std::cout << "Number of tries: "<< ccounter <<std::endl;
66+
return true;
67+
}
7768

78-
entry = entry->getNext();
69+
entry = entry->getNext();
7970
}
8071
// std::cout << "Number of tries: "<< ccounter <<std::endl;
8172
// std::cout << "UKNOWN KEY!"<< std::endl;
8273
return false;
83-
}
84-
85-
void remove(const K& key)
86-
{
87-
unsigned int hashValue = hashFunc[key];
88-
HashNode<K, V>* prev = NULL;
89-
HashNode<K, V>* entry = table[hashValue];
74+
}
9075

91-
while (entry != NULL && !comp.compare(entry->getKey(), key)) {
92-
prev = entry;
93-
entry = entry->getNext();
94-
}
76+
void remove(const K &key) {
77+
unsigned int hashValue = hashFunc[key];
78+
HashNode<K, V> *prev = NULL;
79+
HashNode<K, V> *entry = table[hashValue];
9580

96-
if (entry == NULL) {
97-
// key not found
98-
return;
81+
while (entry != NULL && !comp.compare(entry->getKey(), key)) {
82+
prev = entry;
83+
entry = entry->getNext();
84+
}
9985

100-
}
101-
else {
102-
if (prev == NULL) {
103-
// remove first bucket of the list
104-
table[hashValue] = entry->getNext();
86+
if (entry == NULL) {
87+
// key not found
88+
return;
10589

106-
}
107-
else {
108-
prev->setNext(entry->getNext());
109-
}
90+
} else {
91+
if (prev == NULL) {
92+
// remove first bucket of the list
93+
table[hashValue] = entry->getNext();
11094

111-
delete entry;
95+
} else {
96+
prev->setNext(entry->getNext());
11297
}
98+
99+
delete entry;
100+
}
113101
}
114102
// void displayHash() {
115103
// HashNode<K,V>* entry = NULL;
@@ -123,5 +111,4 @@ void remove(const K& key)
123111
// std::cout << std::endl;
124112
// }
125113
// }
126-
127114
};

0 commit comments

Comments
 (0)