最近学习查找算法,自己也琢磨的学着写了一个(见笑了)

aliu134 2018-07-06 03:24:30
/*
lpdStr 、即被搜索的文本
dnSize 、即被搜索本文的大小
lpsStr 、指定搜索的内容
snSize 、指定搜索内容的大小
*/
#define MAX_BMAP_SIZE (256U)
#define MAX_BINDEX_SIZE (MAX_BMAP_SIZE + 1U)

static unsigned char g_strChar[MAX_BMAP_SIZE][MAX_BINDEX_SIZE] = { { 0U } };

static int _cdecl al_bm_search(const unsigned char * lpdStr, int dnSize, const unsigned char * lpsStr, int snSize)
{
register int n;
register int i = 0;

do {
if (0U == g_strChar[lpsStr[i]][0]) {
n = 1;
g_strChar[lpsStr[i]][0] = n;
g_strChar[lpsStr[i]][n] = i;
}
else {
n = 2;
do {
if (0U == g_strChar[lpsStr[i]][n]) {
g_strChar[lpsStr[i]][n] = i;
g_strChar[lpsStr[i]][0] = n;
break;
}
} while ((++n) < MAX_BINDEX_SIZE);
}
} while ((++i) < snSize);

for (i = (snSize - 1); i < dnSize; )
{
if (g_strChar[lpdStr[i]][0] != 0U)
{
int nOffset;
register int nIndex;

n = 1; do {
nOffset = i - g_strChar[lpdStr[i]][n];

if (lpdStr[nOffset] == lpsStr[0]) {

nIndex = 1; do {
if (lpdStr[++nOffset] != lpsStr[nIndex]) {
goto GOTONEXT;
}
} while ((++nIndex) < snSize);

nOffset -= (nIndex - 1);

i = 0; do {
if (0U != g_strChar[lpsStr[i]][0]) {
n = 1;
do {
g_strChar[lpsStr[i]][n++] = 0U;
} while (n < g_strChar[lpsStr[i]][0]);
g_strChar[lpsStr[i]][0] = 0U;
}
} while ((++i) < snSize);

return nOffset;
GOTONEXT:
continue;
}
} while ((++n) < (g_strChar[lpdStr[i]][0] + 1));
}
i += snSize;
}

i = 0; do {
if (0U != g_strChar[lpsStr[i]][0]) {
n = 1;
do {
g_strChar[lpsStr[i]][n++] = 0U;
} while (n < g_strChar[lpsStr[i]][0]);
g_strChar[lpsStr[i]][0] = 0U;
}
} while ((++i) < snSize);

return (-1);
}

//也不知道快不快?!
...全文
134 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
aliu134 2018-07-06
  • 打赏
  • 举报
回复
代码中间部分的代码我改动了,小删掉了一段核心,速度慢了很多。尽情复制吧。
alZre0 2018-07-06
  • 打赏
  • 举报
回复
brother,so cool!

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧