向量<int> C ++ </int>的汉明权重

时间:2013-05-25 11:11:40

标签: c++ optimization hamming-distance

我正在研究向量的汉明权重,我所做的是以向量的方式计算向量中的所有1,是否有更有效的方法?

int HammingWeight(vector<int> a){
    int HG=0;

    for(int i=0; i<a.size(); i++){
        if(a[i] == 1)
            HG++;
    }
    return HG;
}

1 个答案:

答案 0 :(得分:1)

要计算汉明重量,你需要访问每个元素,给你O(n)最佳情况,使你的循环在折扣微优化时有效。

但是,您的函数调用本身效率极低:您按值传递向量,从而生成所有内容的副本。这个副本可以比其他功能组合更容易。此外,您的功能中根本没有任何东西可以实际需要该副本。因此,将签名更改为int HammingWeight(const std::vector<int>& a)应该可以使您的功能更加高效。

假设您的vector仅包含1和0(或者我看不到您的代码有意义),我会想到另一种(可能的)优化。在这种情况下,您可以将相应的vectorelement添加到HG,摆脱if(添加通常比分支快得多):

 for(size_t i=0; i<a.size(); ++i)
    HG+=a[i];

我认为这可能会更快,但是否实际上是否取决于编译器的优化方式。

如果您真的需要,您当然可以应用常见的微观优化(循环展开,矢量化......),但除非您有充分的理由,否则这样做是不成熟的。除此之外,首先要做的事情(再次假设向量只包含零和1)将使用更紧凑(读取有效)的数据表示。

另请注意,两种方法(直接求和和if版本)也可以使用标准库表示:

  • int HG=std::count(a.begin(), a.end(), 1);与您的代码基本相同
  • int HG=std::accumulate(a.begin(), a.end(), 0);等同于上面提到的loopI

现在这不太可能有助于提高性能,但使用较少的代码来达到同样的效果通常被视为一件好事。