После комментария от «onebyone», я внедрил и протестировал пару версий хэширования кукушки, чтобы определить реальную потребность в памяти.
После некоторого эксперимента претензия, которую вам не нужно вскрывать до тех пор, пока таблица не будет заполнена почти на 50%, кажется правдой, особенно если приманить «stash».
Проблема в том, когда вы увеличиваете стол. Обычный подход заключается в удвоении его размера, но это приводит к тому, что новая таблица используется только на 25%!
На самом деле предположим, что хеш-таблица имеет 16 слотов, когда я вставляю восьмой номер элемента, у меня заканчиваются хорошие слоты и вам придется разворачиваться. Я удвою его, и теперь на столе будет 32 слота, из которых только 8 из них заняты, что составляет 75% отходов!
Это цена, которую нужно заплатить, чтобы иметь «постоянное» время поиска (в терминах верхней границы для количества доступа/сравнения).
Я разработал другую схему: начиная с мощности 2 больше 1, если таблица имеет n слотов, а n - мощность двух, добавьте n/2 слота, добавьте n/3 слота:
+--+--+
| | | 2 slots
+--+--+
+--+--+--+
| | | | 3 slots
+--+--+--+
+--+--+--+--+
| | | | | 4 slots
+--+--+--+--+
+--+--+--+--+--+--+
| | | | | | | 6 slots
+--+--+--+--+--+--+
+--+--+--+--+--+--+--+--+
| | | | | | | | | 8 slots
+--+--+--+--+--+--+--+--+
т.д.
Вместе с предположением, что reashing будет происходить только, когда таблица 50% от полной, это приводит к тому, что таблица будет только 66% пустой (1/3-й), а чем 75% пустых (1/4) после разворота (то есть в худшем случае).
Я также выяснил (но мне все еще нужно проверить математику), каждый раз увеличивая значение sqrt (n), потерянное пространство асимптотически приближается к 50%.
Конечно, цена за меньшее потребление памяти - это увеличение числа оборотов, которые понадобятся в конце. Увы, ничего не приходит бесплатно.
Я собираюсь исследовать дальше, если кому-то это интересно.
Вы, вероятно, получите downvoted для требования «non GPL» ... :-))) – 2008-10-23 20:54:15
Нам действительно нужен кукушка-хэширующий тег? Честно говоря ... – 2008-10-23 20:55:33
Надеюсь, что нет - я знаю, что энтузиасты GPL могут быть агрессивными, но я надеюсь, что они могут увидеть необходимость в других лицензиях и, по крайней мере, быть терпимыми. – 2008-10-23 20:55:48