哈希表分析

一、哈希表的概念

哈希表是一种新型的数据结构,它有两个重要的特点:

1.关键词查找

2.最优最快的查找算法

下面我用个例子来介绍它的结构和特点:

例如我们用学生的姓名作为关键字,来进行数据的查询

我们就要定义一个Hash函数,将数据用<K,V>这样的形式形成对应

英语字母有26个,我们将这26个字母相应赋予数字,用学生的姓名中的拼音首字母编号值相加求和,得到一个数,可知此值的最小值是3,最大值为78

 

然后,我们就可以建立一个78大小的数组,将编号对应的学生的信息存进去



 
这样比如我们在查找“刘丽”这个学生的信息时,就不用遍历数组了而是将它的编号算出来,取表中的第24条记录就可以了。

当然,肯定会有冲突产生,比如有“刘丽”和“刘乐”,这样的话数据怎样进行存储呢?

下面就介绍两种方法:

1.开放定址法

对于那些发生冲突的记录,用下列方法进行再次确定哈希地址

Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)

其中 H(key)为哈希函数,m为表长,di为增量序列

如果di值可能为1,2,3,...m-1,称线性探测再散列。

如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2),称二次探测再散列。

如果di取值可能为伪随机数列。称伪随机探测再散列。

2.再Hash法

(1)开散列法

 在哈希表中添加一个指针域,有冲突的第一条记录放在表内,其他的记录通过指针把他们连接起来。

例如:

ps:哈希函数不详,结构如此。。。。。



 

 


(2)闭散列方法

将所有的记录直接存入散列表中。每条记录有一个哈希地址,如果要插入一个记录R,而已有记录已经占用了R的基本位置h(key),则把记录R放在表中的其他位置,由冲突解决方案来确定具体放在哪个位置!

3.关于哈希表

对于哈希表而言,冲突是不可避免的,而我们所做的优化就是将冲突尽量减少!

哈希表并不是由数组和链表构成的数据结构,而是我们解决哈希冲突的方法决定了它的结构组成,如果用再hash中的开散列方法我们得到的是数组与链表结合的哈希表,而如果用闭散列方法则得到的是数组结构的哈希表。

最重要的的点是:哈希表是最优最快的查找算法,它的属性是Key与Value的对应。我们做的是如何将Key与Value均匀散列的对应,而不是寻求链表和数组的均衡!

 

总结:这几天一直在纠结负载因子的问题,今天恍然大悟,大师说的对,我们应该首先探索事物的本质。
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值