Я пытаюсь разобраться в деталях HAMT. Я бы реализовал один сам на Java просто для понимания. Я знаком с Tries и думаю, что понял основную концепцию HAMT.
В основном,
Два типа узлов:
Ключ/значение
Key Value Node:
K key
V value
Показатель
Index Node:
int bitmap (32 bits)
Node[] table (max length of 32)
- Сгенерируйте 32-битный хэш для объекта.
- Шаг через хеш 5-бит за раз.
(0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-31)
примечание: последний шаг (7-й) занимает всего 2 бита. - At each step, find the position of that 5-bit integer in the bitmap. e.g.
integer==5 bitmap==00001
- If the bit is a 1 then that part of the hash exist.
- Если бит равен 0, то ключ не существует.
- If the key exists, find it's index into the table by counting the number of 1s in the bitmap between 0 and the position. e.g.
integer==6 bitmap==0101010101 index==3
- If the table points to a key/value node then compare the keys.
- Если таблица указывает на индексный узел, перейдите к 2, продвигаясь на один шаг вперед.
Часть, которую я не совсем понимаю, - это обнаружение и смягчение столкновений. В связанной статье он намекает на это:
Затем существующий ключ вставляется в новую вложенную хеш-таблицу и добавляется новый ключ. Каждый раз, когда используются еще 5 бит хеша, вероятность коллизии уменьшается в 1/32 раза. Иногда может использоваться весь 32-битный хэш, и для различения двух ключей необходимо вычислить новый.
Если бы я вычислил «новый» хэш и сохранил объект в этом новом хеше; как бы вы могли найти объект в структуре? При поиске не будет ли он генерировать «исходный» хеш, а не «повторно вычисленный хэш».
Я должен что-то упустить.....
Кстати: HAMT работает довольно хорошо, в моих тестах он находится между хэш-картой и древовидной картой.
Data Structure Add time Remove time Sorted add time Sorted remove time Lookup time Size
Java's Hash Map 38.67 ms 18 ms 30 ms 15 ms 16.33 ms 8.19 MB
HAMT 68.67 ms 30 ms 57.33 ms 35.33 ms 33 ms 10.18 MB
Java's Tree Map 86.33 ms 78 ms 75 ms 39.33 ms 76 ms 8.79 MB
Java's Skip List Map 111.33 ms 106 ms 72 ms 41 ms 72.33 ms 9.19 MB