我正在计算一个向量的汉明权重,我所做的就是以线性的方式计算向量中的所有1,有没有更有效的方法?
int HammingWeight(vector<int> a){
int HG=0;
for(int i=0; i<a.size(); i++){
if(a[i] == 1)
HG++;
}
return HG;
}发布于 2013-05-25 19:23:55
要计算hamming权重,您需要访问每个元素,给出O(n)最佳情况,使您的循环与在打折微优化时一样有效。
然而,您的函数调用本身效率极低:您通过值传递向量,导致它的所有内容的副本。这个副本很容易比函数的其余部分加起来更昂贵。此外,在你的函数中根本没有任何东西需要那个拷贝。因此,将签名更改为int HammingWeight(const std::vector<int>& a)应该会使您的函数更加高效。
我想到了另一个(可能的)优化,假设您的vector只包含1和0(否则我看不出您的代码有什么意义)。在这种情况下,您可以只向HG添加相应的faster元素,去掉if (添加通常比分支快得多):
for(size_t i=0; i<a.size(); ++i)
HG+=a[i];我假设这可能会更快,但是它实际上是不是更快取决于编译器如何优化。
如果你真的需要,你当然可以应用常见的微优化(循环展开,向量化,...),但这还为时过早,除非你有充分的理由这样做。此外,在这种情况下,要做的第一件事(同样假设向量只包含0和1)是使用更紧凑(读取效率更高)的数据表示。
还请注意,这两种方法(直接求和和if版本)也可以使用标准库表示:
int HG=std::count(a.begin(), a.end(), 1);所做的事情基本上与您的codeint HG=std::accumulate(a.begin(), a.end(), 0);等同于上面提到的loopI 现在,这不太可能有助于提高性能,但使用更少的代码来实现相同的效果通常被认为是一件好事。
https://stackoverflow.com/questions/16748947
复制相似问题