实现T9文本预测

时间:2011-08-26 18:05:33

标签: c++ data-structures string-parsing trie t9

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

假设有一种从字典中选择一个单词的方法。该方法也可以进行一些单词评级例程。

在输入中,我有一串数字(1-9,'*'更改单词和''),这些都是通过电话按下的。

问题:

  1. 是否有任何算法可以快速解析字符串?
  2. 哪个数据结构会很好?
  3. UPD:

    Full problem text(问题D)

    Hash_map implementation

    Trie implementation

1 个答案:

答案 0 :(得分:8)

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

直观地说,新结构是由可能在任何点按下的可能数字创建的特里结构。然后,每个trie节点存储可能使用那些数字拼写出的单词的优先级队列。然后,您可以通过以下算法预测要使用的单词:

  • 从特里的根部开始。
  • 对于每个数字,请按照与数字对应的指针。
  • 如果你离开特里,那么就没有任何建议。
  • 否则,查看可以从这些数字中精确构成的单词的优先级队列,然后建议该优先级队列中使用次数最多的元素。

此算法需要时间O(n + T max ),其中n是数字字符串的长度,T max 是找到最受欢迎的时间所需的时间给定前缀的单词。对于类似二进制堆的东西,这可能是O(1),但对于更复杂的堆可能更慢。

要构建此数据结构,您可以按如下方式预处理原始的单词/频率列表。对于每个单词,确定与其字母对应的一系列数字。例如,单词“季风”将是6667666,而单词“apple”将是27753.然后,将该序列插入到数字trie中,根据需要创建新节点。当您到达与该数字字符串对应的最终节点时,将该字插入该节点的相应优先级队列中。这次行动的总时间实际上相当不错;给定一个总共有n个字母的单词列表,这可以在O(n T insert )时间内完成,其中T insert 是插入所需的时间一个单词进入优先级队列。这是因为我们需要访问每个字母最多三次 - 一次将其转换为数字,一次跟随数字trie中的相应边缘,一次将其插入优先级队列。

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

如果从存储指向其最小元素的指针的平衡二叉搜索树中获取优先级队列,则可以在O(n)时间内为一系列n位数找到最快的单词,然后可以列出带有该前缀的所有其他单词在每个摊销的O(1)时间内。您也可以通过这种方式轻松插入或删除新单词。

因为单词存储在一个trie中,你可以在O(1)中通过从当前trie节点向下走到当前数字给出的子节点来更新你对当前单词的猜测。当用户点击空格键时,您只需重置回数字trie的根目录。最后,当用户点击星标时,你可以使用上面的技巧来查看给定trie节点的下一个最流行的单词。

希望这有帮助!