Какой самый большой размер должен быть у хеш-таблицы? - PullRequest
2 голосов
/ 22 октября 2011

Какой размер слишком велик для реализации хеш-таблицы на среднем языке программирования?

Скажем, я хотел создать программу, которая играет в игру Ширитори .После того, как пользователь вводит слово, программа должна искать в словаре, если это слово существует.Чтобы предотвратить постоянное чтение плоских файлов, загружает ли более 100 000 слов в хеш-таблицу при запуске программы мудрым решением?

Ответы [ 3 ]

5 голосов
/ 22 октября 2011

Ну, есть специализированные структуры данных и алгоритмы для этого вида данных.Например, Patricia Trie или Radix Tree, который намного эффективнее по размеру, чем хеш-таблица для строк, но, конечно, будучи деревом, вычислительная сложность поиска составляет O (log n), а построение - O (n log n).Поскольку вы кодируете его из файла, вы можете записать его таким образом, чтобы загрузить его в O (n).

Hashtable (Dictionary) в C # реализован таким образом, чтоверхняя граница, за исключением того, что она использует внутреннюю 32-битную целочисленную адресацию (она не может содержать более 2 миллиардов элементов наверняка).

100000 элементов не слишком много для словаря.Возможно, более проблематичным для языков с сборщиком мусора будет то, что у вас будет 100000 выделенных строк, что немного подействует на ваш GC.Вы можете получить больше информации о реальном объеме памяти приложения, только запустив его.

Если память вызывает реальную проблему, поищите Patricia Trie и Radix Tree, которые идеально подходят для хранения словарей слов.Но вы можете начать использовать словарь и посмотреть, сколько памяти занимает ваше приложение.

Делая грубые вычисления, рассматривая строки как юникод и считая, что среднее слово в английском языке составляет 5,1 буквы (я читал в Интернете)и учитывая плюс 32 байта (для объекта и длины) для каждой строки, вы получите минимальный объем памяти (100000 * (32 + 5 * 2)) для строк 4200000 байтов, что является действительно небольшим объемом.

0 голосов
/ 22 октября 2011

Физические ограничения (RAM) и ограничения реализации (хэш-карта Java против C # хеш-карта против STL или Boost и т. Д.) В стороне;Я думаю, что верхнее ограничение размера хеш-таблицы относительно того, какой должна быть хеш-карта, зависит от алгоритма хеширования.Первоначальная цель хэш-карты - добиться постоянного времени поиска по мере увеличения размера коллекции.Если у вас есть хороший алгоритм хеширования, вы можете сгенерировать уникальный ключ для большого количества значений;но если у вас плохой алгоритм хеширования, то время поиска уходит в дерьмо, так как вы начинаете сталкиваться (например, два уникальных входа в ваш алгоритм хеширования генерируют одно и то же значение), и вы попадаете в трикеры, чтобы избежать этого.

Но это не должно быть то, что вы ищете.Я просто добавляю это, чтобы добавить еще один момент к обсуждению, которое, я думаю, еще не решено.Я думаю, вам стоит посмотреть ответ @Salvatore Previti.Принимая во внимание проблему, у вас есть решение, которое он упомянул, кажется, лучше подходит.

0 голосов
/ 22 октября 2011

"Слишком большой"? Это все равно, что спросить: «Какая пища с лучшим вкусом?»

Чем больше хеш-таблица, тем больше она занимает памяти, но тем быстрее она работает. Вы должны решить, что вам нужно больше, пространство или время.

...