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)判 ...
随机推荐
- C++ delete 和 delete []
C++ delete 和 delete [] 简单结论: new delete new [] delete [] 文章 : 对 delete [] 的声明 void operator delete ...
- Floodlight 处理交换机增加/移除过程
Floodlight 使用的是Netty架构,在Controller.java 入口函数中显示创建ServerBootstrap,设置套接字选项,ChannelPipeline,此时监听套接 ...
- [Java学习笔记]Java Tips
1.Java没有sizeof关键字 , volatile是java关键字.详情见:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166. ...
- sql plus 抢救数据(測)
有索引 --运行plsql脚本 DECLARE TYPE RowIDTab ISTABLE OF ROWID INDEXBY BINARY_INTEGER; CURSORc1 IS selec ...
- MVC之国际化
MVC之国际化 前言 在项目中遇到国际化语言的问题是常有的事情,之前在做关于MVC国际化语言时,刚开始打算全部利用AngularJS来实现,但是渐渐发现对于页面Title难以去控制其语言转换,于是对于 ...
- java学习笔记05--字符串 .
java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...
- Iconfinder 如何杜绝盗版,哈希算法检测图像重复
原地址:http://blog.jobbole.com/65914/ 本文由 伯乐在线 - 小鱼 翻译自 Silviu Tantos.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读 ...
- 不起眼的 z-index 却能牵扯出这么大的学问(转)
z-index在日常开发中算是一个比较常用的样式,一般理解就是设置标签在z轴先后顺序,z-index值大的显示在最前面,小的则会被遮挡,是的,z-index的实际作用就是这样. 但是你真的了解z-in ...
- 如何高效地向Redis插入大量的数据(转)
最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中. 我刚开始的建议是Shell+redis客户端. 今天,查看Redis官档,发现文档的首页部分( ...
- 【C语言】写一个函数,实现字符串内单词逆序
//写一个函数,实现字符串内单词逆序 //比如student a am i.逆序后i am a student. #include <stdio.h> #include <strin ...