Как хранить 50 000 английских слов так, чтобы это занимало как можно меньше памяти

Мне нужно хранить в памяти ~ 50 000 английских слов, и я хотел бы знать, какая структура данных будет наилучшей с точки зрения объема памяти (и скорости загрузки). Будет ли это Трие? Как мне сериализовать его в файл? Есть ли что-нибудь лучше этого?

По сути, как только ~50 000 слов загружены в память, мне просто нужно проверить, существует ли слово или нет.


person Martin    schedule 30.04.2012    source источник


Ответы (4)


Что ж, в соответствии с предоставленными вами рекомендациями, простой List был бы лучше.

Время выборки будет явно медленнее, чем Trie или Dictionary, но

"с точки зрения объема памяти (и скорости загрузки)"

Это потребует очень небольших накладных расходов на память и будет загружаться быстрее (поскольку не создаются структуры данных индексов/префиксов).

См. этот сообщение в блоге для получения некоторых сведений о сравнении памяти (в JavaScript, но все еще применяется ).

person seldary    schedule 30.04.2012

Согласно этому ответу, Вам нужен класс Dictionary. Согласно документации MSDN, для доступа к ваши данные:

Используйте метод TryGetValue, если ваш код часто пытается получить доступ к ключам, которых нет в словаре. Использование этого метода более эффективно, чем перехват исключения KeyNotFoundException, созданного свойством Item.

person npinti    schedule 30.04.2012

Да, три звучит нормально для этого. Для сериализации у вас будет два варианта:

  1. Используйте исходный список слов и перестройте тройку. Я думаю, это должно быть достаточно быстро, но вы можете захотеть профилировать его.
  2. Просто используйте обычную сериализацию .NET для типа и выгрузите его в файл. Однако это не позволяет программам на других языках читать его.
person Joey    schedule 30.04.2012

Предлагается объект Словарь. Прочтите это:

Самая эффективная структура данных в памяти для чтения только доступ к словарю

Почему словарь предпочтительнее хеш-таблицы?

Для справки по реализации прочитайте это:

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

Для сериализации объекта словаря или хеш-таблицы прочитайте эту ссылку:

http://blogs.msdn.com/b/adam/archive/2010/09/10/how-to-serialize-a-dictionary-or-hashtable-in-c.aspx

person mohsensajjadi    schedule 30.04.2012
comment
Конечно, если выбрано «Словарь или хэш-таблица», то словарь. Но в их вопросе даже есть намек на то, что они могут захотеть Trie. - person Joey; 30.04.2012
comment
Я выбрал плохую ссылку, но хотел показать информацию о классе Dictionary. Лучшей ссылкой будет stackoverflow.com/questions/8570201/ - person mohsensajjadi; 30.04.2012