C++ 客观记忆比较

C++ 客观记忆比较,c++,memory,recursion,comparison,C++,Memory,Recursion,Comparison,我想写一个算法,将一个内存块与另一个内存块进行比较,并提供一个客观值,从而确定匹配的质量。我已经研究了memcmp,它真正有用的是确定两个内存块是否相同。我已经编写了一个递归函数来实现这一点,但它工作得不太正常 DWORD CMemory::Compare( LPBYTE pDst, LPBYTE pSrc, DWORD len ) { DWORD dwDiff; if ( len == 0 ) { dwDiff = 0; } else

我想写一个算法,将一个内存块与另一个内存块进行比较,并提供一个客观值,从而确定匹配的质量。我已经研究了
memcmp
,它真正有用的是确定两个内存块是否相同。我已经编写了一个递归函数来实现这一点,但它工作得不太正常

DWORD CMemory::Compare( LPBYTE pDst, LPBYTE pSrc, DWORD len )
{
    DWORD dwDiff;

    if ( len == 0 )
    {
        dwDiff = 0;
    }
    else
    {
        dwDiff = (*pSrc - *pDst) * len; // * len is attempt to weight difference by MSB
        dwDiff += this->Compare( pSrc + 1, pDst + 1, len - 1 );
    }

    return dwDiff;
}
其思想是,两个内存空间匹配得越紧密,返回值就越低。例如,假设有三个内存块包含
helloworld 0
你好,世界1,和
你好,世界2,我想找出哪个内存块与候选者
hello world 1“最匹配”。我的想法是运行
Compare
函数三次,依次比较候选内存块和每个内存块,并且
Compare
应该返回包含
Hello World 1!的内存块的最低值。然而,它实际上是在为最后一个包含
Hellow World 2!的内存块返回最低值


有人对我如何改进这个功能有什么想法吗?谢谢。

如果您正在比较字符串,您可能需要查看。

我认为您需要获取
(*pSrc-*pDst)的绝对值。
。在“Hello World 1!”中,数字位置为0,而在“Hello World 2!”中为-1,并且-1小于0

此外,如果在一长段内存中使用此选项,可能会遇到堆栈问题,因此您可能希望使其迭代

您的算法不会考虑插入或删除的字符,因为它会逐个位置进行比较。如果你担心这一点,问题会变得更难。

是否考虑过编写abs(*pSrc-*pDst)?否则会得到负值,这些值总是低于完美匹配值(0)。

要改善这一点

提供源和目标的长度。 提供一个值“n”,用于比较源和目标的n个字节。 当源和目标大小不一样时,您需要处理这种情况,否则您将在离开末端时遇到问题

不要使用递归,除非处理的是非常小的内存块。 您可以通过使用循环来完成相同的工作。
这个方法调用起来非常昂贵。

它不一定是字符串。我只是使用字符串(
char[]
)来测试这个东西,因为它们最容易从控制台输入和显示。一旦,这是可行的,它将比较二进制数据。+1,再加上一个额外的道德点,即插入和删除将使该算法认为整个区域的其余部分是完全不同的。有一些diff算法试图补偿这种情况,但这很棘手,也很容易被愚弄。如果你曾经有过一个
diff
display不同步并开始显示愚蠢的“diff”,你知道我在说什么。“Hello World 1!”和“Hello World 1!”是不等价的。也就是说,
'H'-'H'!=0
。然而,你们可能会发现一些具有绝对值的东西。我的整体算法目前的结构是绝对值由
比较的最终返回值确定。如果我理解正确的话,我应该先计算每一个差值的绝对值,然后再将其加到总和中。@Jim Fall:但是,“Hello World 1!”和“Hello World 2!”的H差值是相同的,因此不会有比较性的差异。是的,你应该取每一个差的绝对值。为什么不取汉明距离呢@c-微笑:谢谢你的建议(+1)!我重新编写了使用汉明距离的算法,现在运行得非常好!