哈希表
哈希表存储是由key value组成的数据 使用哈希表解决线性查询费时的问题
准备数组来存储数据 使用Hash计算哈希值 放入对应的数组位置中 放入过程中会遇到相同的值导致冲突
可以使用链表在已有数据的后面继续存储新数据(链地址法) 也可以计算出候选地址解决冲突(开放地址法)以及线性探测法
放入完成之后 可以对数据进行查询 首先计算出哈希值 查到对应的位置 如果使用了链表 需要结合链表的线性查找 最后得到结果
堆
堆是一种图的树形结构 被用于实现优先队列 可以自由添加数据 但取出数据时候要从最小值开始按顺序取出
堆的树形结构中 各个顶点被称为结点 数据存储在结点中
堆中每个结点最多有两个子结点 树的形状取决于数据的个数 另外结点的排序为从上到下从左到右
数据存储需要遵守 子结点必定大于父节点 因此最小值被存储在顶端的根节点
在往堆中添加数据时候 一般会把新数据放在最下面一行靠左的位置 当最下面一行没有多余空间时候 就再往下另起一行
把数据加在这一行的最左端
取出数据时候 取出最上面的数据 由于被取出数据 堆的结构也需要重新调整
堆中最顶端的数据始终最小,所以无论数据量有多少 取出的最小值的时间复杂度都为O(1)
因为取出数据后 需要将最后的数据移到顶端 一边比较与子节点数据大小一边往下移动 所以取出数据需要的运行时间和树的高度成正比
假设数据量为n 根据堆的形状特点可知树的高度为logn 那么重构树的时间复杂度为O(logn)
添加数据也一样 O(logn)
二叉查找树
采用了图的树形结构 数据存储于二叉查找树的各个结点中
每个结点最多有两个子结点
二叉查找树有两个性质 第一个每个结点的值均大于左子树上任意一个结点的值 第二个是每个结点的值均小于右子树上任意一个结点的值
得出结论 二叉树查找树 的最小结点要从顶端开始 往左下的末端寻找
反过来最大结点 要从顶端开始往其右下的末端寻找
添加数据 从二叉树的顶端结点开始寻找添加数值的位置 将想要添加的数字与结点的数值进行比较 小于往左边移动 大于它则往右边移动
删除数据 如果要删除的结点没有子结点 直接删掉 如果需要删除的结点只有一个子结点 那么先删去目标点
然后把子结点移到被删除结点的位置上
如果要删除的结点有两个子结点 那么先删除目标结点 然后在被删除结点的左子树中寻找最大结点 最后将最大结点移到被删除结点的位置上
这样一来 就满足二叉树性质的前提下删除结点 如果需要移动的结点还有子结点 就递归执行前面的操作
查找结点 二叉树顶端结点开始网下查找 和添加数据一样 把目标和结点中的值相互比较 小于则左移 大于则右移 直至找到