我正在研究向量的汉明权重,我所做的是以向量的方式计算向量中的所有1,是否有更有效的方法?
int HammingWeight(vector<int> a){
int HG=0;
for(int i=0; i<a.size(); i++){
if(a[i] == 1)
HG++;
}
return HG;
}
答案 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 现在这不太可能有助于提高性能,但使用较少的代码来达到同样的效果通常被视为一件好事。