如何提高大量字符串查找操作的效率(非前缀搜索)?
问题:
有一个比较大的字符串数组[A],10万左右元素,每个元素是比较短的字符串,长度小于32个字.
用户输入一个比较短的字符串s,长度也小于32,要求查找出:包含s的元素集合[B],拼音中包含s的元素集合[C],以及拼音首字母中包含s的元素集合[D]. 要求支持多音字和中英文数字混输.
功能我已经实现了,但是现在项目要求随着用户在输入框中输入,结果实时地在输入框中显示,我的实现比较慢,做不到随输随显示。如果想提高效率,该用什么办法呢?
我把计算拼音和拼音首字母的结果做了缓存,提高了一些效率,但是还是达不到要求。
我的想法是:
1.能不能用某种数据结构把[A]重新组织起来方便查找?
2.因为结果是在QTreeView中显示的,这里能不能优化一下?
注:
1.不是前缀搜索,是只要包含子串s的都找出来。
2.要支持多音字,所以一个字符串可能对应很多个拼音串。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果字符串大小小于32的话,你可以考虑生成32棵trie树.基本思路是这样的吧,用户每次查找都在这32棵树中进行搜索。假设字符串长度限制为4个为例:
原始字符串
1234 2234 3234 4234
转换为:
t1: 1234+ 2234+ 3234+ 4234+
t2: 234+1 234+2 234+3 234+4
t3: 34+12 34+22 34+32 44+23
t4: 4+123 4+223 4+323 4+234
对t3:
+之后的节点只用来还原字符串,不参与查找。
当用户输入3时,首先匹配上t3,用户继续次输入时,只需要在t3树下继续查找即可。
举例:
用户输入34:
输入3: 先匹配t3,需要查找4次,
继续输入4:直接在t3中查找,1次即可
用户输入35:
输入3: 先匹配t3,需要查找4次,
继续输入5:直接在t3中查找,匹配不到,即是没有
内存占用提高32倍,算法时间基本为常量
我不是很懂你要表达的意思, 我猜是这样的:
你手里有10万个字符串, 需要查出给定字符串为前缀的所有字符串. 例如:
我有['abcde', 'abcdef', 'abc', 'a'] 四个字符串, 当给定字符串为'ab'的时候, 查出['abcde', 'abcdef', 'abc'].
如果是这个意思, 请使用trie树.
楼主,请问你最后的解决方法是什么,能提点一二不,有代码更好