数据结构与算法(散列表)

1>何为散列表?

    散列表用的是数组支持按照下标随机访问数据的特性,散列表其实就是数组的一种扩展,没有数组就没有散列表.

数据结构与算法(散列表)_第1张图片

总结:由图中我们可以看出,我们会通过某一个key,进行hash函数的运算,映射到数组table中,这就是散列思想,我们可以通过散列函数,用时间复杂度为O(1)的去取table中的数据,散列函数最重要的就是hash(key)

2>散列函数设计的基本要求   

            a:经过散列函数得出的值必须是非负整数值

            b:如果key1 = key2 则hash(key1) = hash(key2)

           c:如果key1 != key2 则hash(key1) != hash(key2)

           我着重讲一下第3点,这种情况是合情合理的,但是在真实的情况下,得确存在不同的数据,通过hash得到的值是相同的,针对这种问题我们又应该来解决呢?

3>解决hash冲突的方法

        在好的散列函数也无法避免散列冲突,有2种解决办法,一种的开放寻址法,另一种方法链表法

        开发寻址方法:开放寻址法的核心思想是,当一个数据经过hash函数之后,对应的table上已经存放数据,,从该数据往下进行线性探测,如果有空位置进行存放数据,如果没有空位置,从table从头开始遍历,直到有空的位置可以存放该数据

数据结构与算法(散列表)_第2张图片

解释:我们这里的橙色表示已经存放该数据,当经过hash的x,定位到7的时候,该位置已经存放数据,进行空位置的查找8,9,此位置都有数据,从table的0左边探测,直到有空位置可以存放该数据.

  当table中的空闲位置不多的情况下,继续添加元素,hash冲突的概率大大增大,为表示table中的空间位置的多少,我们用装载因子进行表示

     装载因子的计算公司公式:装载因子= 填入表中的元素个数 /散列表的长度;

     装载因子越大,说明散列表中的空闲位置越少,表示hash冲突的概率增大

链表法:.我们会把具有相同hash值采用链表的方式进行存储.

数据结构与算法(散列表)_第3张图片

   使用这种数据方式,在进行插入的时候,及时hash值相同,通过链表的方式,插入的时间复杂度是0(1),在进行查询删除的时候,如果链表有k个元素。需要遍历这个链表去匹配查找的数值,所以查找删除和链表的长度有关,即时间复杂为O(k) :k表示链表的长度.

你可能感兴趣的:(数据结构与算法(散列表))