比较方法:
一、直接原数据的比较
二、数据通过某种映射后比较
能不能不通过比较,一次就能得到数据的地址?
正如数组,通过下标,一次就能得到数据。
Hash正是将原始数据A,通过某种方法F,产生一个下标i:
i = F(A);
if ( S(i) == A)
------------------------------------
1、直接定址法。
针对某些带有顺序性的数据,如一堆年份。
0 1988
1 1989
2 ……
是不是很像数组呢。但很少数据这么有规律的。
2、数字分析法。
也是针对很有规律的数据。
3、除留余数法。
h(key) = key % p
这里P的取值起着决定因素,一般取等于或小于表长m,m的最大素字。
这样除起来,分布才会均匀,大家都能得到一个“下标”;
4、平方取中法
将数据取平方后,再取特定位数作地址。
原理是放大数据的特征、差别。
5、折叠法
将数据分块分段,相加起来,使它“缩小”成一个key。
这里分块或分段的大小也很重要,决定了冲突的大小。
------------------------------------
上面那些方法,总体来说,都是想将数据通过某种方法,抽象为一个下标。
而不同的方法,识别能力不同,那么将会造成冲突。
解决数据冲突,有所谓的开发地址法,和链地址法。
我觉得开放地址法,很不好,很自私。
可能将属于别人的位子给占了,别人又去抢占别人的位子。
而链地址法,相当于一种分享、共享地址key。
分享到:
相关推荐
根据算法导论上的HashTable, C语言实现
哈希表应用C++_STL_hash 哈希表应用C++_STL_hash 哈希表应用C++_STL_hash
////采用除留余数法定义哈希表,哈希表长度为10,哈希函数为H(key)=key%13。产生冲突时采用线性探测法实现下面要求的功能。 ////(1)初始化哈希表,置空哈希表 ////(2)在哈希表中查找元素 ////(3)在哈希表中...
哈希表的建立与运用C语言实现哈希表的建立与运用C语言实现哈希表的建立与运用C语言实现哈希表的建立与运用C语言实现哈希表的建立与运用C语言实现
哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表
哈希表 hash
网上下载的一个哈希表.再次分享一下
哈希表 用于哈希表等的 C 宏
哈希算法的高速FPGA实现,本文hi介绍,有少量算法介绍,共16页
哈希表的方法总结,内有如何使用哈希表的各种方法
【问题描述】 利用哈希表进行存储。...哈希表(Hash table)是一种基于哈希函数(Hash function)实现的数据结构,用于实现关联数组或者映射等抽象数据类型。哈希表将元素的键(key)通过哈希函数转换为哈希值
哈希表的实现(注:计算对应变量的哈希值需要重载hashTable::hash_val函数),参考实现如下 #include #include using namespace std; /*注:functional里面定义了求哈希值的函数,这里的函数可以不用了*/ namespace ...
哈希表设计源码HashList
哈希表的实现说明,附hash函数实现的部分代码
hash_map基于hash table(哈希表)。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间...
从键盘输入各记录,以用户名为关键字建立哈希表, 哈希函数用除留取余数法构造, 采用线性探测法解决冲突。可以插入、查找、删除并显示给定用户名的记录, 并计算查找长度, 哈希表保存到文件中。 测试数据: 取自己...
链式哈希表,博文讲解地址:http://blog.csdn.net/u012819339/article/details/49871469
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。 基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除...
用C实现的哈希表 int hash_insert(Hash* * hp,int data)//返回0表示成功 { if((*hp) == NULL)return 1; if(((*hp)->num)==14) { printf("hash full\n"); return 1;//哈希表满了 } if((*hp)->pNode[KEY(data...
自己整理的数据结构哈希表详解,参考其他博客、算法导论。包括哈希表构造方法、解决冲突的方法、包含牛客上的练习题。