当前位置: 代码迷 >> 综合 >> swust.oj.1013
  详细解决方案

swust.oj.1013

热度:8   发布时间:2023-12-14 20:37:24.0

哈希表(开放定址法处理冲突)(1013)

Time limit(ms): 1000
Memory limit(kb): 10000
Submission: 4051
Accepted: 2177
Accepted
采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用开放定址法的线性探测。
Description
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<iostream>
using namespace std;int main()
{int n;while (cin >> n){int a[100];memset(a, -1, sizeof(a));int m;cin >> m;for (int i = 0; i < m; i++){int b;cin >> b;int t = b%n;if (a[t] == -1){a[t] = b;}else{while (a[t] != -1){t++;if (t == n)t = 0;}a[t] = b;}}//构建哈希表int aim;cin >> aim;int count = 0;int k = 0;//k用于标记是否查找成功int t = aim%n;while (1){count++;if (a[t] == aim){cout << t << "," << count;break;}if (a[t] == -1){k = 1;break;}t++;}//哈希查找if (k == 1)cout << "-1";}return 0;
}
第一行为哈希表的长度n; 第二行为关键字的个数; 第三行为关键字集合; 第三行为要查找的数据。
Input
如果查找成功,输出关键字所哈希表中的地址和比较次数;如果查找不成功,输出-1。
Output

13
11
16 74 60 43 54 90 46 31 29 88 77
16
Sample Input
3,1