编辑距离算法

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

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; 
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值