数据结构之 哈希表
2015-12-02 15:10
501 查看
头文件:HashTable.h
#define _INT_MIN (0x80000000) class HashTable { public: HashTable(int hashLen); HashTable(int ary[], int n, int hashLen); HashTable(int *start,int *end,int hashLen); //获取哈希码 int HashCode(int key, int *cPtr ); //冲突处理 int Collision(int H, int key, int *cPtr ); //初始化哈希表 void Initial(int hashLen); int ToArray(int ary[]); int AddRange(int ary[], int n); int Add(int key); private: CirSeqList csl; int len; int SqrtSearchHashes(int H, int key, int *cPtr ); }; void HashTable::Initial(int hashLen) { len = hashLen; //初始化 循环表 int *a = new int[hashLen]; for (int i = 0; i < hashLen; i++) { //int的最小值 a[i] = _INT_MIN; } csl.Initial(a, hashLen); delete[] a; } HashTable::HashTable(int hashLen) { Initial(hashLen); } HashTable::HashTable(int ary[], int n, int hashLen) { Initial(hashLen); AddRange(ary, n); } HashTable::HashTable(int *start, int *end, int hashLen) { Initial(hashLen); AddRange(start, end - start + 1); } int HashTable::Add(int key) { int count = 0, H = HashCode(key, &count); if (H != -1) { csl.Set(H, key); } else { //printf("\n*****哈希表溢出!*****\n"); } return count; } int HashTable::AddRange(int ary[], int n) { int count = 0; for (int i = 0; i < n; i++) { count+=Add(ary[i]); } return count; } //获取哈希码 int HashTable::HashCode(int key, int *cPtr = NULL) { int H = key%7, count = 1; //如果是的,就直接返回。防止重复元素出现。 if (csl.Get(H) == key) { return H; } else if (csl.Get(H) != _INT_MIN) { //寻找空位 H = Collision(H, _INT_MIN, &count); if (H == -1) { //printf("\n*****哈希表溢出!*****\n"); return -1; } } (*cPtr) = count; return H; } //冲突处理 int HashTable::Collision(int H, int key, int *cPtr = NULL) { bool noway=false; int method = 0, tar = -1; //遍历处理冲突的方法表 while (noway == false && method++, tar == -1) { switch (method) { case 1: //方法一:二次探测再散列 tar = SqrtSearchHashes(H, key, cPtr); break; case 2: //方法二:。。。。。。 tar = -1; break; default: //方法表已穷尽 noway = true; break; } } return tar; } //1^2 2^2 3^3 int HashTable::SqrtSearchHashes(int H, int key = _INT_MIN, int *cPtr = NULL) { int i = 1, tar = H, d; while (csl.IsLegal(tar) && csl.Get(tar) != key) { if (i > len / 2) { return -1; } d = i * i; tar = (H + d) % len; if (cPtr != NULL) { (*cPtr)++; } i++; } return tar; } int HashTable::ToArray(int ary[]) { csl.SetCurNum(len-1); for (int i = 0; i < len; i++) { ary[i] = csl.Next(); } return len; }
相关文章推荐
- 数据结构之 循环表线性表
- 数据结构之 循环表线性表
- 数据结构(Java)——图的基础算法
- 数据结构(Java)——Set和Map的应用
- 【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器
- 文章标题
- Linux c 算法与数据结构--双向链表
- “数据结构与算法”有点难
- 数据结构之创建二叉树
- 数据结构之创建二叉树
- Trie树------一种NB的数据结构
- [数据结构]二分插入排序
- 数据结构中内部排序总结
- 数据结构(Java)——堆的应用
- 数据结构-- 向量--插值查找
- 冒泡排序
- 数据结构。顺序表
- 数据结构中的排序
- bzoj 2120 数颜色 树状数组套平衡树
- 最近邻算法和向量模型——第二部分——算法和数据结构