线性表 & 散列表

线性表:

  数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向,

  包括 数组,链表,队列,栈。

 

非线性表 :

  数据之间并不是简单的前后关系,有二叉树、图等。

 

 

散列表基于 数组支持按照下标访问数据的特性,是数组的一种扩展)

  通过散列函数把元素的键值 映射为 下标,然后将数据存储在数组中对应下标的位置。

  当按照键值查询元素时时,用同样的散列函数,将键值转化数组下表,从对应的数组下表的位置取数据。

散列表源于数组,他借助散列函数对数组这种数据结构进行扩展,利用的是数组支持 按照下标

随机访问元素的特性,散列表的两个核心问题是 散列函数设计和散列函数冲突

散列表仅支持 添加 、查、 删 不支持修改。

散列函数 可以定义为 hash(key),key表示元素的键值,hash(key)的值表示经过散列函数计算得到散列值。

 

解决散列冲突的方法

1 开放寻址法

如果出现了散列冲突(就是经过计算完放入的table 有值的情况)就从这个table 往后 找到空位置,插入。

探测新的位置的方法有 线性探测二次探测双重探测

线性探测:存储位置被占用,从当前位置向后查找,有空位置就插入。

   缺点 :如果数据越来越多,耗费的时间就越来越多

二次探测:探测的步长变成了原来的"二次方"

双重探测:用一组散列函数,如果第一个散列函数计算的位置被占了,就用第二个散列函数计算。

2 链表法

散列表中,每个桶或槽 会对应一条链条,所有散列值相同的 元素 我们都放到相同槽位对应的链表中

插入的时候只需要通过计算散列函数计算出对应的散列槽位,将其插入到对应链表中即可。

当查找、删除一个元素时,同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除。

原文地址:https://www.cnblogs.com/wy919/p/13049120.html