Hash 查找
来源:互联网 发布:贝尔.格里尔斯 知乎 编辑:程序博客网 时间:2024/06/03 23:50
一、前言
哈希查找的资料就看这里吧 http://blog.csdn.net/xiaoping8411/article/details/7706376 ,哈希查找的本质就是定好表长,创建哈希表,哈希表上的表格就像桶子一样,需要将数据点,先映射为key值(防止奇怪的取值),之后再使用哈希函数映射为哈希地址,各个数据点的地址应该尽可能无规律和尽可能地分散,避免2个以上数据对应对应同个桶。
值得注意,哈希函数为key值对表长取余时,这个表长就是mod值,这个值最好取为远离2的幂次方的质数。
哈希函数设计一般可采用以下方法:
1.直接定址法。
2.除法取余法,这种方法用得多
3.数字分析法
4.平方取中法
5.折叠法
哈希函数解决两个不同数冲突的方法:
1.开放地址法,这种方法用得多,有线性探测法,随机探查法,双散列探查法等等等,本质都一样
2. 链接法(拉链法)。将具有同一散列地址的记录存储在一条线性链表中
二、代码
#include <iostream>#include <stdio.h>#include <vector>using namespace std;class HashFinder{ public: HashFinder(int *arr , int n ){ hashLen =19 ; //表长尽量取远离2的幂次方的质数,表长比数据长些 hashMap = new int [ hashLen ] ; for(int i = 0 ; i < n ; ++i) insertKey( arr[i] ); //插入key值数据到表,这里key实际就是数组元素啦 } ~HashFinder(){ delete [] hashMap; } void insertKey( int e ){ //计算地址 int addr = e %hashLen; while( hashMap[addr] != 0 ){ //如果桶里已经有数则使用线性探测法探测另一地址 addr = ( ++addr ) %hashLen; } hashMap[addr] = e; } void findD( int d ){ int addrD = d %hashLen ; if ( hashMap[ addrD] == 0 ){ cout<<" No found!"; return ; } while( hashMap[ addrD] != 0 ){ if( hashMap[ addrD] == d ){ cout<<" founded!"; return ; }else { addrD = ( ++addrD ) %hashLen; //继续线性探测 } } cout<<" No found!"; } private: int hashLen ; //哈希表长度 int * hashMap ;};int main(){ int arr[] = { 6 , 202 , 88, 102 , 100 , 41, 12 , 23 , 34 , 25 , 50, 41 , 11 }; int n = 13 ; HashFinder hashFinder(arr , n ); hashFinder.findD( 34 );}
阅读全文
0 0
- Hash查找
- hash查找
- hash查找
- Hash 查找
- 查找之hash查找
- 查找之Hash查找
- Hash查找,散列查找
- 转贴:数据结构:Hash查找
- 查找算法----Hash表
- Hash查找算法
- Hash表查找
- poj2503 hash查找
- 查找算法----Hash表
- Hash快速查找
- Hash(哈希)查找
- 数据结构--Hash查找
- 查找练习 hash
- Hash查找算法
- Redis 配置
- MD5Utils
- Java调用Hikvision接口并抓取Jpeg图片到内存
- vue--温故知新
- mac 安装 pip
- Hash 查找
- 【C#】数组合并
- dc_shell教程
- FastJsonUtil
- CryptoJS简单使用
- <9/24>集训周记
- EventBus源码分析
- 不务正业-二分基础
- 《Focusing Attention:Towards Accurate Text Recognition in Natural Images》阅读