В целях обучения я пишу собственную реализацию хэш-карты.Я использую отдельную цепочку с заголовками списков в качестве темы.
Вот как будет выглядеть структура:
| 0 | ---> | 11 | ---> | 33 | ---> | -- | ---> | 121 | ---> | TAIL |
| 1 | ---> | 12 | ---> | 34 | ---> | -- | ---> | 122 | ---> | TAIL |
| - |
| - |
| - |
| D-1 | ---> | -- | ---> | -- | ---> | -- | ---> | -- | ---> | TAIL |
Это массив связанных списковгде
D = размер массива,
|11 |= элемент с ключом;11 Элементы AND вставляются в отсортированном виде
Алгоритм:
void Insert(key, value):
int bucket = hash_fn(key); // key % D, for now
// accessing this bucket or array-index in array is O(1)
// insert in linked list at the right position
LL[bucket]->insert(new object(key, value))
bool Lookup(key):
int bucket = hash_fn(key); // key % D, for now
// search for key in LL[bucket]
Концерн : если множество элементов сопоставлено с одним и тем же сегментом, поиск не будет O(1), фактически, он может стремиться к O (n).
Как я могу улучшить это?