У меня есть список примерно из 10^5
английских слов и их начальная частота. Я хочу написать программу предложения завершения слов, которая будет возвращать список максимальных k
слов, начиная с заданного префикса, отсортированных в порядке убывания их частоты. Структура данных также должна иметь возможность обновлять счетчик частоты слова на 1 (всякий раз, когда слово используется).
Например, учитывая префикс «engin» и k = 3
, он должен возвращать следующий список: {{17, «engine»}, {10, «engineer»}, {4, «engineering»}}
Значение k
должно быть в пределах [1, 15].
Trie
структуры данных должно было быть достаточно, если сортировка по частоте не была проблемой, но это так. Может ли кто-нибудь подсказать мне какую-либо структуру данных или какой-либо подход к решению этой проблемы?
Примечание. Структура данных Trie
занимает слишком много места. Похоже, я не могу позволить себе более 10MB
для этой структуры данных. Кроме того, если я использую максимальные кучи, связанные с узлами trie (по крайней мере, до 3/4 глубины), потребление памяти становится ОГРОМНЫМ.
На данный момент я пробовал это: поддерживать 4 отсортированных набора (указателей, указывающих на строки). Набор i
представляет собой список указателей на строки из string length >= i
отсортированных
- Лексикографический порядок первых
i
букв строки - Если конфликтуют, в порядке убывания частоты
- При повторном столкновении в любом порядке (незначительно)
Это хорошо работает, учитывая, что для инициализации мне требуется O(4nlog2(n)) времени и O(nlog2(n)) пространства. Для каждого запроса у меня сложность времени поиска O (log2 (n)), плюс обход не более примерно 100 слов в худшем случае. Для обновления частоты слова требуется время O(8*log2(n)).