算法导论 完全散列
2017-03-23 00:42
281 查看
#include<iostream> #include<ctime> #include<stdlib.h> #include<vector> using namespace std; //二次散列表 struct Node {//位置信息 int m, n; Node(int m, int n) { this->m = m; this->n = n; } }; class HashTable { public: int *S; int m; void HashTable_Create(int num,int p);//构造函数 ~HashTable();//析构函数 int h(int k,int p); private: int a, b; }; void HashTable::HashTable_Create(int num,int p) { m = num; S = new int[m]; if (m != 1) { a = (rand() % (p - 1)) + 1; b = rand() % p; } else { a = 0; b = 0; } } HashTable::~HashTable() { delete[]S; } int HashTable::h(int k,int p) { if (m != 1) { int locate = ((a*k + b) % p) % m; return locate; } else{ return 0; } } bool Prime(int x) { int y; for (y = 2; y <= sqrt(x); y++) if (x%y == 0) return false; return true; } //寻找最大素数 int MaxPrime(vector<int> &G) { int length = G.size(); int Max = G[0];//求G中的最大数 for (int i = 1; i < length; i++) { if (Max < G[i]) { Max = G[i]; } } //求最小素数 if (Prime(Max)) { return Max; } else { do { Max++; } while (Prime(Max)==false); } return Max; } //输入数据 void Init(vector<int> &G,int n) { int a; for (int i = 0; i < n; i++) { cin >> a; G.push_back(a); } } //初始化 void InitA(int *A) { for (int i = 0; i < 100; i++) { A[i] = 0; } } //插入数据 HashTable *Hash_Insert(vector<int> &G) { int m = G.size(); int p = MaxPrime(G); int A[100];//存放每个槽中的数据个数 InitA(A); int a = (rand() % (p - 1)) + 1; int b = rand() % p; int B[100]; //int locate = ((a*k + b) % p) % m; for (int i = 0; i < m; i++) { B[i] = ((a*G[i] + b) % p) % m; A[B[i]]++; } HashTable *head = new HashTable[m]; for (int j = 0; j < m; j++) { if (A[j] != 0) { head[j].HashTable_Create(A[j],p); } } for (int k = 0; k < m; k++) { int count=head[B[k]].h(G[k], p); head[B[k]].S[count] = G[k]; } return head; } Node *Hash_Search(HashTable *head,int k,vector<int> &G) { int size = G.size(); for (int i = 0; i < size; i++) { for (int j = 0;j<head[i].m; j++) { if (head[i].S[j] == k) { return new Node(i, j); } } } } int main() { srand((unsigned)time(NULL)); Node *node; int k, n; vector<int> G; cin >> n; Init(G,n); HashTable *head = Hash_Insert(G); cin >> k; node=Hash_Search(head, k, G); cout << node->m << " "<<node->n<<endl; system("pause"); return 0; }
相关文章推荐
- 《算法导论》笔记 第11章 11.5 完全散列
- 《算法导论》笔记 第11章 11.5 完全散列
- 对《算法导论》完全散列(perfect hashing)的分析
- 算法导论-----散列表
- 《算法导论》第11章 散列表 (2)散列表
- 《算法导论》第11章 散列表 (2)散列表
- 算法导论 11.2-4 散列表内未占用槽链接成自由链表
- 《算法导论》第11章 散列表 (2)散列表
- 算法导论11章散列表 思考题总结
- 算法导论第11章散列表11.1直接寻址表
- 算法导论--散列表的数学分析(精解)链表法
- 算法导论双重散列
- 算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
- 算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
- 《算法导论》11.3-3解答——k为按基数2^p表示的字符串。试证明:如果串x可由串y通过其自身的字符置换排列导出,则x和y具有相同的散列值。
- 算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
- 算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
- 《算法导论》11、散列表相关知识
- 算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
- 算法导论-散列表-MIT6.006 Lecture 8