谁有求集合的子、交、并运算的算法?

glyc 2003-08-20 04:32:16
比如有两个整数集合A,B,如何求他们的交集、并集和判断A是否是B的子集等。
给出算法和C程序都可以。
...全文
171 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sheeron 2003-08-22
  • 打赏
  • 举报
回复
嗯,正在做编译原理的课设,判断是否LL(1)文法,这个问题有所启发。
llwu 2003-08-22
  • 打赏
  • 举报
回复
可以考虑用并查集,即使元素有重复也可以试试,或者自己根据实际问题构造类似算法。这样才有优的时间复杂度
IT_worker 2003-08-22
  • 打赏
  • 举报
回复
如果你是c++的程序员的化,stl中的函数set_difference · set_intersection · set_symmetric_difference · set_union 不就是吗?
寻开心 2003-08-21
  • 打赏
  • 举报
回复
是啊。不是告诉你如果是散乱点的话就会......
只有在你的数据类型以及集合的具体实现方式确定后才能做优化算法,在没有任何前提的情形下,集合操作只有按照定义来进行。
glyc 2003-08-21
  • 打赏
  • 举报
回复
BlueSky2008() 说的有理。
如果只是按照定义来的话,效率一定不高。 按照happy__888的方法,复杂度有O(m*n)那么大。乱序情况下,判断一个元素是否在集合中的平均复杂度为O(m/2)。

的确应该先排序才行。
BlueSky2008 2003-08-20
  • 打赏
  • 举报
回复
这个应该是先将集合元素排序,在作集合运算。
设集合元素已排序,则交、并、判断子集的复杂度都可以达到O(m+n)。
而排序本身的复杂度是O(nlogn).当集合较大是,这样做是很划算的。

楼主要是有兴趣,就研究研究stl中有关set的几个算法吧,那里面的算法更精妙。

HUNTON 2003-08-20
  • 打赏
  • 举报
回复
应该就是根据数学定义来吧,这些概念都太基本了。我看中学生也都会吧。
寻开心 2003-08-20
  • 打赏
  • 举报
回复
集合要是散乱点(排列没有规律)的话,没有什么好办法,只有根据它的定义来了。

看你的数据结构如何定义,可以使用数组或者链表来模拟集合,需要实现的函数主要就是点是否在集合当中的判定。

交集,两个里面全有的;初始化输出集合为空,以一个集合为主,做循环,判断其中的点是否在另外一个当中,如果在就加入到要输出的交集里面。

并集,初始化输出集合为一个集合的复制,然后把另外一个集合里面的元素加入,加入的时候判断是否已经在输出集合当中存在,不存在的才加入。

A是否是B的子集就是判断A当中所有元素是否都在B当中,只有都在的时候才是其子集。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧