##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