Algorithm 如何更改Trie以支持按流行度(特定类型的权重)显示结果?

Algorithm 如何更改Trie以支持按流行度(特定类型的权重)显示结果?,algorithm,data-structures,autocomplete,trie,Algorithm,Data Structures,Autocomplete,Trie,我想知道如何改变Trie数据结构的行为,以支持某些单词的自动补全,例如 我在想每个节点都有一个按流行程度排序的链表,这是个好主意吗?但是,您如何知道自动完成将显示的单词的顺序呢?首先,您必须向trie节点添加一个属性popularity,并且始终选择一个节点,将其popularity增加1 然后,假设你想在所有以“abc”开头的单词之间找到建议 首先,您在trie中正常行走,直到到达表示“abc”的节点,然后您可以调用顺序树遍历开始于该节点,并且您总是访问一个节点,您将其添加到优先级队列(或堆)

我想知道如何改变Trie数据结构的行为,以支持某些单词的自动补全,例如


我在想每个节点都有一个按流行程度排序的链表,这是个好主意吗?但是,您如何知道自动完成将显示的单词的顺序呢?

首先,您必须向trie节点添加一个属性
popularity
,并且始终选择一个节点,将其
popularity
增加1

然后,假设你想在所有以“abc”开头的单词之间找到建议

首先,您在trie中正常行走,直到到达表示“abc”的节点,然后您可以调用顺序树遍历开始于该节点,并且您总是访问一个节点,您将其添加到
优先级队列
(或
)中,该队列将按照您定义的顺序对节点进行排序。您可以定义它来对节点进行排序,因为最受欢迎的
将是优先级

遍历完成后,您可以一个接一个地(根据需要)从堆中移除元素,移除的每个元素都将是所有剩余元素中最大的(第一个元素将是所有元素中最大的,第二个元素将是所有剩余元素中最大的,等等)


如果您对时间和空间复杂性感兴趣,可以阅读以下内容:


这种方法需要时间O(字的大小)来找到根节点,然后O(nlgn)来排序所需的节点,然后O(klgn)来获得需要显示的前k个元素。简而言之,由于堆的存在,时间复杂度为O(n lg n),空间复杂度为O(n)。

数据量有这么大吗?如果不是,你可以从一个标准的trie中检索所有选项,然后根据你的标准对它们进行排序。我遇到的只是一个理论性的面试问题……使用按人气排序的链表的解决方案肯定是个坏主意。这将使更新的运行时间和空间复杂性爆炸。好吧,如果这是一个面试问题,“正确”的答案取决于你之前被问到的问题。在添加优先级之前,您是如何进行搜索的?在回答这个问题之前,你还讨论了哪些注意事项?