我有一个函数来计算两个给定字符串的方差。是否有更快的方法(或算法)来做这样的事情?
请记住,我的琴弦的每个字母都装有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;
}
答案 0 :(得分:3)
虽然我仍然怀疑你的项目的字符串比较是the bottleneck,但我无法抗拒接受挑战......
您的所有序列均为13
chars long。 DNA序列仅包含字母ATCG
,可以在2位内编码。您可以将每个DNA序列存储在32位值内,让计算机并行进行比较:
根据计算机体系结构,可能存在位计数功能 在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
但我怀疑这是否显着