keyboard2000 2010-04-22 12:57
浏览 411
已采纳

有没最快速的集合过滤算法

比如有多个list<String>的对象集合:
list1:[我][是][中][国][人]
list2:[我][在][中][国]
list3:[我][是][人]
list4:[我][在][家]
list5:[我][不][系][上][海][人]
.....

怎么快速在众多集合中找出包括“人”“是”的list?
目前的我的做法只能建简单的索引,即把“人”当作一个key,对应的集合当作value,放进hashmap里面,然后把各字得出来的集合再求交集。
即查“人”的结果集合是list1,list3,list5;“是”的结果集合是list1,list3,所以交集结果是:list1,list3。
但这里会有个问题,我不能利用“人”得出来的中间结果list1,list3,list5,再在这些集合的基础去过滤“是”。
集合可能会比较多,对性能要求比较高,所以有没有利用中间结果的高效方法,或者其他更好办法?
问题补充

buaawhl 写道
楼主的需求类似于全文检索(Full text search) -- google, baidu
需要建立一个反向索引表,正如楼主所做的。
楼主的需求是组合关键字。有些全文搜索引擎开源项目,也许可以参考算法实现。
比如,lucene, sphinx

两个或多个集合求交集,应该会有高效率的算法。

对,我参考的就是反向索引,但我知道的只是表层,lucene的算法具体实现我还真没研究过。。。搜索引擎都是boolean运算,不一定是集合运算。。还真想不出好方法
问题补充
补充点,我这个东西都是内存版的,全部在内存运行
问题补充
zhrb 写道
这个东西,遍历一遍建立一个倒排索引,不过在搜索前一定要建立索引就是了
应该就可以了吧....

我现在那种索引就是倒排索引嘛,只是说,集合多的时候怎么筛选会有效率
  • 写回答

5条回答 默认 最新

  • iamlotus 2010-04-22 12:57
    关注

    倒排索引加bit map &&啊
    以你的例子来说,一共五个文档,就作5个bit的索引好了
    [我]在5篇文章中都有,所以 Index[我]=11111
    [是]在1、3中有,所以Index[是]=10100
    同理
    Index[中]=11000
    Index[国]=11000
    Index[人]=10101
    这样的话Index[A&B]=Index[A]&Index[B]
    也就是说,你想得到[中]和[人]在哪篇文章中出现,只要把它们的Index按位与就行了。
    也即 Index[中&人]=Index[中]&Index[人]=11000&10101=10000,这就说明在且仅在第一篇文章中同时出现了[中]和[人]。
    以上就是你在搜索引擎中搜索多关键词的过程,当然在真实使用时由于文章数量很多,建的倒排索引都是稀疏的,往往用链表来作,也就需要自己实现稀疏链表上的按位与了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器