После комментария "onebyone" я реализовал и протестировал несколько версий хеширования Cuckoo, чтобы определить реальную потребность в памяти.
После некоторого эксперимента утверждение о том, что вам не нужно перефразировать до тех пор, пока таблица не заполнится почти на 50%, похоже на правду, особенно если реализован трюк " stash ".
Проблема в том, когда вы увеличиваете стол. Обычный подход заключается в удвоении его размера, но это приводит к тому, что новая таблица используется только на 25%!
На самом деле, предположим, что в хеш-таблице 16 слотов, когда я вставлю номер 8-го элемента, у меня закончатся хорошие слоты, и мне придется их перепрошивать. Я удвою его, и теперь стол на 32 слота, из которых только 8 заняты, что составляет 75% отходов!
Это цена, которую нужно заплатить, чтобы иметь «постоянное» время поиска (в терминах верхней границы для числа доступа / сравнения).
Я разработал другую схему: начиная с степени 2 больше 1, если таблица имеет n слотов, а n - степень двух, добавьте n / 2 слота, в противном случае добавьте n / 3 слота:
+--+--+
| | | 2 slots
+--+--+
+--+--+--+
| | | | 3 slots
+--+--+--+
+--+--+--+--+
| | | | | 4 slots
+--+--+--+--+
+--+--+--+--+--+--+
| | | | | | | 6 slots
+--+--+--+--+--+--+
+--+--+--+--+--+--+--+--+
| | | | | | | | | 8 slots
+--+--+--+--+--+--+--+--+
и т.д.
Вместе с допущением, что повторное перенаправление будет происходить только тогда, когда таблица заполнена на 50%, это приводит к тому, что таблица будет пуста только на 66% (1/3), а не на 75% (1/4) после перерыв (то есть наихудший случай).
Я также выяснил (но мне все еще нужно проверить математику), что при каждом увеличении на sqrt (n) потраченное пространство асимптотически приближается к 50%.
Конечно, цена, которую нужно платить за меньшее потребление памяти, - это увеличение количества повторов, которое потребуется в конце. Увы, ничего не приходит бесплатно.
Я собираюсь продолжить расследование, если кому-то будет интересно.