免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fender0107401
打印 上一主题 下一主题

[算法] 有什么算法可以很快地取到交集。 [复制链接]

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
受到警告 31 [报告]
发表于 2013-04-01 16:46 |只看该作者
fender0107401 发表于 2013-04-01 16:35
果然又笑而不语了。。。

用这种方式装逼的还真是少见,基本上算得是硬装逼流了。

注:别以为二分查询很牛逼,二分查询的计算复杂性是O(1),但是这并不代表你说的那个方法跑的快,以你这种经常“笑而不语”的智商,我相信你肯定能理解。


太搞了吧, 你
计算机的基本术语都不知道, 是 "复杂度", 不是 "复杂性"
二分查找的复杂度也不是 O(1) 是 lgn

你他妈学过程序没有啊 ?

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
32 [报告]
发表于 2013-04-01 16:49 |只看该作者
本帖最后由 __BlueGuy__ 于 2013-04-01 16:50 编辑

还有,你都不知道引入 计算复杂度 的目的是什么?
计算复杂度低, 程序能不快吗 , 还不一定, 不一定你妹啊 !

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
33 [报告]
发表于 2013-04-01 16:54 |只看该作者
二分查询是O(ln N);求交集需要对至少一个集合里的每个元素做一次二分查询,复杂度是O(N lnN),达到排序的复杂度了。加上前面排序的O(N lnN),是现在最差的一个方案。


最开始那个先排序后用“变形归并算法”合并的方案,最后一步可以做到O(N),但前面排序的O(N lnN)无法省略。

hash方案需要额外N*(1+x%)的空间,但复杂度可以达到O(N),是现在时间效率最高的方案。

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
34 [报告]
发表于 2013-04-01 17:02 |只看该作者
回复 33# shan_ghost

数主有一步是顺序查的, 总比他顺序查要快吧   

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
35 [报告]
发表于 2013-04-01 17:05 |只看该作者
http://research.microsoft.com/pubs/142850/p255-DingKoenig.pdf

微软的一篇论文:

Fast Set Intersection in Memory
Bolin Ding and Arnd Christian König
26 January 2011

Set intersection is a fundamental operation in information retrieval and database systems. This paper introduces linear space data structures to represent sets such that their intersection can be computed in a worst-case efficient way. In general, given k (preprocessed) sets, with totally n elements, we will show how to compute their intersection in expected time O(n / sqrt(w) + kr), where r is the intersection size and w is the number of bits in a machine-word. In addition,we introduce a very simple version of this algorithm that has weaker asymptotic guarantees but performs even better in practice; both algorithms outperform the state of the art techniques for both synthetic and real data sets and workloads.

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
36 [报告]
发表于 2013-04-01 17:09 |只看该作者
求楼主贴用各种算法的代码和实际测试结果

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
37 [报告]
发表于 2013-04-01 17:23 |只看该作者
根据微软的文档,它的算法是基于已排序的列表(Algorithms based on Ordered Lists)的。

在这个前提下,hash算法在实际测试上是性能最差的。这可能和hash函数本身以及冲突有关。merge算法(没仔细看,应该和我的想法相同)效率不错,微软的算法只比它优秀一点点。


不过,另一方面,由于原始数据已排序对hash算法无意义,所以直接拿它和其他算法比较,可能是不公平的。
换句话说,其他算法和hash方法比较时,应把排序时间也计算在内。此时hash算法就仍然是最好的。(因为排序复杂度是O(N lnN),当然,对总数为N的若干集合,复杂度肯定比这个低;而merge已排序集合算法复杂度只有O(N)。hash算法甚至可以直接和这类算法比较,那么,当merge类算法加上之前“作弊”忽略的排序过程,很难比hash更好)。

——没仔细看整个文档,不能确定微软做测试时,究竟有无计算排序时间。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
38 [报告]
发表于 2013-04-01 17:40 |只看该作者
看了你的原始问题。这个用数据库可能是最好的。因为数据库本身是有组织的,提供的集合算法优化的也比较好。

另外写代码,一个是不可能利用数据库本身的数据结构(重建太浪费时间了),第二是自己搞的算法,很难比数据库专业人员搞的更好。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
39 [报告]
发表于 2013-04-01 17:49 |只看该作者
__BlueGuy__ 发表于 2013-04-01 16:49
还有,你都不知道引入 计算复杂度 的目的是什么?
计算复杂度低, 程序能不快吗 , 还不一定, 不一定你妹 ...


你真以为O(1)就快吗?

那你这水平就不用谈了。

你还是在自己找个地方笑而不语去吧。

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
40 [报告]
发表于 2013-04-01 21:51 |只看该作者
fender0107401 发表于 2013-04-01 17:49
你真以为O(1)就快吗?

那你这水平就不用谈了。


你找个O(1)不快的例子我看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP