hash表、hash算法
即H(key)=key或H(key) = a·key + b,当中a和b为常数(这样的散列函数叫做自身函数)。
若当中H(key)中已经有值了,就往下一个找。直到H(key)中没有值了。就放进去。
线性哈希表(採用了线性试探解决冲突问题)
/******************************
线性hash表
by Rowandjj
2014/7/14
******************************/
#include<iostream>
using namespace std;
#define MAX 20//hash表大小
typedef int DataType;
typedef struct _NODE_
{
DataType data;//方便起见,直接用int型。实际应用时应该是随意类型的
int flag;//1代表已有数据,0代表无数据
}HashNode,*pHashNode;
typedef struct _HASHTABLE_
{
pHashNode pHashNodeTemp;//实际存储数据的hash数组
int n;//hash表大小(总容量)
int cur_elem;//当前容量
}HashTable,*pHashTable;
int hashFunc(DataType key)//hash函数
{
int index = key/3+1;
index = (index < 0) ? -index : index;
return index;
}
bool CreateHashTable(pHashTable pHashTableTemp);
bool DestroyHashTable(pHashTable pHashTableTemp);
void InsertHashTable(pHashTable pHashTableTemp,DataType data,int (*hashFunc)(DataType));
int StatHashTable(HashTable HashTableTemp);//统计空项
void PrintHashTable(HashTable HashTableTemp);//输出hash表中的值
int SearchKey(HashTable HashTableTemp,DataType data,int (*hashFunc)(DataType));//依据数据查找其索引
int main()
{
int i;
int a[] = {9,31,26,1,13,2,11};
cout<<"原始序列:"<<endl;
for(i = 0; i < 7; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
HashTable hashTable;
CreateHashTable(&hashTable);
for(i = 0; i < 7; i++)
{
InsertHashTable(&hashTable,a[i],hashFunc);
}
cout<<"散列后的序列:"<<endl;
PrintHashTable(hashTable);
DataType data;
while(cin>>data)
{
if(data == -1)
{
break;
}
cout<<"index = "<<SearchKey(hashTable,data,hashFunc);
} DestroyHashTable(&hashTable);
return 0;
}
bool CreateHashTable(pHashTable pHashTableTemp)
{
if(!pHashTableTemp)
{
return false;
}
pHashTableTemp->pHashNodeTemp = (pHashNode)malloc(sizeof(HashNode)*MAX);
if(!pHashTableTemp->pHashNodeTemp)
{
return false;
}
else
{
pHashTableTemp->n = MAX;
pHashTableTemp->cur_elem = 0;
for(int i = 0; i < pHashTableTemp->n; i++)
{
pHashTableTemp->pHashNodeTemp[i].flag = 0;
pHashTableTemp->pHashNodeTemp[i].data = -1;
}
}
return true;
}
bool DestroyHashTable(pHashTable pHashTableTemp)
{
if(pHashTableTemp != NULL)
{
free(pHashTableTemp->pHashNodeTemp);
pHashTableTemp->pHashNodeTemp = NULL;
pHashTableTemp->n = 0;
}
return true;
}
void InsertHashTable(pHashTable pHashTableTemp,DataType data,int (*hashFunc)(DataType))
{
if(!pHashTableTemp)
{
return;
}
if(StatHashTable(*pHashTableTemp) == 0)//当hash表满了的时候。能够选择扩容,这里直接返回
{
cout<<"hash表已满..."<<endl;
return;
}
int index = hashFunc(data) - 1;
while(pHashTableTemp->pHashNodeTemp[index].flag)//冲突时採用的是线性试探法
{
index = (index + 1)% pHashTableTemp->n;//防止越界
}
pHashTableTemp->pHashNodeTemp[index].data = data;
pHashTableTemp->pHashNodeTemp[index].flag = 1;
pHashTableTemp->cur_elem++;
}
int StatHashTable(HashTable HashTableTemp)
{
int i,count = 0;
for(i = 0; i < HashTableTemp.n; i++)
{
if(HashTableTemp.pHashNodeTemp[i].flag == 0)
{
count++;
}
}
return count;
}
void PrintHashTable(HashTable HashTableTemp)
{
int i;
for(i = 0; i < HashTableTemp.n; i++)
{
cout<<HashTableTemp.pHashNodeTemp[i].data<<" ";
}
cout<<endl;
}
int SearchKey(HashTable HashTableTemp,DataType data,int (*hashFunc)(DataType))
{
int index = hashFunc(data)-1;
int times = 0;
while(HashTableTemp.pHashNodeTemp[index].flag && HashTableTemp.pHashNodeTemp[index].data != data)
{
index = (index + 1)% HashTableTemp.n;
times ++;
if(times == HashTableTemp.n)
{
return -1;//没找到
}
}
return index;
}
測试:
hash表、hash算法的更多相关文章
- 栈 队列 hash表 堆 算法模板和相关题目
什么是栈(Stack)? 栈(stack)是一种采用后进先出(LIFO,last in first out)策略的抽象数据结构.比如物流装车,后装的货物先卸,先转的货物后卸.栈在数据结构中的地位很重要 ...
- Hash表 hash table 又名散列表
直接进去主题好了. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...
- 十一、从头到尾彻底解析Hash 表算法
在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver ...
- 【数据结构】Hash表
[数据结构]Hash表 Hash表也叫散列表,是一种线性数据结构.在一般情况下,可以用o(1)的时间复杂度进行数据的增删改查.在Java开发语言中,HashMap的底层就是一个散列表. 1. 什么是H ...
- 哈希表(Hash)的应用
$hs=@() #定义数组 $hs=@{} #定义Hash表,使用哈希表的键可以直接访问对应的值,如 $hs["王五"] 或者 $hs.王五 的值为 75 $hs=@''@ #定义 ...
- Hash表算法
出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...
- 从头到尾彻底解析Hash表算法
作者:July.wuliming.pkuoliver 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash ...
- 从头到尾解析Hash表算法
via:点击打开链接 十一.从头到尾解析Hash 表算法 作者:July.wuliming.pkuoliver 出处:http://blog.csdn.net/v_JULY_v. 说明:本文分 ...
- 从头到尾彻底解析Hash 表算法
作者:July.wuliming.pkuoliver 出处:http://blog.csdn.net/v_JULY_v. 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的 ...
- (面试)Hash表算法十道海量数据处理面试题
Hash表算法处理海量数据处理面试题 主要针对遇到的海量数据处理问题进行分析,参考互联网上的面试题及相关处理方法,归纳为三种问题 (1)数据量大,内存小情况处理方式(分而治之+Hash映射) (2)判 ...
随机推荐
- javascript实现的可改变滚动方向的无缝滚动
效果图如下: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- Swift - 炫酷放射弹出按钮菜单(改造自AwesomeMenu)
这个是一个第三方按钮菜单组件,原版是使用Objective-C编写的名为AwesomeMenu的组件,地址是:https://github.com/levey/AwesomeMenu 这里改造成了Sw ...
- Java回调理解 (step by step)
在网上搜索了很多篇关于java回调函数的文章,自己也来试了一下写了这篇博客,可能有些地方理解不到位,烦请各位大大指正. 在计算机程序设计中.回调函数.或简称回调.是指通过函数參数传递到其他代码的,某一 ...
- Codeforces 475D CGCDSSQ 求序列中连续数字的GCD=K的对数
题目链接:点击打开链接 #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- oracle 在操作blob该字段是否会产生很多redo
操作blob该字段是否会产生很多redo,答案是否定的.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob ( id ...
- ThinkPHP多应用/项目配置技巧(使用同一配置文件)--(十六)
原文:ThinkPHP多应用/项目配置技巧(使用同一配置文件)--(十六) ThinkPHP多应用配置技巧(没有使用分组,这是通过入口文件产生的Home.Admin)----很实用! 比如:现在有Ho ...
- Android开发之Sqlite的使用
在Android中存储数据可以用文件.数据库.网络,其中文件和数据库是最常用的,数据库我们常用的就是Sqlite,它是一种经量级的.嵌入式的关系型数据库:在android中当需要操作SQLite数据库 ...
- Android万能适配器base-adapter-helper的源代码分析
项目地址:https://github.com/JoanZapata/base-adapter-helper 1. 功能介绍 1.1. base-adapter-helper base-adapter ...
- ThinkPHP---RBAC
一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...
- 使用注解实现 bean 转 csv
csv 文件是 aaa,bbb,ccc aaa,bbb,ccc 保存 这里的要求是 List<T> 线性表的类型 转换成 类别似 html 中 table的格式,即第一行是 head 后面 ...