数据结构散列

哈希

在这里插入图片描述

#include <stdio.h>
#define MaxKey 1000
//哈希函数
int hash(const char* key) {
	int h = 0, g;
	while (*key) {
		h = (h << 4) + *key++;
		g = h & 0xf0000000;
		if (g) {
			h ^= g >> 24;
		}
	}
	return h % MaxKey;//算出下标要取余
}
int main() {
	//5个字符串指针
	const char* pStr[5] = {"xiongda","lele","hanmeimei","wangdao","fenghua"};
	int i;
	const char* pHash_table[MaxKey] = { NULL };//哈希表,散列表
	for (i = 0; i < 5; i++) {
		printf("%s is key =%d\n", pStr[i],hash(pStr[i]));//算出哈希值并打印
		pHash_table[hash(pStr[i])] = pStr[i];//存入哈希表
	}
	return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char* SString;
//为什么从1位置开始比较,因为
int Index(SString S, SString T) {
	int i = 1,j = 1;
	while (i<=S[0] && j<=T[0]) {
		if (S[i] == T[j]) {
			++i, ++j;//继续比较后续字符
		}
		else {
			i = i - j + 2; j = 1;//指针后退重新开始匹配
		}
	}
	if (j > T[0]) return i - T[0];
	else return 0;
}
//游标 遍历T
void get_next(char T[], int next[]) {
	int i = 1;
	next[1] = 0;//恒为0
	int j = 0;
	//abaabcac
	while (i < T[0]) {//T[0]记录了字符串的长度
		if (j == 0 || T[i] == T[j])//j=0,说明再次回到了开头
		{
			++i; ++j;
			next[i] = j;//记录出现重复的位置
		}
		else {
			j = next[j];//不相同,找个位置重新比较
		}
	}
}
int KMP(char S[], char T[], int next[], int pos) {
	int i = pos;//开始查找的起始位置
	int j = 1;
	while (i == 0 || S[i] == T[j]) {
		if (j == 0 || S[i] == T[j]) {//相等各自加加,往后走
			++i;
			++j;
		}
		else//不等,就回退next[j]位置
			j = next[j];
	}
	if (j > T[0]) return i - T[0];
	else return 0;
}
int main() {
	//字符串进行初始化
	char S[225];
	char T[10];
	int next[10];
	int pos;
	S[0] = strlen("abcabaaabaabcac");//strlen里有多少个字符
	strcpy(S + 1, "abcabaaabaabcac");
	T[0] = strlen("abaabcac");
	strcpy(T + 1, "abaabcac");
	pos = Index(S, T);//暴力匹配
	if (pos) {
		printf("匹配成功,位置为%d\n", pos);
	}
	else {
		printf("未匹配\n");
	}
	get_next(T, next);//算出next数组
	pos = KMP(S, T, next, 1);
	if (pos) {
		printf("匹配成功,位置为%d\n", pos);
	}
	else {
		printf("未匹配\n");
	}
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值