快速矢量元素比较
Fast vector element comparison
我想比较填充整数的向量的元素,看看是否对于具有相同值的元素(并计算它们(。
例如,如果a[i]==x
,是否有b[j]==x
?
想到的第一个实现当然是最简单的实现:
for (int i=0; i < a.size(); i++) {
for (int j=0; j < b.size(); j++) {
if (a[i]==b[j]) {counter++;}
}
对于较大的矢量,这是减慢速度的方法。我想过一个交替算法,但我不熟练地实现没错,所以这就是我所拥有的和我的问题:
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (b[j] >= a[i]) {
counter++;
for (int k = i + 1; k < n; k++) {
if (a[k] >= b[j+1]) {
counter++;
for (int l = k + 1; l < m; l++) {
if (b[l] >= a[k]) {
counter++;
....
}
}
}
}
}
}
}
流程是我开始将a
的第一个元素与b
元素进行比较。当我命中时,我会跳到向量b
,并将其下一个元素与我之前比较的a
元素之后的a
元素进行比较。(由于 a
和 b
的元素是按升序存储的,一旦我正在比较的b
元素大于我在>= 上更改向量的元素a
而不是 ==(
我认为,对于调用自己的函数来说,这应该很容易做到。但我无法绕开它。
我希望有人能理解我想做什么,但我现在无法更好地解释它。从理论上讲,我认为对于升序向量来说,这应该更快,因为您只需要进行 N 比较(N 是较大向量的大小(而不是 N*M
.
这是合并两个排序向量的经典问题的变体。
如果向量已排序,您需要做的就是对向量b
中向量a
的顺序元素执行增量线性搜索。b
中的每个搜索都从上一个搜索停止的地方开始。这种方法将进行O(a.size() + b.size())
比较。
int count = 0;
int j = 0;
for (int i = 0; i < a.size(); ++i)
for (; j < b.size() && b[j] <= a[i]; ++j)
if (b[j] == a[i])
++count;
如果你仔细观察,你会发现这与@Anedar的答案完全相同,只是从"不同的有利位置"表达。
但是,如果这两个向量的长度明显不同(例如,a
比b
短得多(,那么取a
的顺序元素并在b
中进行二叉搜索可能是有意义的。同样,b
中的每个搜索都从先前找到的 b
元素"向右"工作。这种方法将进行O(a.size() * log b.size())
比较。
如果a.size() ~ b.size()
那么O(a.size() + b.size())
比O(a.size() * log b.size())
好。但如果a.size() << b.size()
,那就反过来了。
既然你说元素是按顺序存储的,你可以做这样的事情:
int i=0;
int j=0;
while(i< a.size() && j<b.size()){
if(a[i]==b[j]){
++counter;
++i;
++j;
}else if(a[i]<b[j]){
++i;
}else{
++j;
}
}
如果不需要使用向量,则可以使用 std::multiset 作为两个集合中值的容器。
这个 std::multiset 容器允许插入重复值并同时对值进行排序。您可以使用 std::multiset::count 获取元素的数量。
将以 O(logN( 复杂度执行一次检查,以检查 B 中的所有值是否都包含在 A 中,并且在最坏情况下重复复杂度的计数为 M(logN(。使用std::map也可以实现相同的效果,但集合比map占用更少的内存,并且使用起来更简单。
如果一个值在集合 B 中多次出现,则只能在集合 A 中进行一次检查。
- C++ 如何比较n个排序的整数向量以找到互元素?
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 如何在比较时更改集合元素的值(在 c++ 中)?
- 比较文本文件的元素
- 比较文本文件的元素
- 比较它们之间的元素并获取公共值的键
- 如何比较C++中向量的元素?
- 比较向量中的元素时所花费的时间呈指数级增长
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 用字符串 c++ 比较对向量的元素
- 如何与元素进行元素比较
- 字符指针对象和相应的字符数组元素比较
- 开发C++数组元素比较
- 快速矢量元素比较
- 使用下标运算符进行Integer Vector元素比较失败,但使用at函数成功
- 是否有可能判断哪个数组元素比较结果为真?
- 当>=用于元素比较时,插入排序比>慢,为什么?
- 如何在C++中逐元素比较相等的两个向量
- 简单的c++数组元素比较