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)!我重新编写了使用汉明距离的算法,现在运行得非常好!