好几年前写的编辑距离算法,几年不看就忘了,先记录下来吧。
const UINT8_T CIndvstryword::LDCompare(char *lpszStrA,const UINT16_T uStrLenA,
char *lpszStrB,const UINT16_T uStrLenB)
{
if( lpszStrA == NULL || lpszStrB == NULL )
return 255;
UINT8_T u8cost;
// Step 1
if (uStrLenA == 0)
{
return uStrLenB;
}
if (uStrLenB == 0)
{
return uStrLenA;
}
// ÅжÏÊÇÖÐÎÄ»¹ÊÇÓ¢ÎÄtrunÊÇÓ¢ÎÄ
bool sbd = (lpszStrA[0]>=' '&&lpszStrA[0]<='@'||lpszStrA[0]>='A'&&lpszStrA[0]<='~') ? true : false;
bool tbd = (lpszStrB[0]>=' '&&lpszStrB[0]<='@'||lpszStrB[0]>='A'&&lpszStrB[0]<='~') ? true : false;
// Ò»¸öÊÇÖÐÎÄ£¬Ò»¸öÊÇÓ¢ÎÄ
if( sbd != tbd )
return 255;
// Ó¢ÎIJ½³¤Îª1£¬ÖÐÎIJ½³¤Îª2
UINT8_T u8Step = sbd ? 1 : 2;
UINT16_T n = (uStrLenA/u8Step+1);
UINT16_T m = (uStrLenB/u8Step+1);
// ²»Ö§³Ö³¤¶È´óÓÚ255µÄ×Ö·û´®±È½Ï
if( uStrLenA/u8Step > 255 || uStrLenB/u8Step > 255 )
return 255;
// ÉêÇë¿Õ¼ä
UINT8_T *u8matrix = (UINT8_T*)m_pAllocMemt->AllocMemory(n*m*sizeof(UINT8_T)); // matrix
if( u8matrix == NULL )
{
m_Log.AddLog(true,"×Ö·û±È½Ï´íÎó£¬ÄÚ´æ²»×ã\n");
return 255;
}
// Step 2
UINT16_T i , j;
for (i = 0; i < n; i++)
{
u8matrix[ i * m ]=i;
}
for (j = 0; j < m; j++)
{
u8matrix[j] = j;
}
/* // Step 3
for (INT32_T i = 1; i <= uStrLenA; i++)
{
//Step 4
for (INT32_T j = 1; j <= uStrLenB; j++)
{
// Step 5
INT32_T cost = (uStrLenB[j-1] == uStrLenA[i-1]) ? 0 : 1;
// Step 6
i8matrix[i][j] = _MinThree(i8matrix[i-1][j]+1, i8matrix[i][j-1]+1,i8matrix[i-1][j-1]+cost);
}
}
*/
// Step 3
for (i = 1; i < n; i++)
{
// Step 4
for (j = 1; j < m; j++)
{
//sΪºº×Ö
if(!tbd)
{
// Step 5
u8cost = (lpszStrB[(j<<1)-1] == lpszStrA[(i<<1)-1]&&lpszStrB[(j<<1)-2] == lpszStrA[(i<<1)-2]) ? 0 : 1;
}
else
{
// Step 5
u8cost = (lpszStrB[j-1] == lpszStrA[i-1]) ? 0 : 1;
}
// Step 6
u8matrix[i * m + j] = _MinThree(u8matrix[(i-1) * m + j]+1, u8matrix[i * m + j-1]+1,u8matrix[(i-1) * m + j-1]+u8Step);
}
}
UINT8_T uRet = u8matrix[n*m-1] * u8Step;
m_pAllocMemt->ReleaseMemory();
// Step 7
return uRet;
}