Determining if an unordered vectorlt;Tgt; has all unique elements(确定无序向量 T 是否存在拥有所有独特的元素)
问题描述
分析我的 cpu 绑定代码表明我花了很长时间检查容器是否包含完全唯一的元素.假设我有一些未排序元素的大容器(定义了 <
和 =
),我有两个关于如何做到这一点的想法:
Profiling my cpu-bound code has suggested I that spend a long time checking to see if a container contains completely unique elements. Assuming that I have some large container of unsorted elements (with <
and =
defined), I have two ideas on how this might be done:
第一个使用集合:
第二次遍历元素:
我已经尽我所能对它们进行了测试,根据我从阅读有关 STL 的文档中收集到的信息,答案是(像往常一样),这取决于.我认为在第一种情况下,如果所有元素都是唯一的,它会很快,但是如果存在很大的退化,操作似乎需要 O(N^2) 时间.对于嵌套迭代器方法,情况似乎正好相反,如果 X[0]==X[1]
,它会快速点亮,但如果所有元素都需要(可以理解)O(N^2) 时间是独一无二的.
I've tested them the best I can, and from what I can gather from reading the documentation about STL, the answer is (as usual), it depends. I think that in the first case, if all the elements are unique it is very quick, but if there is a large degeneracy the operation seems to take O(N^2) time. For the nested iterator approach the opposite seems to be true, it is lighting fast if X[0]==X[1]
but takes (understandably) O(N^2) time if all the elements are unique.
有没有更好的方法可以做到这一点,也许是为此目的而构建的 STL 算法?如果没有,是否有任何建议可以提高效率?
Is there a better way to do this, perhaps a STL algorithm built for this very purpose? If not, are there any suggestions eek out a bit more efficiency?
推荐答案
你的第一个例子应该是 O(N log N) 因为 set
每次插入需要 log N 时间.我认为不可能有更快的 O.
Your first example should be O(N log N) as set
takes log N time for each insertion. I don't think a faster O is possible.
第二个例子显然是O(N^2).系数和内存使用率低,因此在某些情况下可能会更快(甚至最快).
The second example is obviously O(N^2). The coefficient and memory usage are low, so it might be faster (or even the fastest) in some cases.
这取决于 T
是什么,但为了通用性能,我建议对指向对象的指针向量进行排序.
It depends what T
is, but for generic performance, I'd recommend sorting a vector of pointers to the objects.
或在 STL 风格中,
or in STL style,
<小时>
当然,如果你可以对原始向量重新排序,
And if you can reorder the original vector, of course,
这篇关于确定无序向量 T 是否存在拥有所有独特的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!