查找算法系列(二):哈希查找
来源:互联网 发布:蜘蛛纸牌算法 编辑:程序博客网 时间:2024/05/16 07:01
一. 分析
1. 确定哈希函数-六种方法
- 1. 直接地址法: 取关键字或关键字的某个线性函数值做为哈希地址。
H(key) = key
H(key) = a * key +b
- 2. 数字分析法
- 3. 平方取中法
- 4. 折叠法
- 5. 除留余数法
- 6. 随机数法
2. 解决哈希冲突
1. 开发地址法
- 1. 线性探测(+1,2,3,4,5,6.。。)
- 2. 线性补偿探测,按找一定步长找位置
- 3. 随即探测
- 4. 线性探测再散列(+-1, +-4, +-9,+-16。。。)
2. 拉链法
同一个hash值,在下面加个链表(头添加)
二. 例子: 直接地址法+拉链法
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct hash{ int nValue; //装 原数值 int nIndex; //哈系表中的值(012345)/nValue在原书组中的位置! struct hash* pNext;}Hash;Hash* * CreateHashTable(int* arr, int nLength,int M){ if(arr == NULL || nLength <= 0) return NULL; //哈希表指针 Hash* * pHashTable = (Hash**)malloc( sizeof(Hash*)* M); memset(pHashTable, 0 ,sizeof(Hash*)*M); int nIndex; //遍历数组, 把数据放入表中 for(int i =0 ;i<nLength; i++) { nIndex = arr[i]%M; //得到哈西值; Hash* pTemp = (Hash*)malloc( sizeof(Hash)); pTemp->nValue = arr[i]; pTemp->nIndex = i; //该数字在原数组的位置 //头添加,pHashTable[nIndex] 是Hash× 类型;(×pHead的感觉) pTemp->pNext = pHashTable[nIndex];//头添加 pHashTable[nIndex] = pTemp; } return pHashTable;}//Hash表查找,返回待查数据,在原数组中的位置!int HashSearch(int* arr, int nLength, Hash* *pHashTable, int nFindNumber,int M){ if(!arr||nLength <=0||!pHashTable) //1. 得到哈希值 int nIndex = nFindNumber%M; //2. 根据哈希值找到元素所在链表 Hash* pTemp = pHashTable[nIndex]; //3. 遍历链表 while(pTemp) { if(pTemp->nValue == nFindNumber) { return pTemp->nIndex; } pTemp = pTemp->pNext; } return -1;}int main(){ int arr[] = {20,4,38,105,92,49,7,16,25,32,51,1,116}; Hash* *ph = CreateHashTable(arr, sizeof(arr)/4,13); int n = HashSearch(arr, sizeof(arr)/4,ph, 16,13); printf("%d \n",n); n = HashSearch(arr, sizeof(arr)/4,ph, 16,123); printf("%d \n",n); return 0;}
阅读全文
1 0
- 查找算法系列(二):哈希查找
- 基础算法系列(二)查找算法之二分查找
- 查找算法二之哈希查找
- 算法系列(二)查找算法--基本查找和二分查找
- 查找算法系列之复杂算法:哈希查找
- 查找算法系列(三):字典查找
- 基础算法系列(四)查找算法之哈希查找
- 查找(二):哈希查找和索引查找
- 查找算法总结(二)
- 查找算法总结(二)
- 查找算法总结(二)
- 查找算法总结(二)
- 基础算法系列(一)查找算法之顺序查找
- 基础算法系列(三)查找算法之分块查找
- 算法原理系列:查找
- 查找算法系列(一):二分查找( 描述+代码)
- 哈希查找算法
- 哈希查找算法
- spring+spring mvc + mybatis + maven 项目框架搭建笔记<一>
- [ACM_SMU_1104]最优矩阵连乘积(区间dp)
- UVA
- 二叉树--求二叉树的高度/销毁一颗二叉树
- Java 网络编程之NioSocket
- 查找算法系列(二):哈希查找
- Servlet中的getServletContext()
- Android Fragment真正的完全解析(下)
- Nginx location匹配优先级
- STL常用方法
- python csv模块写文件 出现 iterable expected, not int 错误
- 最近找工作的心路历程
- JavaScript趣题:波浪形排序
- 每日一条Linux命令-df