两个整型数组的交集

chin_chen 2009-03-05 12:10:38
如题,删除两个整型数组A和B的交集.
有啥办法没?要求复杂度最优。
...全文
154 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 litaoye 的回复:]
如果不考虑空间,用hash可以达到O(A+B)

否则的话,可以先对AB分别排序,然后用归并排序的方法,应该可以达到A*logA + B*logB + O(A+B)
[/Quote]
怎么建hash啊?是建一个数组,把B所有元素按大小放进在数组里面对应的位置,然后对A的元素一个个的找,找到的话就删掉是吧?是这样么?
绿色夹克衫 2009-03-05
  • 打赏
  • 举报
回复
如果不考虑空间,用hash可以达到O(A+B)

否则的话,可以先对AB分别排序,然后用归并排序的方法,应该可以达到A*logA + B*logB + O(A+B)
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ppass 的回复:]
我给出一个另类的思路,内存开销可能会大,但速度绝对快.
1. 找出2个数组的最大值nMax.
2. 定义一个桶array,容量为nMax.并全部初始化为0.
3. 遍历一遍数组A,将array[a[i]]的值=1; //不是++,因为A中可能也有重复的.
4. 遍历一遍数组B,将array[b[i]]的值++;
5. 遍历一遍数组array,将>1的值统统删除. //不是=2,因为B中有重复的,值-1,就是重复的次数.

看这个帖子,昨天刚刚讨论过的.
http://topic.csdn.net/u/20090304/…
[/Quote]
这其实就是1L说的Hash的办法
ppass 2009-03-05
  • 打赏
  • 举报
回复
我给出一个另类的思路,内存开销可能会大,但速度绝对快.
1. 找出2个数组的最大值nMax.
2. 定义一个桶array,容量为nMax.并全部初始化为0.
3. 遍历一遍数组A,将array[a[i]]的值=1; //不是++,因为A中可能也有重复的.
4. 遍历一遍数组B,将array[b[i]]的值++;
5. 遍历一遍数组array,将>1的值统统删除. //不是=2,因为B中有重复的,值-1,就是重复的次数.

看这个帖子,昨天刚刚讨论过的.
http://topic.csdn.net/u/20090304/17/10ee708f-6f9a-4100-b5fc-885fa8aca3a7.html
绿色夹克衫 2009-03-05
  • 打赏
  • 举报
回复
就是这样,如果个数还有要求的话,可以加一个计数,比如A里有2个10,B里有5个10,删除后B还需要保留3个10的话

也可以用比较现成的hashtable(C不太熟,也许不叫这个),.net里面叫做Dictionary

[Quote=引用 4 楼 chin_chen 的回复:]
引用 1 楼 litaoye 的回复:
如果不考虑空间,用hash可以达到O(A+B)

否则的话,可以先对AB分别排序,然后用归并排序的方法,应该可以达到A*logA + B*logB + O(A+B)

怎么建hash啊?是建一个数组,把B所有元素按大小放进在数组里面对应的位置,然后对A的元素一个个的找,找到的话就删掉是吧?是这样么?
[/Quote]

33,010

社区成员

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

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