Этот совет предполагает современный процессор с:
- быстрые кэши
- намного меньшая латентность памяти по сравнению с тактовой частотой.
- разумный прогноз ветвления (действительно потрясающий в последних процессорах для настольных ПК / серверов)
Я бы предположил, что гибридные структуры вполне могут превзойти одну структуру.
Использование простых пар ключей на основе массива с доступом O (N), как уже упоминалось, но с очень низкими постоянными коэффициентами и чрезвычайно хорошим поведением кэширования. Эта исходная структура должна быть небольшой (вероятно, не больше 16 и, возможно, 8 значений), чтобы избежать выхода за пределы одной строки кэша. К сожалению, это параметр, который вам нужно настроить самостоятельно.
Как только вы выйдете за пределы этого числа, вы захотите вернуться к структуре с лучшим поведением O (N), я бы предложил начать с приличной хеш-таблицы, так как это, вероятно, будет разумно в диапазоне от 16 до нескольких тысяч и если вы склонны искать похожие значения чаще, они будут оставаться в более быстрых кешах.
Если вы также удалите , а также вставку, вы должны позаботиться о том, чтобы не перебегать назад и вперед между двумя состояниями. Требование уменьшить счет до половины отсечения для «обновления» до вторичной структуры должно предотвратить это, но помните, что любое детерминированное поведение перехода будет восприимчиво к входным данным в худшем случае.
Это может быть проблемой, если вы пытаетесь защитить себя от вредоносных входных данных. Если это так, использование случайного фактора в решении защищает от него. Вполне вероятно, что вас это не волнует, поскольку вы не упомянули об этом.
Если вы хотите, вы можете попытаться отсортировать исходный первичный массив, допуская двоичный поиск, который равен O (log (N)), но за счет более сложного поискового кода. Я бы подумал, что простой обход массива на самом деле превзойдет его, но вы захотите сравнить его с различными значениями N, это может позволить вам дольше придерживаться первичного массива, но я думаю, что это функция размера размера строки кэша больше, чем поведение O (N).
Другие опции включают в себя:
- Различная обработка всех значений ключа <256 и сохранение их в байтах <code>-> Структура пары массивов, экономящая место на ключах (и потенциально позволяющая им оставаться там при переключении на вторичную структуру), это может работать плохо из-за нужно распаковать массив на лету на родную длину слова.
- используя структуру типа trie, делающую байт во время ключа. Я сомневаюсь, что сложность этого сделает его эффективным на практике
Еще раз повторю очень хороший совет от kmkaplan. Тестируйте это полностью, избегая микробенчмарков. В таком анализе реальные числа могут удивительно отличаться от теории ...