刚刚开始研究数据结构,看的头大,这里简单总结下这两天学习Hash表的结果!各位看官请轻拍!
对于查找来说,一般来说使用的是关键字查找,关键字越特别,查找的结果越准确。那么我们在设计一个查找表时,关键字和查找方式就是最重要的两个部分。
哈希表,又称为散列表,按照数据表中每一个记录的关键字k对其进行存储,在理想情况下,通过哈希函数H在关键字与地址之间建立起一一对应的关系,那么查找时只需要进行一次计算即可。但是当出现不同的关键字对应同一个存储地址,即k1≠k2,但是H(k1)=H(k2),那么这种情况就称为冲突。把这种具有不同关键字值而具有相同哈希地址的对象称为“同义词”。
在构造哈希表时,需要解决的两个问题就是:
1.如何设计哈希函数,使得冲突尽可能少
2.发生冲突后如何解决
Hash函数的构造方法:
1.直接定址法
是以关键字本身k或者是关键字加上某一个数值常量c作为哈希地址。
H(k)=k+c
这种哈希函数计算简单,并且不可能有冲突发生,当关键字的分布基本连续时,可以用直接定址法。若关键字的分布不连续,直接定址法将造成内存单元的大量浪费。
2.除留余数法
取关键字k除以哈希表长度m,所得余数作为哈希地址。
H(k)=k%m
这是一种比较简单,也比较常见的构造方法。这种方法的关键是选好哈希表的长度m,使得数据集合中的每一个关键字通过函数转化后映射到哈希表上的任意地址的概率相等。在m取素数时,发生冲突的可能性小。
3.平方取中法
取关键字的平方后的中间几位作为哈希地址。
4.折叠法
这种方法适合在关键字位数较多,且地址区间较小的情况下。将关键字分隔成数位相同的几部分,然后将这几部分的叠加和作为哈希地址,若超出范围可再取模。
5.数值分析法
如果事先知道所有可能的关键字的取值,那么就可以对通过对关键字的分析,发现其变化规律,从而构造出相应的哈希函数,得到哈希地址。
6.随机数法:
对长度不等的关键字构造哈希函数。
设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数。
Hash表处理冲突的方法:
处理冲突就是为该关键字找到一个另一个“空”的哈希地址。
1.开放定址法当发生冲突时,形成一个地址序列,沿着这个序列逐个探测,直到找到一个“空”的开放地址,将发生冲突的关键字值存放到该地址中去。
如 Hi=(H(k)+d(i))%m i=1,2,...,k (k<m-1)
其中H(k)为哈希函数,m为哈希表的长度,d(i)为增量函数,d(i)=d1,d2,...,dn-1。
根据增量函数的取法不同,可以得到不同的开放定址处理冲突探测方法。
(1)线性探查法
从发生冲突的地址(设为d)开始,依次探查:d+1,d+2,...d+m-1,当探查到表位m-1时,又从0开始探查,直到找到一个空闲的位置来存放发生冲突的关键字。
若整个地址都找遍,仍没有空地址,则产生溢出。
线性探测法的数序递推公式为:
d0=H(k)
...
d(i)=(d(i-1)+1)%m,直到找到一个空地址。
利用线性探查法处理冲突容易造成关键字的“堆积”问题。这是因为当连续n个单元被占用后,再散列到这些单元上的关键字和直接散列到后面一个空闲单元上的关键字都要占用这个空闲单元,致使该空闲单元很容易被占用,从而发生非同义冲突,造成平均查找长度的增加。
为了克服堆积问题,则可用下面这个方法
(2)平方探查法
假设发生冲突的地址为d,则平方探查法的探查序列为:d+1^2,d+2^2,...,直到找到空闲地址为止。
其数学公式为:
d0=H(k)
...
d(i)=(d0+i^2)%m
平方探查法可以避免出现堆积问题,但缺点是无法探查到哈希表上的所有单元,但至少能探查到一半单元。
若解决冲突时,探查到一半单元仍然找不到一个空闲单元,则表明此哈希表太满,需要重现建立哈希表。
2.链地址法
把所有关键字为同义词的记录存储在一个线性链表中,这个链表称为同义词链表,并将这些链表的表头放在数组中(下标从0到m-1)。
链地址法虽然要多费一些存储空间,但可以彻底解决堆积问题,大大提高查找效率。
相关推荐
哈希表的基础原理是利用哈希函数将键转化为数组索引,从而使得查找、插入和删除操作的时间复杂度可以达到接近常数级别的O(1)。 哈希函数是哈希表的核心,它的主要任务是将任意大小的键转化为固定大小的哈希码,这个...
#### Hash表基础知识与应用场景 本文将深入探讨如何构建高效的Hash表,并特别关注Blizzard在游戏开发过程中所采用的技术。Hash表是一种利用散列函数来实现快速查找的数据结构。其核心优势在于能够提供常数级别的...
首先,理解Hashin失效准则的基础。该准则考虑了复合材料内部的不同失效模式,包括基体开裂、纤维断裂以及界面脱粘等。在三维情况下,这意味着要考虑三个主应力分量和三个剪切应力分量,一共六个独立的应力状态。Hash...
在本主题“哈希表设计源码HashList”中,我们将深入探讨哈希表的基础原理,以及如何通过源码实现一个基于列表的哈希表结构。 哈希表的核心概念在于其哈希函数,这个函数能够将任意大小的键(key)转化为数组索引,...
3. **Fortran**:FORmula TRANslation,是一种高级编程语言,尤其适用于科学计算和数值分析。ABAQUS的用户子程序大多采用Fortran编写,因为它提供了高效的数学运算和内存管理,适合处理复杂的物理问题。 4. **...
基于Hashin准则的单层板渐进失效分析是复合材料单层板的损伤失效分析方法之一,该方法将Hashin准则作为复合材料单层板的失效判据,并考虑单层板的累计损伤,利用渐进失效分析方法对单层板进行损伤数值分析。...
#### 二、hash关键字的基础概念 **hash**是一种将输入数据映射到固定大小输出的过程,通常用于快速查找或验证数据。在SQL Server中,常用的hash算法之一是`Checksum()`函数,它可以接受一个字符串作为输入,并返回一...
### 从头到尾彻底解析Hash表算法 #### 第一部分:Top K算法详解 ##### 问题背景与描述 本部分探讨了一道典型的百度面试题,旨在寻找最热门的10个查询串。这个问题设定在一个拥有1千万条记录的日志文件环境中,...
这个平均值将成为比较像素的基础。 3. **二值化**:对每个像素进行比较,如果像素值大于平均值,则设为1,否则设为0。这样就形成了一个8x8的二进制矩阵。 4. **哈希值生成**:将二值矩阵转换为一个64位的整数,这...
通过提供类似哈希表的数据结构,用户能够利用R语言的特性,如更优的对象访问性能,进行更高级的数据操作和分析。在R社区中,这表明了对数据结构多样性的需求和R语言对此类需求的响应。随着R语言对哈希实现的原生支持...
在编译MySQL时,这个词法分析器用于处理SQL语句,识别关键字和标识符,是解析和执行SQL命令的基础。`gen_lex_hash`的运行结果会生成`lex_hash.h`头文件,这个文件包含了所有可能的SQL关键字和标识符的哈希值,确保...
在解析算法和实现技术之外,本文还提到了对于Hash函数和Hash表算法的实际测试,分析了不同的Hash函数算法的表现及其优劣,这将有助于我们选择最适合特定应用场景的Hash函数。而这些知识点的讲解和测试结果,对于希望...
通过对认证成本的分析,改进了基础的分层Hash链表结构,使之在成本效益上更为高效。在设计新数据结构时,考虑了完备性和边界隐私保护的平衡。 认证跳表和签名链作为参考,是目前分布式系统中用于数据认证的常用方案...
综上所述,HASH函数作为信息安全领域的基础工具之一,其安全性至关重要。通过对HASH函数的安全性需求进行深入探讨,并分析生日攻击等常见攻击手段,可以帮助我们更好地理解和应对网络安全挑战。
用户需要具备一定的编程基础,理解Fortran语法,以及Abaqus的Vumat接口,才能有效地使用和修改这些子程序。 总的来说,这个压缩包提供了用于分析复合材料在动态应变下失效行为的工具。通过Hashin失效准则和Vumat子...
在IT领域,数据结构是构建高效程序的基础,而链表和哈希表是其中非常重要的两种数据结构。这里我们关注的是"单向链表"和"哈希表"的实现,以及它们在Unix系统中的应用。`list_code.rar_hash unix_单向链表`这个标题...
在“据三维Hashin失效准则和Chang-Chang退化准则.doc”这个文档中,可能详细阐述了这两个准则的理论基础、数学表达式、计算方法以及具体应用案例。文件名“1”可能是文档的补充部分,例如包含计算实例、图表或者参考...
为了正确理解和应用这些源代码,用户需要具备一定的Fortran编程基础,了解ABAQUS的VUMAT接口,以及对Hashin失效准则的理论理解。源码可能会包含计算单元应变、应力、模量和失效判据的函数,以及如何将这些结果反馈到...