社区
C++ 语言
帖子详情
一道vector效率题
xf_pan
2009-05-14 04:30:13
vector<int> v1,v2,v3,
v1,v2里是不重复的数据,现要找出v1,v2中重复的数据保存到v3中。
考虑v1,v2,有大量数据时,怎样提高效率。
...全文
477
34
打赏
收藏
一道vector效率题
vector v1,v2,v3, v1,v2里是不重复的数据,现要找出v1,v2中重复的数据保存到v3中。 考虑v1,v2,有大量数据时,怎样提高效率。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
34 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chenxu_ustc
2009-05-15
打赏
举报
回复
[Quote=引用 8 楼 goodname 的回复:]
sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3));
[/Quote]
beautiful
liao05050075
2009-05-15
打赏
举报
回复
关键在于你的v1,v2里面最大的元素是多大?
xf_pan
2009-05-15
打赏
举报
回复
用hash,对于这题,具体应该怎么做呢。
ShardowM
2009-05-15
打赏
举报
回复
学习
jiangfeng999
2009-05-15
打赏
举报
回复
先排序,然后v1,v2再从头到尾进行查找,这样可以省去很多重复遍历的次数
排序函数
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
beyond071
2009-05-15
打赏
举报
回复
解决的挺好 学习了
insulted
2009-05-15
打赏
举报
回复
我来学习。。。。
amossavez
2009-05-15
打赏
举报
回复
先排序,用stl提供的排序算法sort,再求两个vector的交集,hash不见得比这个好,在你不了解hash的情况之下!!
liao05050075
2009-05-15
打赏
举报
回复
[Quote=引用 32 楼 xf_pan 的回复:]
引用 31 楼 hejinjing_tom_com 的回复:
自己写set, 用c 写, 当你创建完set, 重复值也就全找好了。
就是说建立一个红黑树,把v1,v2 数据全存进去,发现重复放到v3 中去。
缺点就是自己写。累点,但效率高。
同意楼上
也认为此题在这里考察的就是这种方法,
题意有,v1,v2,本身没有重复数据,新建一个空set,用v1,v2,size大的去初始化这个set(假如v2 size大),然后遍历
插入v1,找到重复的,,
[/Quote]
事实上,用红黑树与排序再STL求交没什么实质性区别,算法的复杂度都是O(nlogn)
hai040
2009-05-15
打赏
举报
回复
[Quote=引用 28 楼 xf_pan 的回复:]
用hash,对于这题,具体应该怎么做呢。
[/Quote]
直接用boost的hash_set
xf_pan
2009-05-15
打赏
举报
回复
[Quote=引用 31 楼 hejinjing_tom_com 的回复:]
自己写set, 用c 写, 当你创建完set, 重复值也就全找好了。
就是说建立一个红黑树,把v1,v2 数据全存进去,发现重复放到v3 中去。
缺点就是自己写。累点,但效率高。
[/Quote]
同意楼上
也认为此题在这里考察的就是这种方法,
题意有,v1,v2,本身没有重复数据,新建一个空set,用v1,v2,size大的去初始化这个set(假如v2 size大),然后遍历
插入v1,找到重复的,,
hjjdebug
2009-05-15
打赏
举报
回复
自己写set, 用c 写, 当你创建完set, 重复值也就全找好了。
就是说建立一个红黑树,把v1,v2 数据全存进去,发现重复放到v3 中去。
缺点就是自己写。累点,但效率高。
hityct1
2009-05-15
打赏
举报
回复
设两个vector长度:m\n
1)分别排序。 时间复杂度: O(mlogm)+O(nlogn)
2)然后用两个迭代器分别指向两个vector头部,然后比较两个迭代器指向的元素的大小,小的就向后移,然后再比较,如果有相等的就写入第三个vector。 时间复杂度:O(m+n)
Qlaiaqu
2009-05-14
打赏
举报
回复
排序后找重复吧,连标准模板库中的某个函数都是这么实现的,不记得名字了
iambic
2009-05-14
打赏
举报
回复
很多时候有序是自然而然的,不需要或者只需要简单的维护。
Hash虽然很多时候很快,用来求交集却很容易效率低下。
linfengc
2009-05-14
打赏
举报
回复
hash
liao05050075
2009-05-14
打赏
举报
回复
[Quote=引用 16 楼 iambic 的回复:]
先排序,然后求交集。
hash很慢的。
[/Quote]
Hash的复杂度是O(n)的,
排序的复杂度是O(nlogn)的,加上STL的求交是O(n)
这个不挺明显的吗?
zhaohongbo83
2009-05-14
打赏
举报
回复
对取交集是个不错的方法!
iambic
2009-05-14
打赏
举报
回复
先排序,然后求交集。
hash很慢的。
kiffa
2009-05-14
打赏
举报
回复
单论时间效率,从算法角度讲自然hash好。如果vector元素的最大值不是特别大(比如2000万以内)bitset<MAX_ELEMENT_VALUE> bitmap 还是可以用用的;
但结合现实来讲,对一个数组a的元素a[n]的随机访问虽然是常数时间,但这个常数时间并非固定不变,考虑到n的无序性,比如一个读取序列:a[1], a[1000000], a[1000]。。。如果像这种跳跃度很大的序列,必然会导致很高的cache miss率,以及可能的频繁换页,这往往导致时间效率非常低下。虽然这纯粹是次要复杂度,和问题本身的求解并没有也不应该有直接关系,但我们生活在不完美的现实世界,只能无奈的去接受它。
所以我们要先分析n的大概变化规律,没办法的话只能采取强制cache(锁页)、分块计算等纯属被逼出来的手段去对付它。
加载更多回复(14)
算法C++版
收集工作中经常遇到、经典的问
题
,抽象并给出交较优答案,方便同事优化、学习。用C++实现,本课程将持续... 七,元素是
vector
的二分查找,也就是
vector
<
vector
<int>>中二分查找。 八,具体的例子。
vector
与数组的使用指南
前言 作为c++ stl常用的容器之一,
vector
的使用频率一直很高,由于具备一系列的操作函数,使得它能很方便的存储和读写,所以
vector
在解
题
时应用很广。...同样
一道
题
,使用数组和使用
vector
,
效率
相差很大
从C语言到C++_14(
vector
的常用函数+相关选择
题
和OJ
题
)
从C语言到C++_14(
vector
的常用函数+相关选择
题
和OJ
题
)LeetCode力扣:136+118+26+137+260+169+17+53。其中用了摩尔投票法和简单的动态规划。
连续两天遇到的
一道
笔试
题
vector
和list区别
stl提供了三个最基本的容器:
vector
,list,deque。
vector
和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但...这些都大大影响了
vector
的
效率
。 l
C++
vector
的使用及
一道
模板
题
The Blocks Problem
vector
是一个C++中的一个可以实现自动增长的对象数组的一个模板类(大概就是个动态数组),如果数据不大的话使用起来十分方便省事,当然数据太大的话查找
效率
会低很多。。 二、初始化 首先,你要写个头文件: ...
C++ 语言
64,656
社区成员
250,485
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章