В результате я создал простой линейный зонд HashTable из примера here. Я использовал функцию хеша MurmurHash3, так как мои данные рандомизированы.
Я изменил хэш-таблицу следующим образом:
- Размер параметр шаблона. Внутренне размер удваивается. Для реализации требуется мощность 2-х размеров и традиционно изменяется на 75%. Поскольку я знаю, что собираюсь заполнять хэш-таблицу, я упреждающе удваиваю емкость, чтобы сохранить ее достаточно разреженной. Это может быть менее эффективным при добавлении небольшого количества объектов, но оно более эффективно, когда емкость начинает заполняться. Поскольку я не могу изменить размер, я решил начать его удвоение по размеру.
- Я не разрешаю хранить ключи со значением нуля. Это нормально для моего приложения, и он сохраняет код простым.
- Все изменения размера и удаления удаляются, заменяется на одну операцию очистки, которая выполняет функцию memset.
- Я выбрал встроенные функции вставки и поиска, так как они довольно малы.
Это быстрее, чем мое красное/черное дерево. Единственное изменение, которое я могу сделать, - это пересмотреть схему хэширования, чтобы увидеть, есть ли что-то в ключах источника, которые помогут сделать более дешевый хеш.
Billy ONeal предложил, учитывая небольшое количество элементов (1024), что простой линейный поиск в фиксированном массиве будет быстрее. Я следовал его совету и реализовал один для сравнения. На моем целевом оборудовании (примерно в первом поколении iPhone) хэш-таблица превзошла линейный поиск в два раза. При меньших размерах (256 элементов) хэш-таблица была еще выше. Конечно, эти значения зависят от оборудования. Размеры линии кэша и скорость доступа к памяти ужасны в моей среде. Тем не менее, другие, которые ищут решение этой проблемы, были бы умны, чтобы следовать его советам и сначала попытаться профилировать их.
Внесите вместо этого хэш-таблицу. Поскольку вы знаете максимальное количество элементов спереди, это плавное плавание (т. Е. Вам не нужна сложная хеш-функция). – 101010
@ 40two Учитывая, что ключ случайным образом распределен, вы можете рекомендовать эффективную функцию хеширования? И какой хэш-стол - линейное зондирование, ведра? – Steven
Используйте буфер размера 1024. Ключ будет использоваться для индексации буфера. – 101010