有没最快速的集合过滤算法
比如有多个list<String>的对象集合:
list1:[我][是][中][国][人]
list2:[我][在][中][国]
list3:[我][是][人]
list4:[我][在][家]
list5:[我][不][系][上][海][人]
.....
怎么快速在众多集合中找出包括“人”“是”的list?
目前的我的做法只能建简单的索引,即把“人”当作一个key,对应的集合当作value,放进hashmap里面,然后把各字得出来的集合再求交集。
即查“人”的结果集合是list1,list3,list5;“是”的结果集合是list1,list3,所以交集结果是:list1,list3。
但这里会有个问题,我不能利用“人”得出来的中间结果list1,list3,list5,再在这些集合的基础去过滤“是”。
集合可能会比较多,对性能要求比较高,所以有没有利用中间结果的高效方法,或者其他更好办法?
问题补充
需要建立一个反向索引表,正如楼主所做的。
楼主的需求是组合关键字。有些全文搜索引擎开源项目,也许可以参考算法实现。
比如,lucene, sphinx
两个或多个集合求交集,应该会有高效率的算法。
对,我参考的就是反向索引,但我知道的只是表层,lucene的算法具体实现我还真没研究过。。。搜索引擎都是boolean运算,不一定是集合运算。。还真想不出好方法
问题补充
补充点,我这个东西都是内存版的,全部在内存运行
问题补充
应该就可以了吧....
我现在那种索引就是倒排索引嘛,只是说,集合多的时候怎么筛选会有效率
倒排索引加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,这就说明在且仅在第一篇文章中同时出现了[中]和[人]。
以上就是你在搜索引擎中搜索多关键词的过程,当然在真实使用时由于文章数量很多,建的倒排索引都是稀疏的,往往用链表来作,也就需要自己实现稀疏链表上的按位与了。
楼主的需求类似于全文检索(Full text search) -- google, baidu
需要建立一个反向索引表,正如楼主所做的。
楼主的需求是组合关键字。有些全文搜索引擎开源项目,也许可以参考算法实现。
比如,lucene, sphinx
两个或多个集合求交集,应该会有高效率的算法。
这个东西,遍历一遍建立一个倒排索引,不过在搜索前一定要建立索引就是了
应该就可以了吧....
[quote="iamlotus"]倒排索引加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,这就说明在且仅在第一篇文章中同时出现了[中]和[人]。
以上就是你在搜索引擎中搜索多关键词的过程,当然在真实使用时由于文章数量很多,建的倒排索引都是稀疏的,往往用链表来作,也就需要自己实现稀疏链表上的按位与了。
[/quote]
这个方法不错。 :idea:
我之前想到了数据库建立组合字段索引的方法(a = ? and b = ?),但是全文索引中,关键字太多,组合情况太多,不适合。
现在想起来,数据库中还有一个 bit map 索引,只是对那东西理解不透。
跑题了..........