Объективное сравнение памяти - PullRequest
2 голосов
/ 14 мая 2011

Я хотел бы написать алгоритм, который сравнивает один блок памяти с другим и дает объективное значение, чтобы определить качество соответствия. Я исследовал 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 ]

3 голосов
/ 14 мая 2011

Я думаю, вам нужно принять абсолютное значение (*pSrc - *pDst). В «Hello World 1!» Вы получаете 0 за номер позиции, а в «Hello World 2!» вы получаете -1, а -1 меньше 0.

Кроме того, если вы используете это на длинном участке памяти, у вас могут возникнуть проблемы со стеком, поэтому вы можете захотеть сделать его итеративным.

Ваш алгоритм не учитывает вставленный или удаленный символ, поскольку он сравнивает позиции по позициям. Если вы беспокоитесь об этом, проблема становится намного сложнее.

2 голосов
/ 14 мая 2011

Рассматривал написание abs (* pSrc- * pDst)?В противном случае вы получите отрицательные значения, которые всегда ниже идеального соответствия (0).

1 голос
/ 14 мая 2011

Чтобы улучшить это ...

Укажите длину как для источника, так и для пункта назначения.Укажите значение n для сравнения n байтов источника и получателя.Вам нужно разобраться со случаем, когда источник и пункт назначения не совпадают по размеру, или у вас возникнут проблемы с выходом из конца.

Не используйте рекурсию, если вы не имеете дело сдействительно маленькие блоки памяти.Вы можете сделать ту же работу, просто используя цикл.Этот метод действительно очень дорогой для вызова.

0 голосов
/ 14 мая 2011

Если вы сравниваете строки, вы можете посмотреть soundex .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...