随机产生n个数,生成哈希表,用线性探测解决冲突,验证数组的正确性并计算查找成功时的ASL

#include<stdio.h>
#include<time.h> 
#include<stdlib.h>
#include<math.h>
int a[1000]={0};//全局数组初始化为0 
enum EntryType{Legitimate,Empty,Deleted};

struct HashEntry{
	int Data;
	enum EntryType Info;
};

struct HashTable{
	int TableSize;
	struct HashEntry *Cells;
};

int findprime(int n){//找到大于n的素数 
	int i,j,k;
	while(n++){
		j=1;
		k=sqrt(n);
		for(i=2;i<=k;i++){
			if(n%i==0){
				j=0;
				break;
			}
		}
		if(j==1)
		break;
	}
	printf("%d\n",n);//输出表的TableSize的大小,判断找的素数是否正确 
	return n;
};

struct HashTable *CreateTable(int k){
	struct HashTable *H;
	int i;
	H=(struct HashTable *)malloc(sizeof(struct HashTable));
	H->TableSize = findprime(k);//找到一个大于等于n的素数作为哈希表中数组的长度 
	H->Cells=(struct HashEntry *)malloc(sizeof(struct HashEntry) * H->TableSize);
	for(i=0;i<H->TableSize;i++){
		H->Cells[i].Info=Empty;//初始化 
	}
	return H;
};

int Hash(int k,int TableSize ){
	return k% TableSize;//求余取下标 
}

int find(struct HashTable * H,int K){
	int Pos,newPos;
	int num=0;
	Pos=Hash(K,H->TableSize);
	newPos=Pos;
	while(H->Cells[newPos].Info!=Empty&&H->Cells[newPos].Data!=K){
		num++;
		newPos=Pos+num;
		if(newPos>=H->TableSize)
		newPos%=H->TableSize;
	}
	return newPos;
}

void insert(struct HashTable *H,int k,int i){
	int pos;
	pos=find(H,k);
	if(H->Cells[pos].Info!=Legitimate){
		H->Cells[pos].Info=Legitimate;
		H->Cells[pos].Data=k;
		a[i]=k;//如果数有重复的,则a[i]中的值仍然为0 
	}
}

int findx(struct HashTable *H, int K) {
    int Pos,newPos;
    int num = 0;
    Pos = Hash(K, H->TableSize);
    newPos = Pos;
    while (H->Cells[newPos].Info != Empty 
           && H->Cells[newPos].Data != K ) {
        num ++;
        newPos = Pos + num;//线性探测解决冲突 
        if (newPos >= H->TableSize)
            newPos %= H->TableSize;
             }
    if( H->Cells[newPos].Data == K){
    	printf("%d\n",newPos);
	}
	else{
		printf("not found\n");
	}
	printf("\n");
	return 0;
}

int findcishu(struct HashTable *H,int k)
{
	int Pos,newPos;
    int num = 0;
    int n=1;
    Pos = Hash(k, H->TableSize);//用取余数法得到数组的下标 
    newPos = Pos;
    while (H->Cells[newPos].Info != Empty && H->Cells[newPos].Data != k )
		{
        num ++;
        newPos = Pos + num;
        n++;
        if (newPos >= H->TableSize)
            newPos %= H->TableSize;
        }
             
    if( H->Cells[newPos].Data == k)
    	return n;
    else
    return 0;
}

int main(){
	struct HashTable *H;
	int n;
	scanf("%d",&n);//n在1000之内 
	H=CreateTable(n);
	srand((int)time(NULL));
	int i,j,k=0,w=0;
	
	for(i=0;i<n;i++)
	{
		j=rand()%1001;//产生【0-1000】的随机数 
		printf("%d ",j);
		if(j==0)//当产生的随机数就为0时,记录数组的下标 
		k=i;
		w=1;
		insert(H,j,i);
	}
	printf("\n");
	printf("\n");
	for(i=0;i<n;i++){//输出a[i]数组的值,判断是不是解决了重复元素的问题 
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("\n");
	
	int c[3];//输出下标,验证这三个数哈希表中的数组位置是否正确
	for(i=0;i<3;i++)
	{
	scanf("%d",&c[i]);
	findx(H,c[i]);
    }
    
    float sum=0;
    int o=0;
    for(i=0;i<n;i++){
    	if(a[i]!=0||(i==k&&w==1)){//哈希表中不可以有重复的元素,为0则代表为重复,当i==k时,代表产生的随机数中就有0 
    	sum+=findcishu(H,a[i]);//w=1用来预防a[0]=0但是a[0]是空的情况 
		o++;//o用来记录有多少个有效数字 
		}
	}
	float p;
	p=sum/o;
	printf("%.2f",p);//输出ASL的值 
	return 0;
}

在草稿纸上计算,验证ASL和下标的准确性,比8大的最小素数是11,则构建一个11的数组存放随机数

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值