很久以前写的一个快速匹配查找算法,非空间换时间。

此算法已通过测试,是多年前自己写的,适合在微内存的设备上应用。比KMP算法快不少,其他类似的算法可以省略,其超短字串比SUNDAY,BM等算法的查找速度要快。

 

第一篇原创算法是最近一年闲写的,之前,未经实战测试,只是简单对思路有所较高的评估,所以希望对它的不足大家要多多提议:

https://www.cnblogs.com/liuqian134/p/9280495.html

 

/*************************************
功能:搜索相同字串
参数:lpBufferString 字符串缓冲区
参数:iBufferSize 缓冲区大小
参数:lpFindString 需要查找的字符串
参数:iFindSize 字符串大小
返回:找到字符串的索引位置
*************************************/
static int _cdecl FindString(const char * lpBufferString, int iBufferSize, const char * lpFindString, int iFindSize)
{
	//取中间一个字符作为关键位
	const int iFrontFindCount = iFindSize / 2;
	//取字符串后段长度
	const int iBackIndexSize = iFindSize - iFrontFindCount;
	//取最后一个查找字符
	const int iEndFindString = iFindSize - 1;

	int iFrontFindIndex;
	int iFrontBufferIndex;
	int iBackFindIndex;

	int iBufferFindIndex = iFrontFindCount;

	for (; iBufferFindIndex < iBufferSize; )
	{
		//比较是不是相同的字符关键位
		if (lpBufferString[iBufferFindIndex] == lpFindString[iFrontFindCount])
		{
			iFrontBufferIndex = iBufferFindIndex - 1;
			iFrontFindIndex = iFrontFindCount - 1;

			//如果是关键位则比较
			//字符串前段是否相同
			for (; iFrontFindIndex >= 0; )
			{
				if (lpBufferString[iFrontBufferIndex] != lpFindString[iFrontFindIndex])
				{
					//如果在前段内容中不存在则进位
					iBufferFindIndex = iBufferFindIndex + 1;
					break;
				}
				--iFrontBufferIndex;
				--iFrontFindIndex;
			}

			if (iFrontFindIndex < 0)
			{
				iBufferFindIndex = iBufferFindIndex + 1;
				iBackFindIndex = iFrontFindCount + 1;

				//如果前段无误则比较
				//字符串后段是否相同
				for (; iFindSize > iBackFindIndex; )
				{
					if (lpBufferString[iBufferFindIndex] != lpFindString[iBackFindIndex])
					{
						//如果在后段内容中不存在
						//则跳过后段的比较字符长
						//度提高效率
						iBufferFindIndex = iBufferFindIndex + iBackIndexSize;
						break;
					}
					++iBufferFindIndex;
					++iBackFindIndex;
				}

				//如果全部相同则返回在
				//整块字符串中的索引位
				if (iFindSize == iBackFindIndex)
				{
					return (iBufferFindIndex - iBackFindIndex);
				}
			}
			continue;
		}

		//是否结尾相同,不同则跳过一位
		if (lpFindString[iEndFindString] != lpBufferString[(iBufferFindIndex + iBackIndexSize)])
		{
			iBufferFindIndex = iBufferFindIndex + 2;
		}
		else
		{
			iBufferFindIndex = iBufferFindIndex + 1;
		}
		//++iBufferFindIndex;
	}
	return (-1);
}

  

posted on 2018-07-23 20:36  AL10000  阅读(724)  评论(0编辑  收藏  举报

导航