计算两个字符串相似多少?

时间:2016-07-19 14:00:47

标签: c++ algorithm processing-efficiency cpu-speed

我有一个函数来计算两个给定字符串的方差。是否有更快的方法(或算法)来做这样的事情?

请记住,我的琴弦的每个字母都装有DNA,这意味着它们是A或T或C或G中的一个:

unsigned __int8 dis(char* FirstString, char* SecondString)
{
    unsigned __int8 distanceIndex = 0;
    for (unsigned __int8 i = 0; i < l; i++)
    {
        if (FirstString[i] != SecondString[i])
            distanceIndex++;
    }
    return distanceIndex;
}

4 个答案:

答案 0 :(得分:3)

虽然我仍然怀疑你的项目的字符串比较是the bottleneck,但我无法抗拒接受挑战......

您的所有序列均为13 chars long。 DNA序列仅包含字母ATCG,可以在2位内编码。您可以将每个DNA序列存储在32位值内,让计算机并行进行比较:

  • XOR-组合值以获得位差
  • 移位和OR组合AND归一化子集(奇数位,偶数位) 将比特差异转化为核碱基差异
  • 计算设定位以获得DNA序列距离

根据计算机体系结构,可能存在位计数功能 在CPU中实现。更多详细信息包含问题的答案:How to count the number of set bits in a 32-bit integer?

这是核心功能:

int distV(const unsigned va, const unsigned vb)
{
    const unsigned x = va ^ vb;
    const unsigned bn = ((x & 0xaaaaaaaa) >> 1 ) | (x & 0x55555555);
    return __builtin_popcount(bn);
}

请参阅使用长度为16的序列的full GCC-4.3.2 demo。我为比较本身测量了因子4的性能增量(不包括编码)。

答案 1 :(得分:1)

这是一种O(n)算法。

比较两个字符串之间的相等性(或本例中的距离)的最有效算法是O(n)。

答案 2 :(得分:0)

通过索引来避免随机访问,你可以稍快一点,你实际上只需要顺序访问字符串。

我不确定编译器是否可以为您优化。

答案 3 :(得分:0)

您可以免除class

if

但我怀疑这是否显着