当前位置:  开发笔记 > 编程语言 > 正文

用于查找字符串差异的位操作

如何解决《用于查找字符串差异的位操作》经验,为你挑选了2个好方法。

我的以下字符串试图找出两个字符串之间的区别.但它迭代字符串的长度非常慢:

#include 
#include 
#include 
using namespace std;


int hd(string s1, string s2) {
    // hd stands for "Hamming Distance"
    int dif = 0;

    for (unsigned i = 0; i < s1.size(); i++ ) {
        string b1 = s1.substr(i,1);
        string b2 = s2.substr(i,1);

        if (b1 != b2) {
            dif++;
        }
    }  

    return dif;
}

int main() {

    string string1 = "AAAAA";
    string string2 = "ATATT";
    string string3 = "AAAAA";

    int theHD12 = hd(string1,string2);
    cout << theHD12 << endl;

    int theHD13 = hd(string1,string3);
    cout << theHD13 << endl;
}

有没有这样做的快速替代方案?在Perl中,我们可以采用以下方法:

sub hd {
    return ($_[0] ^ $_[1]) =~ tr/\001-\255//;
}

这比迭代位置快2倍.

我想知道它在C++中的含义是什么?



1> schnaader..:

尝试通过以下方式替换for循环:

for (unsigned i = 0; i < s1.size(); i++ ) {
    if (b1[i] != b2[i]) {
            dif++;
    }
}  

这应该快得多,因为没有创建新的字符串.



2> Éric Malenfa..:

有趣的STL:

#include     //inner_product
#include  //plus, equal_to, not2
#include    
#include 

unsigned int 
hd(const std::string& s1, const std::string& s2)
{
    // TODO: What should we do if s1.size() != s2.size()?
    if (s1.size() != s2.size()){
      throw std::invalid_argument(
          "Strings passed to hd() must have the same lenght"
      );
    }

    return std::inner_product(
        s1.begin(), s1.end(), s2.begin(), 
        0, std::plus(),
        std::not2(std::equal_to())
    );
}


@gsamaras:在其基本版本中,inner_product计算两个范围A和B的乘积之和:A [0]*B [0] + A [1]*B [1] + ...在广义版本中(在这里使用),两个操作(加法和乘法)由调用者提供.我们在这里想要的是不同的元素对的数量,所以我们仍然希望第一个操作是加法(std :: plus),但我们希望第二个操作是"不相等"(std :: not( std :: equal_to))而不是乘法.
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有