Реально, у вас есть массив с небольшим фиксированным количеством сегментов, которые либо используют цепочку (результат в связанном списке) или зондирование (худший пример: если взята хеш (x), попробуйте хеш (x) +1 ) на столкновения. Вы берете свой uint32 и мод по размеру корзины, простейший случай.
Вы можете определить коэффициент загрузки - как только вы доберетесь до N% заполненного массива, мы, скажем, удвоим размер массива и перефразируем все в новый массив. Скажем, где-то между 50% и 75% использования.
Ну, разве это не дорого, говорите? Ну не совсем. Допустим, вы удваиваете размер массива каждый раз. Итак, вы добавляете N элементов, последний из которых вызывает копию. N добавляет в O (1), а затем одну O (N) копию. Но подождите - O (N) / N составляет в среднем O (1), поэтому амортизированная средняя стоимость добавления по-прежнему равна O (1), при условии, что ваш коэффициент загрузки выбран правильно.