免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
11 [报告]
发表于 2013-04-01 10:47 |只看该作者
回复 9# selfrun


    树本身的操作带来的额外复杂度可能已经太大了

论坛徽章:
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
12 [报告]
发表于 2013-04-01 10:51 |只看该作者
selfrun 发表于 2013-04-01 10:45


这个好。不排序时间复杂度就下去了。

设各集合总数据量为N,则空间复杂度O(N)(用hash_map的话,应该是O(N*(1+x%)),x为额外保留、用于避免key冲突的空间),时间复杂度O(2N)=O(N)。

论坛徽章:
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
13 [报告]
发表于 2013-04-01 10:51 |只看该作者
回复 10# shan_ghost


    我感觉排序没必要,直接遍历比较应该更省

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
14 [报告]
发表于 2013-04-01 10:54 |只看该作者
回复 11# cokeboL


    红黑树增删查的复杂度都是log(n),空间嘛,每个节点3*sizeof(void*) + sizeof(byte) + sizeof(key) + sizeof(value);百万数量级的小case

论坛徽章:
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
15 [报告]
发表于 2013-04-01 11:01 |只看该作者
回复 14# selfrun


我是说,map或树本身的操作,就一堆代码,同样的O(n),用树和for(  i < n  )相比,实际操作数上树、map要多很多

而且你看看遍历比较的,复杂度也没多高

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
16 [报告]
发表于 2013-04-01 11:14 |只看该作者
回复 15# cokeboL


    你说的方法复杂度是o(n)的,n=sum(N_1....N_max);若能实现当然最好;
不过实际问题里key的值域是很大的范围,空间复杂度太高; 若是用hash算法把key转成0~n-1的值,又很难保证不重复;或者用关联数组从key映射到索引,又回到关联数组上了...

论坛徽章:
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
17 [报告]
发表于 2013-04-01 11:18 |只看该作者
回复 16# selfrun


空间复杂度没多大的,用C++的话也可以vector之类的,如果事先就找出各个数组中长度最小的n_min,空间复杂度最大也不会超过n_min,而且还可以不超过

第一个找出的交集长度,时间却会省很多

论坛徽章:
0
18 [报告]
发表于 2013-04-01 12:04 |只看该作者
本帖最后由 hbmhalley 于 2013-04-01 12:16 编辑

开一个大小可以忍受的 bool 数组,比如 bool its[0x10000] = {false..}
扫每个集合,过程略,最终: 对于 m,若所有集合里都存在某个 X 使得 (X&0xffff)=m,则 its[m] == true 否则 false
每个集合的每个元素 X 都附带一个 flag (初始true) ,扫完一遍后, flag &= its[X&0xffff]
这样筛掉后 16 位,用同样的方法筛 32 48 64位等等
最终 flag 为 true 的就是交集中的元素

复杂度 O(mn*log(65536,maxnum)),约等于下限 O(mn)

+实际上,这应该就是下限
因为判断两个数是否相等下限是 log(2^32,maxnum)=log(2^16,maxnum)/2
+排序是不必要的,而且楼上复杂度里都忽略了大数比较的复杂度

论坛徽章:
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
19 [报告]
发表于 2013-04-01 13:29 |只看该作者
数组 1 排序后, 对数组2进行二分查找

这是最自然的了, 看看速度再说吧.

论坛徽章:
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
20 [报告]
发表于 2013-04-01 13:35 |只看该作者
看你们说的津津乐道, 我就想笑
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP