数据结构-散列表

来源:互联网 发布:seo和sem的区别与联系 编辑:程序博客网 时间:2024/05/21 22:56

先简单的引入下概念:在日常生活中我们去查找数据肯定会去查找数据,在查找的过程中,如果我们只去考虑各个元素的关键字之间的相对的大小,记录在存储结构中的位置和其关键字没有直接的关系,查找的实际就和表的长度有关,这样的话在结点的个数有很多的话,我们查找的过程就要去和很多其实无效的结点的关键字进行比较,这样的话查找的速度肯定会变慢。所以我们可以考虑在元素的存储位置和关键字之间去建立某种直接的关系,那么在进行查找的时候,就不需要再去做很多无效的比较了,如果我们能根据关键字去找到相应的记录,这个就是散列查找法,它就是通过对元素的关键字进行某种运算,然后求出元素的地址。也就是说是利用关键字到地址的直接转换的方法,不需要再去重复的比较。

散列函数:其实就是在记录存储位置p和其关键字key之间建立的一个确定的关系H,让p=H(key),就称这个对应的关系H是散列函数,p为散列地址。

还有一个需要注意的概念就是装填因子的概念,装填因子就是  表中填入的记录/散列表的长度,因为通常散列表中关键字的取值集合是远远大于表的空间的地址集 的。所以就有可能会存在不同的关键字对应的是同一个散列地址。也就是说是可能会发生冲突的,一旦发生了冲突我们就要去做相应的处理。

就比如说我们有一个散列函数可能就是key-'f',这样的话如果说我们的关键字有for和float,这样的话就发生了冲突,我们称for和float是同义词。

散列表通常是一个数组,散列地址就是数组的下标,它的存储空间是有限的。

为了减少冲突,其实我们可以从构造散列函数着手,常见的有数字分析法,平方取中发,折叠法,除留余数法。

处理冲突的方法一般有开放地址法,链地址法。



原创粉丝点击