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

时间:2013-11-11 08:47:56

标签: c++ vector

我试图比较2个大向量(整数),即在每个条目,看看两个向量是否具有相同的元素。我尝试了一些东西,使用迭代器进行比较和一个简单的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);
}

5 个答案:

答案 0 :(得分:3)

如果向量是任意的,那么就不能渐渐地比顺序比较所有元素,就像现在这样做。因此,您将继续进行微优化,这可能会或可能不会提高性能(取决于编译器的优化器如何处理它们)。

我唯一能想到的就是将不变的评估从循环中取出。 (也许还没有在类型++上使用double,但我相信编译器无论如何都会以最优的方式处理它:)

double diff = 0;
for (
  auto itA = a.begin(), itB = b.begin(), endA = a.end();
  itA != endA;
  ++itA, ++itB
) {
  if (*itA != *itB) {
    diff += 1.0;
  }
}

答案 1 :(得分:2)

1)你可以通过将它分成碎片并为每个碎片使用不同的线程来提高速度。

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

3)根据您的编译器,其优化器,CPU等,您可能会或可能不会从消除分支中找到显着的性能优势:而不是......

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

...也许尝试......

diff += bool(*dd - *ee);

首先检查if ()版本的汇编语言是否值得查看优化器是否已经在执行此操作。如果bool(*dd - *ee)仍有分支,您可以尝试其他一些事情,如有必要,请回到内联汇编。

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

5)如果你为NSA做这件事,我建议你在VBA中重新编码。

答案 2 :(得分:1)

如果两个fingerprint值通常相同,如果您第一次执行此操作可能会有所帮助

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

测试两个阵列之间是否存在任何差异。只有当你有任何不同之处时,你才会看到有多少差异。

答案 3 :(得分:0)

您不需要自己编写,因为stl具有某些功能,请检查this

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

http://www.cplusplus.com/reference/algorithm/

答案 4 :(得分:0)

非常感谢所有不同的解决方案!非常感激。我使用diff作为double,因为在计算结束时需要将它放在内核函数中并且来自Python背景我认​​为最好先将它分配为double但我可能在这里错了但是谢谢评论!

另外,详细说明指纹(我本来应该做的,我的道歉)或者bittring是一个更好的词,在我的情况下每个位包含1或0我需要在每个比较索引两个位串是否相同。非常感谢我将尝试的解决方案,看看哪一个有助于加快速度!非常感谢!