讨论:集合相关算法

liaomingxue none 服务器端工程师  2010-07-10 05:47:56
兄弟最近的一个算法是一个有限离散整数集合相关的问题,希望大家能给出一些建议。

1 集合:有限非负整数集合,集合的基(集合中元素的个数)最大为32768,集合可以无序也可以有序,元素是离散的不保证连续。

2 要求集合包含关系,集合与元素的属于关系,多个集合交集三个方面操作的高效算法
...全文
94 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jovial__ 2010-07-11
用位图表示,进行按位与等相关操作,应该是最快的了,慢的话感觉有可能是实现的问题。
回复
超级大笨狼 2010-07-11
[Quote=引用 1 楼 zentropy 的回复:]


包含关系:O(n1+n2) 分别判断一个集合中的元素是否在另外一个当中
多个集合交:O(n1+n2+...+nk)
[/Quote]

其实用不着,只要循环最小的集合就可以得到包含和交集
所以

集合包含关系O(min(n))
多个集合交集O(min(n))
回复
超级大笨狼 2010-07-11
可以用并查集和哈希表两种做法。
本人还是喜欢哈希表,最好你使用的语言有现成的。

如果用Hash表的话。
集合包含关系O(min(n))
集合与元素的属于关系O(1)
多个集合交集O(min(n))
回复
liaomingxue 2010-07-10
楼上的也不错,我们目前用的是64bit的long进行数据组织的,但感觉还是慢,应该还可以更快
回复
jovial__ 2010-07-10
用位图表示集合。32768用4096个8位int型就可以表示了。

包含关系:对二者进行相与, 出现原数字,那么肯定是包含关系。谁包含谁,只需比较二者的大小就行了。

属于关系:只要判断对应位是否为1就行了。

多个集合交:一样对多个集合进行按位与。然后找出对应为1的序号。
回复
liaomingxue 2010-07-10
楼上的还不错,基本上是目前的实现水平。

不过,包含关系应该是O(n1)的,因为只需要对一个集合进行循环判定其元素是否在另一个集合之中(注意,求包含关系一般是单向的,即求A是否包含B,一般不需要同时要求反过来确定B是否包含A)
回复
zentropy 2010-07-10
先来一块大砖头吧:)

用一个hash表表示一个集合

包含关系:O(n1+n2) 分别判断一个集合中的元素是否在另外一个当中
属于关系:O(1)
多个集合交:O(n1+n2+...+nk)
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告