散列表
bbzz2
这个作者很懒,什么都没留下…
展开
-
(1)散列表(哈希表)的定义
一般的查找给你一个顺序表,你会如何查找某个给定的元素?一般思路就是从表头开始,一个挨一个的比较记录a[i]与key的值是“=”还是“≠”,直到有相等才算是査找成功,返回i的值。到了有序表(已排序的表)査找时,我们可以利用a[i]与key的“”,来折半査找,直到相等时査找成功返回i。反正我们的目标就是要找到那个 i 值,是不是还有其它好点的转载 2016-02-01 17:47:32 · 600 阅读 · 0 评论 -
(9)引入哈希桶的概念来实现一个哈希表
前面的讲述了如何用链地址法实现一个哈希表,那么今天来分析一下另一种解决哈希冲突的做法,即为每个Hash值,建立一个Hash桶(Bucket),桶的容量是固定的,也就是只能处理固定次数的冲突,如1048576个Hash桶,每个桶中有4个表项(Entry),总计4M个表项。其实这两种的实现思路雷同,就是对Hash表中每个Hash值建立一个冲突表,即将冲突的几个记录以表的形式存储在其中。转载 2016-02-01 17:57:48 · 641 阅读 · 0 评论 -
(8)Linux内核中的hash与bucket
哈希表哈希表(Hashtable)又称为“散列”,Hashtable是会根据索引键的哈希程序代码组织成的索引键(Key)和值(Value)配对的集合。Hashtable 对象是由包含集合中元素的哈希桶(Bucket)所组成的。而Bucket是Hashtable内元素的虚拟子群组,可以让大部分集合中的搜寻和获取工作更容易、更快速。 哈希函数(Hash Function)为根转载 2016-02-01 17:56:12 · 744 阅读 · 0 评论 -
(7)哈希表的链地址法实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表在像Java、C#等语言中是与生俱来的。可是在C的世界中,似乎只有自己动手,丰衣足食了。哈希表实现中需要注意的问题。1. 哈希函数也叫散列函数,即:根据key,计算出key对应记录的转载 2016-02-01 17:52:53 · 663 阅读 · 0 评论 -
(6)散列冲突处理:链地址法
链地址法(拉链法)前面我们谈到了散列冲突处理的开放定址法,它的思路就是一旦发生了冲突,就去寻找下一个空的散列地址。那么,有冲突就非要换地方呢,我们直接就在原地处理行不行呢?可以的,于是我们就有了链地址法。将所有关键字为同义词的记录存储在一个单链表中,我们称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针。对于关键字集合{12,67,56,16,25转载 2016-02-01 17:52:08 · 3347 阅读 · 0 评论 -
(5)散列冲突处理:开放定址法
前面我们讲了一些设计散列函数的方法,从前面的除留余数法的例子也可以看出,我们设计得再好的散列函数也不可能完全避免冲突,这就像我们再健康也只能尽量预防疾病,但却无法保证永远不得病一样,既然冲突不能避免,就要考虑如何处理它。那么当我们在使用散列函数后发现两个关键字key1≠key2,但是却有f(key1) = f(key2),即有冲突时,怎么办呢?我们可以从生活中找寻思路。转载 2016-02-01 17:50:47 · 575 阅读 · 0 评论 -
(4)散列函数设计:除留余数法
除留余数法介绍除留余数法此方法为最常用的构造散列函数方法。对于散列表长为m的散列函数公式为:f( key ) = key mod p ( p ≤ m )mod是取模(求余数)的意思。事实上,这方法不仅可以对关键字直接取模,也可在折叠、平方取中后再取模。一个例子很显然,本方法的关键就在于选择合适的p, p如果选得不好,就可能会容转载 2016-02-01 17:50:02 · 1833 阅读 · 0 评论 -
(3)散列函数设计:直接定址法
上一篇说到了,设计一个简单、均匀、存储利用率高的散列函数是散列技术中最关键的问题。那么我们今天开始就看看,如何去设计散列函数。散列函数的设计原则不管做什么事情,要做到最优都不容易,既要付出尽可能的少,又要得到最大化的多。那么什么才算是好的散列函数呢?这里我们有两个原则可以参考。1. 计算简单你说设计一个算法可以保证所有的关键字都不会产生冲转载 2016-02-01 17:49:14 · 1027 阅读 · 0 评论 -
(2)散列表是怎么进行查找的
散列过程整个散列过程其实就是两步。1. 在存储的时候,通过散列函数计算记录的散列地址,并按此散列地址存储该记录。就像张三丰我们就让他在体育馆,那如果是“爱因斯坦”我们让他在图书馆,如果是“居里夫人”,那就让她在化学实验室。如果是“巴顿将军”,这个打即时战略游戏的高手,我们可以让他到网吧。总之,不管什么记录,我们都需要用同一个散列函数计算出地址再存储。转载 2016-02-01 17:48:23 · 512 阅读 · 0 评论 -
(10)魔兽文件打包器里的传奇哈希表
关于哈希表C实现,前面两个小节已分别介绍了不同的方法,不过似乎网上流传最具传奇色彩的莫过于暴雪公司的魔兽文件打包管理器里的hashTable的实现了;在冲突方面的处理方面,采用线性探测再散列。在添加和查找过程中进行了三次哈希,第一个哈希值用来查找,后两个哈希值用来校验,这样可以大大减少冲突的几率。在网上找了相关代码,但不知道其来源是否地道:StringHash.h转载 2016-02-01 17:59:50 · 887 阅读 · 0 评论