客观记忆比较

时间:2011-05-13 20:44:34

标签: c++ memory recursion comparison

我想编写一种算法,将一个内存块与另一个内存块进行比较,并提供一个目标值,以确定匹配的质量。我已经调查了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 !的最后一个内存块的最低值。

有没有人对如何改进此功能有任何想法?感谢。

4 个答案:

答案 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