溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

KMP二進(jìn)制算法在文件搜索中的應(yīng)用

發(fā)布時(shí)間:2020-08-03 18:13:34 來(lái)源:網(wǎng)絡(luò) 閱讀:1247 作者:Chinayu2014 欄目:編程語(yǔ)言
#define ARRAY_NUM(a)	((sizeof(a))/(sizeof(a[0])))
typedef unsigned char	byte;

void getnext_bin(byte sub[], int subSize, int next[])
{
	// 得到next數(shù)據(jù),其實(shí)本質(zhì)是自身KMP匹配
	printf("sub bin array : ");
	int i, j;
	i = 0;
	j = -1;
	next[0] = -1;
	TRACE(_T("%d\n"), next[i]);
	while (i + 1 < subSize)
	{
		if (j == -1 || sub[i] == sub[j])
		{
			++i;
			++j;
#if 1
			if (sub[i] != sub[j])
			{
				next[i] = j;
			}
			else
			{
				next[i] = next[j];
			}

#else
			next[i] = j;
#endif
			TRACE(_T(", %d\n"), next[i]);
		}
		else
		{
			j = next[j];
		}

	}
	printf("\n");
}


int kmp_bin(byte main[], int mainSize, byte sub[], int subSize, int next[])
{
	// 返回s在m中的第一個(gè)數(shù)據(jù)的下標(biāo)
	int i, j;
	i = 0;
	j = 0;
	int nIndex = -1;
	while (i < mainSize)
	{
		if (j == -1 || main[i] == sub[j])
		{
			++i;
			++j;
			if (j == subSize)
			{
				nIndex = (i - j);
				break;
			}
		}
		else
		{
			j = next[j];
		}
	}
	return nIndex;
}

調(diào)用方法:

void CtestDlg::OnBnClickedButton2()
{
	FILE  * fp;
	_wfopen_s(&fp, _T("c:\\Install.exe"), _T("rb"));

	fseek(fp, 0, SEEK_END);
	INT  length = ftell(fp);

	fseek(fp, 0, SEEK_SET);

	byte *pBuff = new byte[length];
	memset(pBuff, 0, length);
	fread(pBuff, length, 1, fp);

	byte t[] = { ";!@Install@!UTF-8!;!@InstallEnd@!" };

	// 二進(jìn)制序列的KMP
	int next[ARRAY_NUM(t)] = { 0 };
	getnext_bin(t, sizeof(t), next);
	TRACE("kmp_bin  = %d\n", kmp_bin(pBuff, length, t, 33, next));

	fclose(fp);
	delete []pBuff;
}


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI