实现T9文本预测
Implementing T9 text prediction
我在内存中有一个T9字典(trie/hash_map)。字典包含单词评级对,因此当从字典中选择一个单词时,它的评级增加,并且单词评级对在单词列表中上升。
假设有一种方法可以从字典中挑选一个单词。该方法还执行一些单词评级程序。
在输入中,我有一串在电话上按下的数字(1-9,'*'改变单词和' ')。
问题:
- 是否有快速解析字符串的算法?
- 哪种数据结构比较好?
乌利希期刊指南:
问题全文(问题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节点的下一个最流行单词。
希望这对你有帮助!
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何根据单词在文本中出现的概率输出单词
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- C++试图读取一个文件并输出到另一个文本文件
- 实现T9文本预测