Наиболее эффективным, вероятно, было бы использование Patricia trie , которое ссылается на max-heap . Каждый раз, когда вы читаете слово, find
оно в дереве, идите в кучу и increase-key
. Если его нет в базе данных, add
и установите его ключ в куче соответствующим образом.
С кучей Фибоначчи , increase-key
равно O(1)
.
Не столь необоснованным решением является использование Map<String, Integer>
, добавление счетчика каждый раз, когда встречается слово, а затем выборочная сортировка его entrySet()
на основе счетчика, чтобы получить первые 50.
Если сортировка O(N log N)
недопустима, используйте алгоритм выбора , чтобы найти 50 лучших в O(N)
.
Какая техника лучше, действительно зависит от того, что вы просите (т.е. комментарий, является ли это скорее вопросом [algorithm]
, чем вопросом [java]
, очень красноречив).
Map<String, Integer>
, за которым следует алгоритм выбора, наиболее практичен, но решение Patricia trie явно превосходит его только в эффективности использования пространства (поскольку общие префиксы не сохраняются избыточно).