Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算两个长向量中不同元素的最快方法_C++_Vector - Fatal编程技术网

C++ 计算两个长向量中不同元素的最快方法

C++ 计算两个长向量中不同元素的最快方法,c++,vector,C++,Vector,我试图比较两个大向量(整数),即在每个条目上,看两个向量是否有相同的元素。我尝试了一些方法,使用迭代器进行比较,并使用一个简单的for循环。这两种方法都有效,但我需要一些能加快速度的方法,因为我需要比较很多向量。在C++中,最好的方法是什么?非常感谢 typedef vector<int> fingerprint; double aakernel(fingerprint a,fingerprint b, double h){ double diff = 0; ve

我试图比较两个大向量(整数),即在每个条目上,看两个向量是否有相同的元素。我尝试了一些方法,使用迭代器进行比较,并使用一个简单的for循环。这两种方法都有效,但我需要一些能加快速度的方法,因为我需要比较很多向量。在C++中,最好的方法是什么?非常感谢

typedef vector<int> fingerprint;

double aakernel(fingerprint a,fingerprint b, double h){

    double diff = 0;
    vector<int>::iterator dd = a.begin();
    vector<int>::iterator ee = b.begin();

    for(; dd != a.end() && ee != b.end() ;++dd, ++ee){ /*option one*/
        if (*dd!=*ee){
            diff++;
        }

    }


    for (int dd=0;dd<int(a.size());dd++){ /*option two*/
        if (a[dd]!=b[dd]){
            diff++;
        }
    }
    double due = (h/(1-h));
    double q = -log(due)*diff;
    double K = exp(q);
    return (K);
}
typedef矢量指纹;
双a内核(指纹a、指纹b、双h){
双差=0;
向量::迭代器dd=a.begin();
向量::迭代器ee=b.begin();
对于(;dd!=a.end()&&ee!=b.end();++dd,++ee){/*选项一*/
如果(*dd!=*ee){
diff++;
}
}

对于(int-dd=0;dd,如果向量是任意的,那么你不可能像现在这样,渐进地比较所有元素。因此,你只剩下微优化,这可能会提高性能,也可能不会提高性能(取决于编译器的优化程序如何处理它们)

我能想到的唯一一个方法是将不变的求值从循环中去掉(可能也不在类型
double
上使用
++
,但我相信编译器无论如何都会以最佳方式处理此问题):


您不需要自己编写,因为stl有特定的函数来完成这项工作,请检查

您可以在此处查看更多算法:


如果两个
指纹
值通常相同,如果您首先执行

memcmp(&a[0], &b[0], a.size() * sizeof(int))

测试两个数组之间是否有任何差异。只有在有任何差异的情况下,您才去看看有多少差异。

非常感谢所有不同的解决方案!非常感谢。我将diff用作double,因为在计算结束时,它需要放在内核函数中并来自Python背景我认为在第一个位置分配两倍会更好,但是我可能错了,但是谢谢你的评论

另外,详细说明指纹(我首先应该这么做,我道歉)或者,也许比特串是一个更好的词,在我的例子中,每个比特都包含1或0,我需要在每个索引处比较两个比特串是否相同。再次感谢您提供的解决方案,我将尝试看看哪一个有助于加快速度!非常感谢各位!

1)您可以使用将其划分为多个部分并为每个部分使用不同的线程来加快速度

2) 您还可以研究并行处理机器操作码,例如MMX,看看它们是否适用

3) 取决于你的编译器,它的优化程序,CPU等等。你可能会发现,也可能不会发现,仅仅通过消除分支就可以显著提高性能:而不是

if (*dd != *ee){
    diff++;
}
……试试看

diff += bool(*dd - *ee);
首先检查
if()
版本的汇编语言,看看Optimizer是否已经这样做了。如果
bool(*dd-*ee)
仍然有分支,您可以尝试其他一些方法,如果需要,可以使用内联汇编

4) 假设您最终将同一个向量与许多其他向量进行比较,您可以在数据中存储范围的校验和/哈希,这样,当将同一个向量与不同的备选方案进行比较时,只会考虑具有不同哈希的区域:这可能会遗漏一些差异-对于一个好的哈希,大约1/2^位-但如果这是用于计算erprints我认为这是概率性的,这是无关紧要的


5) 如果你是为NSA这样做的,我建议用VBA重新编码。

这些向量排序了吗?你的问题很模糊,你想如何比较?如果它们完全相等?有多少不同的元素?得到不同的元素?得到对称差?@billz我想说的是,目标是根据不同元素的数量计算指数ents,正如OP的代码现在所做的那样。@Angew很遗憾OP在标题和文本中提出了不同的问题。如果有超过2^53个不同的元素,那么
double
实际上会出错(因为
++
将停止任何操作)然而,计算
size\u t
并在最后转换为
double
会减少错误。当然,这不太可能发生,但使用
double
只会引入更多的怪癖。链接不是答案。如何使用
find\u if
计算两个向量之间不同元素的数量?这可能是错误的概括:如果通常情况下,数组是相同的,只保留几个点,那么你可以
memcmp
大的块,只在不匹配的地方进行详细说明。@leftaround关于你也可以通过分而治之的方法来做这件事:逐步测试较小的块。不管怎样,你可能会发现
a==b
just a
memcmp
取决于您的编译器有多聪明。不幸的是,即使在发布版本中,我的似乎也不够聪明:-/
diff += bool(*dd - *ee);