请问大量字典查找的算法

billhao 2004-01-03 11:46:28
假设有一个10000词英语字典A为全集,字典B是字典A得子集,要求出字典B的补
集,即字典A中除字典B以外的所有词,请问是否有什么快速算法,否则每个词都
搜索一次太慢了。谢谢。
...全文
197 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqrqq 2004-01-04
  • 打赏
  • 举报
回复
考虑到事先没有排序的情况,进行排序的复杂度是O(nlogn)以上,
这种情况建议你用hash方法存放字典数据。
建立这个hash表的时间复杂度是o(n),如果冲突不过的话,搜索一个记录平均访问量仅用1次多一点(理想情况是1次),也就是说可以通过优化hash散列的方法,使时间复杂度接近与o(n)!
gnefuil 2004-01-04
  • 打赏
  • 举报
回复
方法1:
把A中的单词按字母排序,然后对B中每个单词,在A中二分查找,并标记一下A中在B中出现的单词,最后A中未标记的单词就是B的补集
时间复杂度O(nlogn)
方法2:
按字母顺序建立索引树,我举个例子就清楚了
比如有三个单词abc,acd,ace
建立如下索引树
a__b__c
|_c_d
|_e
就是说从如果两个单词前面一部分相同,就共用前面的结点,从不同的字母开始增加新结点
在这道题里,首先建立A字典的索引树,在每个单词的结束字母处做标记1
然后对每个B中的单词,依次根据每个字母,遍历索引树,当B中的单词到达最后一个字母的时候,把相应的结点做标记2
最后遍历整个索引树,每到达一个做了标记1的地方,判断是否该结点做了标记2
如果没有做标记2,就输出从索引树根节点到该结点所经过的所有字母
如果有标记2,说明该单词在B中,不能输出
这样把索引树遍历一遍之后,所有输出的就是B在A中的补集
这样做的时间复杂度是O(n)


LeeMaRS 2004-01-04
  • 打赏
  • 举报
回复
字典是用什么数据结构存放的?

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧