PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
來(lái)源:acwing
本題的分析見(jiàn)另一道PAT的題目:PAT甲級(jí)1078 Hashing:[C++題解]哈希表、哈希表開(kāi)放尋址法、二次探測(cè)法鏈接的題目就是讓建立hash表,沒(méi)有輸出查詢時(shí)間,所以是這道題的簡(jiǎn)單版。
關(guān)于統(tǒng)計(jì)時(shí)間(即統(tǒng)計(jì)次數(shù)),也是放在了find()函數(shù)中,即插入的時(shí)候的比較次數(shù)就是查詢時(shí)候的次數(shù),所以在find函數(shù)中加了一個(gè)形參cnt用來(lái)統(tǒng)計(jì)次數(shù)。以便后面查詢輸出。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 1e4+10;int s , m , n;int h[N]; bool is_prime(int n){if(n == 1) return false;for(int i =2; i<= n/i ;i++)if( n % i ==0) return false;return true; }//查找x在哈希表中的位置,cnt統(tǒng)計(jì)比較了多少次 int find(int x, int &cnt){//hash值int t = x %s;//統(tǒng)計(jì)插入多少次,即查找多少次cnt =1;//這里cnt包含特例:如果查找了 TSize 次,每次查找的位置上均有數(shù),但都不等于要查找的數(shù),則認(rèn)為查找時(shí)間是 TSize+1。for(int k =0; k<s; k++,cnt++){//尋找二次探測(cè)法的沖突解決位置int i = (t+ k*k) % s;//如果這個(gè)位置是空的 || 查詢到了這個(gè)數(shù),就返回這個(gè)位置iif(!h[i] || h[i] == x ) return i;}// 無(wú)法插入 或者 差不多就返回-1return -1; } int main(){cin >> s >> n >> m;while(!is_prime(s)) s++;//插入數(shù)字,建立hash表for(int i =0; i< n; i++){int x,cnt;cin >> x;int t = find(x, cnt);if(t == -1) printf("%d cannot be inserted.\n", x);else h[t] = x;}//查詢,統(tǒng)計(jì)比較次數(shù)int cnt = 0;for(int i= 0; i< m; i++){int x, count;cin >> x;find(x, count);cnt += count;}printf("%.1lf",(double)cnt/m); }題目鏈接
PAT甲級(jí)1145 Hashing - Average Search Time
https://www.acwing.com/problem/content/1640/
總結(jié)
以上是生活随笔為你收集整理的PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PAT甲级1137 Final Grad
- 下一篇: PAT甲级1013 Battle Ove