我想编写一种算法,将一个内存块与另一个内存块进行比较,并提供一个目标值,以确定匹配的质量。我已经调查了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;
}
这个想法是两个内存空间越匹配,返回值就越低。例如,假设有三个内存块分别包含Hello World 0 !
,Hello World 1 !
和Hello World 2 !
,我想找出哪个内存块与候选者“最匹配” hello world 1 !
。我的想法是,我将运行Compare
函数三次依次比较候选项和每个内存块,Compare
应返回包含Hello World 1 !
的内存块的最低值。但是,它实际上正在做的是返回包含Hellow World 2 !
的最后一个内存块的最低值。
有没有人对如何改进此功能有任何想法?感谢。
答案 0 :(得分:3)
我认为你需要取(*pSrc - *pDst)
的绝对值。在“Hello World 1!”中,数字位置为0,而“Hello World 2”为0!你得到-1,-1小于0.
另外,如果你在很长一段内存中使用它,你可能会遇到堆栈问题,所以你可能想要迭代它。
您的算法不会考虑插入或删除的字符,因为它会按位置比较进行排名。如果你担心这个问题,问题会变得更加困难。
答案 1 :(得分:2)
考虑写abs(* pSrc- * pDst)?否则你会得到负值,它总是低于完美匹配(0)。
答案 2 :(得分:1)
改善这一点......
为源和目标提供长度。 提供值'n',用于比较源和目标的n个字节。 当源和目标的大小不同时,你需要处理这种情况,否则你将遇到走出末端的问题。
不要使用递归,除非你正在处理非常小的内存块。 您只需使用循环即可完成相同的工作。 这种方法真的很贵。
答案 3 :(得分:0)
如果您要比较字符串,可能需要查看soundex。