1078. Hashing (25)
2015-11-24 18:07
417 查看
1.题目中提到MSize的最大值为10000,而比10000大的最小的一个质数为10007,刚开始误以为是10001,卡了一下
2.Quadratic probing即平方探测,公式为h(x)=(Hash(x)+j*j)% MSize,Hash(x)=x%MSize
2.Quadratic probing即平方探测,公式为h(x)=(Hash(x)+j*j)% MSize,Hash(x)=x%MSize
//#include<string> //#include <iomanip> //#include<stack> //#include<unordered_set> //#include <sstream> //#include "func.h" //#include <list> #include<unordered_map> #include<set> #include<queue> #include<map> #include<vector> #include <algorithm> #include<stdio.h> #include<iostream> #include<string> #include<memory.h> #include<limits.h> #include<stack> using namespace std; /* 4 4 10 6 4 15 5 4 10 6 4 15 6 4 10 6 4 15 */ int main(void) { int mSize, n; cin >> mSize >> n; vector<bool> prime(10008, true); prime[0] = false; prime[1] = false; for (int i = 2; i < prime.size(); i++) {//处理质数 if (prime[i]) { for (int j = 2; j*i < prime.size(); j++) prime[j*i] = false; } } if (!prime[mSize]) {//如果mSize不为质数,则把mSize改为比mSize大的最小质数 for (int i = mSize + 1; i < prime.size(); i++) { if (prime[i]) { mSize = i; break; } } } vector<int> num(n); for (int i = 0; i < n; i++) { scanf("%d", &num[i]); } vector<bool> exist(mSize, false); vector<int> position(n, -1); for (int i = 0; i < n; i++) { int pos = num[i] % mSize;//直接哈希地址 for (int j = 0; j < mSize; j++) {//二次探测 int tmpPos = (pos + j*j) % mSize; if (!exist[tmpPos]) {//如果有空位 exist[tmpPos] = true; position[i] = tmpPos; break; } } } for (int i = 0; i < n; i++) { if (position[i] != -1) printf("%d", position[i]); else printf("-"); if (i != n - 1) printf(" "); } cout << endl; return 0; }
相关文章推荐
- 编程NO.1(C)
- Oracle存储过程简单实例
- 在uboot中添加解析ini配置文件的命令
- 1-1 10:超级玛丽游戏
- 定制自己的Unity脚本模板
- 磁盘空间耗尽(deleted)
- 一路艰辛的pcapy模块安装--64位-win10
- Applet、Scriptlet与Servlet
- freeswitch安装过程总结记录
- Android ActionBar的基本用法
- ELF Format 笔记(十四)—— 段内容
- android使用vitamio
- Java进阶03 IO基础
- 使用Java发送带附件的附件的示例
- 构建java的webSocket应用
- Mac上将mp4视频做成屏保
- 1014. 福尔摩斯的约会 (20)
- hdu 3018 Ant Trip
- crawler: 常用的一些工具
- 1-1-06:空格分隔输出