很久以前写的一个快速匹配查找算法,非空间换时间。
此算法已通过测试,是多年前自己写的,适合在微内存的设备上应用。比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); }