玩转数据结构从入门到进阶(四 集合set与映射map堆与优先队列,线段树:)

项目源码:https://gitee.com/renqiqi/shujvjiegou
层序遍历:广度优先遍历
使用非递归方式实现。更快的找到想要的元素,主要应用于搜索。
删除任意节点:删除节点后,找到该节点的右子树中最小值,让他顶替该节点的位置,并在原来的位置上删除这个最

小值
用链表来实现set集合复杂度是O(n),而用二分搜索树来实现Set,复杂度是O(logn):其实是O(h),h就是树的高度

。当数据都按照顺序插入二分搜索树的时候,是最坏的情况,此时二分搜索树退化为链表。实现的set复杂度退化为

O(n)。
有序映射基于搜索树实现,无序映射基于哈希表实现。
堆和优先队列:
优先队列:出队顺序和入队顺序无关,和优先级有关。动态选择优先级高的运行。
二叉堆:是一颗完全二叉树,不一定是满二叉树。一层一层的从左到右放置元素,放完一层又一层。堆中所有节点的

值都大于等于其孩子节点的值。满足这种性质又称为最大堆。反之,都小于等于称为最小堆。层数多的节点的数据不

一定就比层数少的数据小。由于二叉堆是一层一层码出来的,可以用一个数组来表示二叉堆。对于每个节点来说(根

节点索引从一开始),它的左孩子索引i是其索引的二倍2i,右孩子是左孩子加一 2i+1.其父节点是i/2.如果根节

点索引从零开始的话。它的左孩子索引i是其索引的二倍2i+1,右孩子是左孩子加一 2i+2.其父节点是(i-1)/2
从堆中取出元素针对的是根节点,也就是他的最大值。对于数组来说索引为0的元素。
siftdown:取出最大元素,将堆中最后一个数顶替到根节点的位置上,并删除最后一个数原来所在位置。此时该数变

为根节点。再比较该节点左右两个孩子,选其中最大的与之交换,循环执行此步骤。
各种操作复杂度都为O(log n),完全二叉树不会退化为链表
heapify:将任意数组转化为堆。先将数组放入一颗完全二叉树中,然后从最后一个非叶子节点开始倒着,不断进行

siftdown操作。
如何找到一个非叶子节点的索引是多少:找到最后一个节点,然后找最后一个节点的parent父节点。
java默认的优先队列是一个最小堆。
线段树:也叫区间树。二叉树的节点存储的是一段区间。快速找到我们所关心的区间对应的一个或多个节点。而不需

要对所有元素都进行遍历。不一定是满二叉树,也不一定是哇完全二叉树。叶子节点都是单个元素。线段树是平衡二

叉树:最大深度和最小深度最多相差为1.堆也是一种平衡二叉树。完全二叉树就是一种平衡二叉树。
一个区间有n个元素,用数组表示需要多少节点。使用4n的静态空间,因为不需要考虑添加元素

猜你喜欢

转载自blog.csdn.net/sinat_36748650/article/details/86547531