C语言实现构造哈希表,计算等概率的情况查找成功与不成功的平均查找长度

题目描述:

    设哈希函数为H(key)=i/2,其中i为关键字中的第一个字母在字母表中的序号,处理冲突使用线性探测法。编程实现:构造哈希表:在地址空间为0~12,对以下关键字序列:(Jan,Feb,Apr,May,Jun,Jul,Aug,Sep,Oct)建哈希表,并且求出等概率情况下查找成功与不成功的平均查找长度。

实现代码:

typedef struct HashTable{
	char data[4];
	int count;    //记录比较次数
}HashTable;
void createHash(HashTable H[], int n){
	int key, i,d,key_new;
	char ch[9][4] = { { "Jan" }, { "Feb" }, { "Apr" }, { "May" }, { "Jun" }, { "Jul" }, { "Aug" }, { "Sep" }, { "Oct" } };
	for (int j = 0; j < n; j++){     //哈希表的初始化
		H[j].data[0] = ' ';    //首字符为‘ ’代表空
		H[j].count = 0;
	}
	for (int j = 0; j < 9; j++){
		i = ch[j][0] - 'A' + 1;
		key = i / 2;
		if (H[key].data[0] == ' '){
			H[key].count = 1;
			strcpy(H[key].data, ch[j]);
		}
		else       //使用线性探测法解决冲突
		{
			d = 1;  //增量
			key_new = (key + d) % n;
			while (H[key_new].data[0]!=' ')
			{
				d++;
				key_new = (key + d) % n;
			}
			strcpy(H[key_new].data, ch[j]);
			H[key_new].count = d+1;
		}
	}
}
float succLength(HashTable H[], int n){
	int num = 0, sum = 0;
	float ASL;
	for (int i = 0; i < n; i++){
		if (H[i].data[0] != ' '){
			sum += H[i].count;
			num++;                  //记录哈希表中实际存在多少个值
		}
	}
	ASL = (float)sum / num;
	return ASL;
}
float unsuccLength(HashTable H[], int n){
	int sum = 0, num = 0,k;
	float ASL;
	for (int i = 0; i < n; i++){
		num = 1;
		if (H[i].data[0] != ' '){
			k = (i + 1) % n;
			num++;                          //num记录哈希表中每个序号查找不成功的次数
			while (H[k].data[0] != ' '){
				num++;  
				k = (k + 1) % n;
			}
		}
		sum += num;
	}
	ASL = (float)sum / n;
	return ASL;
}

int main(){
	HashTable H[13];
	float ASL_succ, ASL_unsucc;
	createHash(H, 13);
	ASL_succ = succLength(H, 13);
	ASL_unsucc = unsuccLength(H, 13);
	printf("查找成功的平均查找长度:%.2f\n", ASL_succ);
	printf("查找不成功的平均查找长度:%.2f", ASL_unsucc);

	system("pause");
	return 0;
}

结果输出:

猜你喜欢

转载自blog.csdn.net/weixin_42070473/article/details/105715020