首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >vector<int> C++的Hamming权重

vector<int> C++的Hamming权重
EN

Stack Overflow用户
提问于 2013-05-25 19:11:40
回答 1查看 1.4K关注 0票数 0

我正在计算一个向量的汉明权重,我所做的就是以线性的方式计算向量中的所有1,有没有更有效的方法?

代码语言:javascript
复制
int HammingWeight(vector<int> a){
    int HG=0;

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

Stack Overflow用户

回答已采纳

发布于 2013-05-25 19:23:55

要计算hamming权重,您需要访问每个元素,给出O(n)最佳情况,使您的循环与在打折微优化时一样有效。

然而,您的函数调用本身效率极低:您通过值传递向量,导致它的所有内容的副本。这个副本很容易比函数的其余部分加起来更昂贵。此外,在你的函数中根本没有任何东西需要那个拷贝。因此,将签名更改为int HammingWeight(const std::vector<int>& a)应该会使您的函数更加高效。

我想到了另一个(可能的)优化,假设您的vector只包含1和0(否则我看不出您的代码有什么意义)。在这种情况下,您可以只向HG添加相应的faster元素,去掉if (添加通常比分支快得多):

代码语言:javascript
复制
 for(size_t i=0; i<a.size(); ++i)
    HG+=a[i];

我假设这可能会更快,但是它实际上是不是更快取决于编译器如何优化。

如果你真的需要,你当然可以应用常见的微优化(循环展开,向量化,...),但这还为时过早,除非你有充分的理由这样做。此外,在这种情况下,要做的第一件事(同样假设向量只包含0和1)是使用更紧凑(读取效率更高)的数据表示。

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

  • int HG=std::count(a.begin(), a.end(), 1);所做的事情基本上与您的code
  • int HG=std::accumulate(a.begin(), a.end(), 0);等同于上面提到的loopI

现在,这不太可能有助于提高性能,但使用更少的代码来实现相同的效果通常被认为是一件好事。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16748947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档