algorithm - 您如何更改 Trie 以支持按受欢迎程度(某种权重)显示结果?

标签 algorithm data-structures autocomplete trie

我想知道如何更改 Trie 数据结构的行为以支持通过某些词的流行度自动完成?

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

最佳答案

首先,您必须向 trie 节点添加一个属性 popularity,并且总是选择一个节点,您将它的 popularity 增加 1。

然后,假设您想获得所有以“abc”开头的单词之间的建议。

首先,您在 trie 中正常行走,直到到达表示“abc”的节点,然后您可以调用一个中序树遍历从该节点开始,并且始终访问一个节点,将其添加到 priority_queue(或 heap),它将按照您定义的方式对节点进行排序。您可以定义它以对节点进行排序,因为最大的 popularity 将是优先级。

遍历完成后,你可以一个一个的从堆中移除元素(任意数量)并且你移除的每个元素将是所有剩余元素中最大的(第一个元素将是所有元素中最大的) ,第二个将是所有剩余元素中最大的,等等。)


如果你对时间和空间复杂度感兴趣,可以阅读这篇文章:

这种方法需要时间 O(size of word) 来找到根节点,然后 O(n lg n) 来排序你想要的节点,然后 O(k lg n) 来获得你需要显示的前 k 个元素.简而言之,时间复杂度为O(n lg n),空间复杂度为O(n),因为有堆。

关于algorithm - 您如何更改 Trie 以支持按受欢迎程度(某种权重)显示结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41766728/

相关文章:

python - 为什么在计算数组的子集时,变量名称似乎有所不同?

algorithm - 用于移动设备的 j2me 中的导航算法实现

data-structures - 在多个字段上建立索引的哈希表

c# - 如何动态更改 C# 组合框或文本框中的自动完成条目?

Vim 在对字典和当前文件使用自动完成时卡住

algorithm - Youtube内容识别技术?

java - 什么是时间复杂度 O(1) 次,Java 中的 O(n) 次

algorithm - 在链表中找到循环的起始节点?

c++ - 多维数组实现

javascript - Jquery 自动完成以多个数组作为源