PAT 1145 1078| hashing哈希表 平方探測法

##pat 1145:c++

<a href = "https://blog.csdn.net/qq_34594236/article/details/79814881">參考連接</a>數組

Quadratic probing (with positive increments only) is used to solve the collisions.:平方探測法解決衝突函數

哈希表:H(key)求餘數、二次平方探測法解決衝突、求平均查找長度AVL = 全部次數和/nspa

須要注意點:處理衝突統計查找次數時,若是查找到哈希表最後一個也失敗了,那麼次數要+1..net

#include<bits/stdc++.h>
using namespace std;

/*
哈希表:H(key)求餘數、二次平方探測法解決衝突、求平均查找長度AVL = All/n 
*/ 
const int maxn = 1e5+5;
int Tsize,n,m;
int a[maxn];
int b[maxn];
int hashTable[maxn];

bool isPrime(int x){
	if(x < 2) return false;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i == 0) return false;
	}
	return true;
}

int HashKey(int key){
	return key%Tsize;
}

int main(){
	memset(hashTable,-1,sizeof(hashTable));
	cin>>Tsize>>n>>m;
	while(isPrime(Tsize) == false) Tsize++;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<m;i++) cin>>b[i];
	//插入 
	for(int i=0;i<n;i++){
		bool flag = false;
		for(int j=0;j<Tsize;j++){
			int idx = (HashKey(a[i]) + j*j) % Tsize;//平方探測法解決衝突 
			if(hashTable[idx] == -1){
				hashTable[idx] = a[i];
				flag = true;
				break;
			}
		}
		if(flag == false){
			printf("%d cannot be inserted.\n",a[i]);
		}
	}
	//查找
	int cnt = 0;
	for(int i=0;i<m;i++){
		bool flag = false;
		for(int j=0;j<Tsize;j++){
			cnt++;
			int idx = (HashKey(b[i]) + j*j) % Tsize;//平方探測法解決衝突 查找下標 
			if(hashTable[idx] == b[i] || hashTable[idx] == -1 ){
				flag = true;
				break;
			}
		}
		if(flag == false) cnt++;
	}
	printf("%.1f",cnt*1.0/m);
	return 0;
}

##pat 1078 同上code

數組存hash表、hash函數求餘、平方探測法解決衝突,而且首先哈希表長度爲素數。blog

#include<bits/stdc++.h>
using namespace std;

int Tsize,n;
const int maxn = 1e4+10;
int a[maxn];
int table[maxn];

bool isPrime(int x){
	if(x < 2) return false;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i == 0) return false;
	}
	return true;
}

int getHash(int key){
	return key%Tsize;
}

int main(){
	cin>>Tsize>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	while(isPrime(Tsize) == false) Tsize++;
	bool first = true;
	for(int i=1;i<=n;i++){
		bool search = false;
		for(int j=0;j<Tsize;j++){
			int hashIdx = (getHash(a[i]) + j*j)%Tsize;
			if(table[hashIdx] == 0){
				if(first) {
					cout<<hashIdx;
					first = false;
				}
				else cout<<" "<<hashIdx;
				search = true;
				table[hashIdx] = a[i];
				break;
			}
		}
		if(search == false){
			if(first){
				first = false;
				cout<<"-";
			}
			else{
				cout<<" -";
			}
		}
	}
	return 0;
}

##另補充哈希衝突的處理方法 和 裝填因子: ci

相關文章
相關標籤/搜索