编辑距离算法

来源:互联网 发布:软件实施工程师面试 编辑:程序博客网 时间:2024/06/06 00:59

好几年前写的编辑距离算法,几年不看就忘了,先记录下来吧。

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½³¤Îª2UINT8_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 3for (i = 1; i < n; i++) {// Step 4for (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; }


0 0
原创粉丝点击