线性探测法和平方探测法 - 哈希表 - 完整代码
直接上代码
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 100000 //允许开辟的最大散列表长度
typedef int ElementType;
typedef int Index; // 散列地址类型
typedef Index Position; // 数据所在的位置
typedef enum
{Legitimate, // 合法Empty, // 空Deleted // 已经删除
} EntryType;
typedef struct HashEntry Cell; // 散列单元类型
struct HashEntry
{ElementType Data;ElementType Info; //单元状态
};
typedef struct TblNode *HashTable; // 散列表类型
struct TblNode
{int TableSize; // 表的最大长度Cell *Cells; // 存放数据的数组
};
// 返回一个大于N且不超过MAX的最小素数
int NextPrime(int N)
{// 从大于N的第一个奇数开始int p = (N % 2) ? N + 2 : N + 1;while (p <= MAX){int i;for (i = (int)sqrt(p); i > 2; i--){if (!(p % i))break; // 不是素数}if (i == 2)break;elsep += 2;}return p;
}
HashTable CreateTable(int TableSize)
{HashTable H;H = (HashTable)malloc(sizeof(struct TblNode));// 保证散列表的最大长度是素数H->TableSize = NextPrime(TableSize);// 数组H->Cells = (Cell *)malloc(H->TableSize * sizeof(Cell));// 初始化数组为空单元for (int i = 0; i < H->TableSize; i++)H->Cells[i].Info = Empty;return H;
}
// 平方探测
Position Find(HashTable H, ElementType Key)
{Position Currentpos, NewPos;int CNum = 0; // 记录冲突次数// NewPos = Currentpos = Hash(Key, H->TableSize); // 初始散列的位置int p = H->TableSize; // 应该是吧NewPos = Currentpos = Key % p; // 除留余数法// 为空的话就是找不到while (H->Cells[NewPos].Info != Empty && H->Cells[NewPos].Data != Key){// 奇数次冲突 加i的平方if (++CNum % 2){// CNum相当于i的映射// NewPos是增加后的位置NewPos = Currentpos + ((CNum + 1) / 2) * ((CNum + 1) / 2);// 如果加超了// 调增成合法的地址if (NewPos >= H->TableSize)NewPos = NewPos % H->TableSize;}else{NewPos = Currentpos - (CNum / 2) * (CNum / 2);while (NewPos < 0)NewPos += H->TableSize;}}/*// 开放地址法while (H->Cells[NewPos].Info != Empty && H->Cells[NewPos].Data != Key){NewPos = (Currentpos + (++CNum)) % H->TableSize;}*/// 此时NewPos 或者是Key的地址 或者是空单元地址return NewPos;
}
bool Insert(HashTable H, ElementType Key)
{Position Pos = Find(H, Key);if (H->Cells[Pos].Info != Legitimate){H->Cells[Pos].Info = Legitimate;H->Cells[Pos].Data = Key;return true;}else{cout << "键值已存在\n";return false;}
}
bool Delete(HashTable H, ElementType Key)
{Position pos = Find(H, Key);if (H->Cells[pos].Info == Empty || H->Cells[pos].Info == Deleted)return false;else if (H->Cells[pos].Info == Legitimate){H->Cells[pos].Info = Deleted;return true;}return true;
}void PrintHashTable(HashTable H)
{for (int i = 0; i < H->TableSize; i++){if (H->Cells[i].Info == Legitimate)cout << H->Cells[i].Data << ' ';}cout << "\n";
}
int main()
{HashTable htb;int N;cin >> N;htb = CreateTable(N);ElementType x;for (int i = 0; i < 5; i++){cin >> x;Insert(htb, x);}PrintHashTable(htb);cin >> x;cout << Delete(htb, x) << endl;PrintHashTable(htb);return 0;
}
线性探测法和平方探测法 - 哈希表 - 完整代码相关推荐
- 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度
哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时:ASL =1n\frac{1}{n}n1 ∑i=1 ...
- SDUT 3377 数据结构实验之查找五:平方之哈希表
数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 给定的一组 ...
- 散列(2)线性探测法和双重散列法
接上篇 散列的简要描述和链地址法 解决散列冲突的方法: 1. 线性探测法 如果我们能够预测将要存入表中元素的数目,而且我们有足够的内存空间可以容纳带有空闲空间的所有关键字,那么使用链地址法是不值得的. ...
- 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法
本次笔记内容: 11.3.1 开放定址法 11.3.2 线性探测 11.3.3 线性探测-字符串的例子 11.3.4 平方探测法 11.3.5 平方探测的实现 11.3.6 分离链接法 文章目录 冲突 ...
- e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗
#新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...
- E数据结构实验之查找五:平方之哈希表
Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=± ...
- 数据结构实验之查找五:平方之哈希表
题目描述 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1 ...
- e - 数据结构实验之查找五:平方之哈希表_leetcode算法之哈希表
今天该来盘一盘 哈希表 这类题目 分类别解析leetcode上的一些相关的例题路,代码采用C++与python实现. 哈希表 哈希表是一种很有用的数据结构, 其作用主要是以空间换时间, 在c++中主要 ...
- 哈希表 - (代码、分析 )
目录: 代码: 分析: 代码: BSTree.h BSTree.c 二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree) Hash.h #ifnde ...
最新文章
- 这可能是最好的RxJava 2.x 入门教程(二)
- WebStorm调试Electron
- oracle用EXPLAIN PLAN 分析SQL语句
- sourcemap总结
- orcale中case when和group by同时使用会报无效标识符
- 神经网络不应视为模型,推理过程当为机器学习问题一等公民
- 编译 linux 3,linux内核的编译(3)
- 实验4-1-4 求整数的位数及各位数字之和 (15 分)
- Android 图片展示器
- 【MySQL】与【Oracle】
- 小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍
- Redis相关面试题
- Failing OffsetCommit request since the consumer is not part of an active group
- 力扣LeetBook<链表>学习笔记
- 紫薇星上的数据结构(7)
- 中山大学曾兆阳_官居几品怎么打压势力
- win7系统备份还原软件_非常好用的系统备份和还原的软件,OneKey一键还原工具
- 【洛谷 P4408】逃学的小孩【树的直径】
- Geogebra的使用
- Android 找不到资源异常,Android 问题之找不到资源解决办法
热门文章
- 大整数加法基本思路和代码(C++实现)
- 音频文件的结构与规范——RIFF和WAVE音频文件格式
- 自动阅读项目到底能不能做?看成本分析再决定
- 西电计组实验一 存储器实验
- android分辨率 尺寸 dpi换算
- 前人铺路系列组件hevue-img-preview 2.5更新,增加键盘控制,节流,图片加载等待等,来看看有没有你可以借鉴的思路或功能
- 小米路由器的服务器无响应怎么回事,小米路由器常见问题与解决方法(高级功能) | 192路由网...
- robocup2D教程
- 达达,不能只做京东的达达
- 局域网有几台电脑频繁断网_电脑经常自动断网掉线分析