C++ 实现T9文本预测

C++ 实现T9文本预测,c++,data-structures,string-parsing,trie,t9,C++,Data Structures,String Parsing,Trie,T9,我在内存中有一个T9字典(trie/hash_映射)。词典包含单词分级对,因此当从词典中选取单词时,其分级会增加,单词分级对在单词列表中会上升 假设有一种方法可以从字典中选择一个单词。该方法还可以执行一些单词评级例行程序 在输入中,我有一串数字(1-9,“*”来改变单词,还有“”),它们是在电话上按下的 问题: 有没有快速解析字符串的算法 哪种数据结构最好 UPD: (问题D) 我认为特别有效的一个选项是将trie预处理为修改后的结构,该结构专门为基于击键预测单词而优化 直观地说,新的结构是一

我在内存中有一个T9字典(trie/hash_映射)。词典包含单词分级对,因此当从词典中选取单词时,其分级会增加,单词分级对在单词列表中会上升

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

在输入中,我有一串数字(1-9,“*”来改变单词,还有“”),它们是在电话上按下的

问题:

  • 有没有快速解析字符串的算法
  • 哪种数据结构最好
  • UPD:

    (问题D)


    我认为特别有效的一个选项是将trie预处理为修改后的结构,该结构专门为基于击键预测单词而优化

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

    • 从trie的根开始
    • 对于每个数字,跟随对应于该数字的指针
    • 如果你离开了trie,那么就没有任何建议可提了
    • 否则,请查看优先级队列中可以由这些数字组成的单词,然后建议优先级队列中使用计数最高的元素
    该算法需要时间O(n+Tmax),其中n是数字字符串的长度,Tmax是为给定前缀查找最常用单词所需的时间。对于二进制堆之类的东西,这可能是O(1),但对于更复杂的堆,这可能会更慢

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

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

    如果将优先级队列从存储指向其最小元素的指针的平衡二叉搜索树中移出,则可以实现在O(n)时间内为一系列n位数字查找最快的单词,然后可以在摊销O(1)时间内列出具有该前缀的所有其他单词。您也可以通过这种方式很容易地插入或删除新词

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


    希望这有帮助

    你能把你的两个问题再充实一点吗?“解析字符串的算法”是什么意思?解析什么文本格式,转换成什么数据结构?至于问题2,您希望在哪里引入数据结构?在解析输入之前,我们已经在内存中有了字典,数据结构被引入并用单词填充。我们需要将按下的数字字符串转换为消息。类似的问题:我尝试了这个数据结构,但没有帮助。我的问题似乎是字符串解析。完整的问题文本在(问题D)中。这里是我的解决方案:(hash_map/vector)(Trie)@scrat-你应该把它作为一个后续问题发布,因为我现在没有足够的时间在这里正确地解决这个问题。另外,您是否可以尝试确定代码的哪一部分不起作用?在该代码上执行了十几个测试。其中一个测试超过了1秒的时间限制。@scrat-请尝试找到一个最小的测试用例,并将其作为单独的问题发布。仅仅说“它在某些测试中失败了”就几乎不能提供出什么问题的信息。如果您可以编写自己的测试来显示失败,然后尝试将问题降至失败代码中的特定函数,那么我们可以尝试提供帮助。我很乐意就算法提供一般性建议,但我不想为您调试程序。