Сейчас на форуме: Rio, tyns777, zombi-vadim (+5 невидимых) |
eXeL@B —› Программирование —› Сверх быстрая хештаблица. |
Посл.ответ | Сообщение |
|
Создано: 04 мая 2015 00:06 · Поправил: Nimnul · Личное сообщение · #1 Для одной задачи, мне потребовалась хештаблица, которая должна отдавать элемент строго за O(1), а добавлять элемент можно хоть полгода. Это связанно с тем, что на одно добавление приходится приблизительно 1 << 45 чтений. Вопрос тут упирается в разруливание коллизий. Классические методы для этой задачи не подходят. Т.е. метод со связанными списками, двойным хешированием или методы последовательных проб. Все эти методы, уже делают доступ к элементам больше чем за O(1), даже O(2) уже плохо. Вобщем я решил разруливать коллизии через увеличение несущего массива. Но и тут не обошлось без подводных камней. Моя хеш функция выглядит так: key MOD size. Т.е. индексом массива будет остаток от деления ключа на размер массива. Это классика. С одной стороны дает хорошее распределение, с другой сразу отсекает возможность выхода за границы массива, и эта простота дает фору сложным хешфункциям основанным на битовых операциях с условиями. Проблема заключается в том, что после изменения размера массива, те элементы что уже были добавлены, могут стать коллизионными, т.е. вместо того что бы решать коллизию, создаются новые. Обмозговывая данную ситуацию я пришел к выводу, что новый размер таблицы должен быть числом которое не кратно ни одному ключу из уже добавленных элементов, а во вторых новый размер должен быть примерно вдвое больше текущего. Я подумал, действительно ли мне нужно вычислять этот размер, или может есть другие методики? ----- have a nice day |
|
Создано: 04 мая 2015 01:23 · Личное сообщение · #2 |
|
Создано: 04 мая 2015 02:53 · Личное сообщение · #3 |
|
Создано: 04 мая 2015 02:58 · Личное сообщение · #4 |
|
Создано: 04 мая 2015 04:04 · Поправил: Nimnul · Личное сообщение · #5 |
|
Создано: 04 мая 2015 05:24 · Поправил: mysterio · Личное сообщение · #6 |
|
Создано: 04 мая 2015 05:36 · Личное сообщение · #7 O(1) - это сильное требование, такое можно получить через perfect hash, если список ключей заранее известен. На практике это не нужно, бинарные деревья и хэш таблицы всегда работают быстро, а вырожденных случаев легко избегать. Если нет ограничений на время добавления, в бинарном дереве достижима скорость поиска O(log2 n) в любом случае, нужно просто балансировать каждый раз при изменении дерева. ----- PGP key | Сообщение посчитали полезным: Coderess |
|
Создано: 04 мая 2015 07:30 · Личное сообщение · #8 |
eXeL@B —› Программирование —› Сверх быстрая хештаблица. |