此算法已通过测试,是多年前自己写的,适合在微内存的设备上应用。比KMP算法快2.5倍,其他类似的算法可以忽视,其超短字串比SUNDAY,BM等算法的查找速度要快。
/************************************* 功能:搜索相同字串 参数: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 (167763 == iBufferFindIndex) //{ // _asm int 0x03; //} //比较是不是相同的字符关键位 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); }