Java. Является ли обычной практикой использование хеш-таблицы (например, HashMap) для отображения объектов на себя?

Я делаю Java-приложение, которое будет хранить кучу случайных слов (которые могут быть добавлены или удалены из приложения в любое время). Я хочу быстрый поиск, чтобы увидеть, есть ли данное слово в словаре или нет. Какую структуру данных Java лучше всего использовать для этого? На данный момент я думал об использовании hashMap и использовании одного и того же слова в качестве значения и ключа для этого значения. Это обычная практика? Использование одной и той же строки для ключа и значения в паре (ключ, значение) кажется мне странным, поэтому я хотел убедиться, что не было какой-то лучшей идеи, которую я пропустил.

Я также думал об альтернативном использовании treeMap для сортировки слов, давая мне время поиска O(lgn), но hashMap должен дать ожидаемое время поиска O(1), насколько я понимаю, поэтому я решил, что будет лучше,

В общем, я просто хочу убедиться, что идея hashMap с удвоением строк как ключа и значения в каждой паре (ключ, значение) будет хорошим решением. Благодарю.

4 ответа

Решение

Я хочу быстрый поиск, чтобы увидеть, есть ли данное слово в словаре или нет. Какую структуру данных Java лучше всего использовать для этого?

Это учебный пример использования Set, Вы можете использовать HashSet, Наивная реализация для Set<T> использует соответствующий Map<T, Object> просто пометить, существует ли запись или нет.

Если вы храните это как набор слов в словаре, я бы посоветовал взглянуть на Tries. Они требуют меньше памяти, чем Set и иметь быстрые времена поиска наихудшего случая O(string length),

Любой класс, который является Set должно помочь вашей цели. Тем не менее, обратите внимание, что Set не позволит дубликатов. В этом отношении даже Map не позволит дублировать ключи. Я бы предложил использовать ArrayList(при условии, что синхронизация не требуется), если вам нужно добавить дубликаты записей и обрабатывать их как отдельные.

Моя единственная проблема - память, если вы используете HashSet и у вас очень большая коллекция слов... Тогда вам придется загрузить всю коллекцию в память... Если это не проблема.... (И ваша коллекция должна быть очень большой, чтобы это было проблемой)... Тогда HashSet должен быть в порядке... Если у вас действительно очень большая коллекция слов, то вы можете попробовать использовать дерево и загружать только в память частей, которые вас интересуют.

Также имейте в виду, что вставка выполняется быстро, но не так быстро, как в дереве, помните, что для этого нужно, чтобы Java вставляла каждый отсортированный элемент. Опять же, ничего особенного, но если вы добавляете много слов за раз, вы можете рассмотреть возможность использования дерева...

Другие вопросы по тегам