线性表 & 散列表
线性表:
数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向,
包括 数组,链表,队列,栈。
非线性表 :
数据之间并不是简单的前后关系,有二叉树、图等。
散列表(基于 数组支持按照下标访问数据的特性,是数组的一种扩展)
通过散列函数把元素的键值 映射为 下标,然后将数据存储在数组中对应下标的位置。
当按照键值查询元素时时,用同样的散列函数,将键值转化数组下表,从对应的数组下表的位置取数据。
散列表源于数组,他借助散列函数对数组这种数据结构进行扩展,利用的是数组支持 按照下标
随机访问元素的特性,散列表的两个核心问题是 散列函数设计和散列函数冲突
散列表仅支持 添加 、查、 删 不支持修改。
散列函数 可以定义为 hash(key),key表示元素的键值,hash(key)的值表示经过散列函数计算得到散列值。
解决散列冲突的方法
1 开放寻址法
如果出现了散列冲突(就是经过计算完放入的table 有值的情况)就从这个table 往后 找到空位置,插入。
探测新的位置的方法有 线性探测、二次探测、双重探测。
线性探测:存储位置被占用,从当前位置向后查找,有空位置就插入。
缺点 :如果数据越来越多,耗费的时间就越来越多
二次探测:探测的步长变成了原来的"二次方"
双重探测:用一组散列函数,如果第一个散列函数计算的位置被占了,就用第二个散列函数计算。
2 链表法
散列表中,每个桶或槽 会对应一条链条,所有散列值相同的 元素 我们都放到相同槽位对应的链表中
插入的时候只需要通过计算散列函数计算出对应的散列槽位,将其插入到对应链表中即可。
当查找、删除一个元素时,同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除。