实现T9文本预测

Implementing T9 text prediction

本文关键字:文本 T9 实现      更新时间:2023-10-16

我在内存中有一个T9字典(trie/hash_map)。字典包含单词评级对,因此当从字典中选择一个单词时,它的评级增加,并且单词评级对在单词列表中上升。

假设有一种方法可以从字典中挑选一个单词。该方法还执行一些单词评级程序。

在输入中,我有一串在电话上按下的数字(1-9,'*'改变单词和' ')。

问题:

  1. 是否有快速解析字符串的算法?
  2. 哪种数据结构比较好?

乌利希期刊指南:

问题全文(问题D)

Hash_map实现

单词查找树实现

我认为特别有效的一种选择是将这个树预处理成一个修改过的结构,专门针对基于击键预测单词进行优化。

直观地说,新的结构体是一个由任何点都可以按下的可能数字组成的三叉树。然后,每个树节点存储一个单词的优先级队列,这些单词可能会使用这些数字拼写出来。然后,您可以通过以下算法预测使用哪些单词:

  • 从树的根开始。
  • 对于每一个数字,沿着该数字对应的指针移动。
  • 如果你走下了树,那就没有什么建议了。
  • 否则,查看优先级队列中可以精确地由这些数字组成的单词,然后建议优先级队列中使用次数最高的元素。

该算法耗时O(n + Tmax),其中n是数字字符串的长度,Tmax是为给定前缀找到最流行的单词所需的时间。对于像二进制堆这样的东西,这可能是O(1),但对于更复杂的堆可能会更慢。

要构建此数据结构,您将按如下方式预处理原始单词/频率列表。对于每个单词,确定其字母对应的数字序列。例如,单词"monsoon"将是6667666,而单词"apple"将是27753。然后,将该序列插入到数字树中,根据需要创建新节点。当到达与该数字字符串对应的最后一个节点时,将单词插入到该节点的相应优先级队列中。这个操作的总时间实际上是相当好的;给定一个包含n个字母的单词列表,这可以在O(n Tinsert)时间内完成,其中Tinsert是将一个单词插入优先级队列所需的时间。这是因为我们最多需要访问每个字母三次——一次将其转换为数字,一次在数字树中跟踪相应的边,一次将其插入优先级队列。

这种方法还可以很容易地将新单词插入预测器中。每当用户离开数字树或选择一个不是排名第一的单词时,您可以通过在树中创建适当的节点系列将该单词插入到数字树中,然后将该单词插入到正确的优先级队列中。

如果你用一个平衡的二叉搜索树来创建优先级队列,该树存储一个指向其最小元素的指针,那么你可以在O(n)时间内找到n个数字序列中最快的单词,然后可以在O(1)时间内列出所有其他带有该前缀的单词。你也可以通过这种方式很容易地插入或删除新词。

由于单词存储在一个树中,您可以在0(1)内更新您对当前单词的猜测,只需从当前树节点向下走到当前数字给定的子节点。当用户按空格键时,您将重置到数字树的根。最后,当用户点击*时,您可以使用上述技巧查看给定tree节点的下一个最流行单词。

希望这对你有帮助!