vector和set的赋值,查找,定位效率问题。求解答

ge_tum 2015-10-02 04:46:08
如果知道大小,在赋值时使用并行计算加快速度
vector<int> A(Num);
#pragma omp parallel for
for(int i = 0; i < Num; ++i)
A[i] = function1;
然后查找vector A里的最大值和所在位置。
std::vector<int>::iterator a = max_element(A.begin(), A.end());
int maxLocation= distance(A.begin(),a);

这个程序重复4万次,大概用时是15s

然后考虑到set的查找要更快,所以想用set来做。但是set不可直接访问下标,在赋值上考虑两类:
1. 直接用
set<float> B;
for(int i = 0; i < Num; ++i)
B.insert(..function1..);
2: 先得到vector A,然后把A插到 set B里
vector<float> A(Num); A用最开始的方法得到。
set<float> B;
B.insert(A.begin(),A.end());


然后,在查找最大值:
std::set<float>::iterator a = max_element(B.begin(),B.end());
int maxLocation= distance(B.begin(),a);

但是问题是,这两种办法耗时反而更多,基本都是100s。 对于2中方法 B.insert(A.begin(),A.end()); 非常耗时。

请问下应该如何处理?还是说这种情况就用vector?
因为程序中设计到反复(上百万次)查找,并确定位置,每次查找的容器都含有10万个值,但是并不是每次查找的容器内的值都不变,即也需要反复更新容器。这个情况应当如何选择?
(容器内的值并非顺序排列)
请大神指教。谢谢。
...全文
766 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2015-10-02
  • 打赏
  • 举报
回复
1. 用 set 相当于进行了一次完整的排序,如果只需要最大值的话,不需要排序。所以这时用 set 应该会浪费时间。 2. set 不能存储重复的元素,如果你有存储重复元素的需求,就要用 multiset 3. set 是有序的,最大的就是最后一个,不需要用 max_element 或 distance 求位置 4. 用 vector ,提前分配空间,可以一次遍历完成插入、求最大值和位置 5. #pragma omp 不了解。但是并行的话,相当于每个线程处理了 vector 的一个子集(当然这个子集可能不连续)。那么,可以并行插入同时求到每个子集里的最大值和位置,插入完成后把每个子集的最大值比一下就好了。如果#pragma omp 不能支持,可以自己起线程。
lm_whales 2015-10-02
  • 打赏
  • 举报
回复
时间复杂度,除了平时常用的平均复杂度,最坏复杂度外 还可以用摊还(时间)来计算 所以,效率问题,也不仅仅是算法本身的问题
fefe82 2015-10-02
  • 打赏
  • 举报
回复
第一种情况,可以做一个 数值 -> 位置 的 unordered_map ,平均常数时间搜索,直接得到位置。建 map 会比建 vector 慢,但搜索快得多。 第二种情况,你得自己试试了。 有重复的,有 unordered_multimap 可以用,可以直接得到所有匹配。但是你要修改的话,map 可是不方便。
ri_aje 2015-10-02
  • 打赏
  • 举报
回复
有几个关键问题楼主没说。 1. 你这种用法,一次填充数据平均对应多少次查找啊? 2. 后面所谓的更新数据,是完全重建,还是基于原有的数据进行少量的插入删除? 从主楼说的看,往 vector 里填数的时候把最大值同时算出来就行了,后面更新数据的时候同时更新最大值。
paschen 版主 2015-10-02
  • 打赏
  • 举报
回复
用unsorted_set,不过要对你存储的数据类型定义一个Hash
ge_tum 2015-10-02
  • 打赏
  • 举报
回复
谢谢各位,综合各位的回复,我将问题在具体化。 例如有vector A. (这里,我程序中暂时用vector来装)。 A = [ 3,1,4,6,......] A里的内容是0 -- 5万 无序但不重复的数。 每次的赋值,即完全得到新的A。 反复查找某值是否在A里,若在给出位置。 这里的某值存在于 0 -- 7万之间 (即有在的,也有不在的。) 对于这个查找,我在程序中直接用的 vector里的find 和 distance。 这里分两类情况: 1. 每次赋值后(完全新的赋值,并非插入删除)都要进行几万次的查找(总之比较大)。 赋值次数比较小,总共才赋值10次左右。 2. 赋值次数比较多,就像我原帖说的,不停的完全更新向量,然后查找,定位。 还有一个问题。如果向量里有重复的,比如 A = [-1,2.3.5.-1.3.-1] 如何一次性找出所有“-1”元素所在的位置? 我是用while循环,find每次找一个,改掉他的值,再找下一个,直至找完。但是感觉比较慢。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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