堆
是一种满足以下条件的树:堆中的每一个节点值大于等于(或小于等于)其子树中的所有节点值.
不一定是完全二叉树,底层是数组
用途:
优先级队列
优势:
插入和删除效率高log(n),相较于数组
查最大和最小为log(1)
分类:
最大堆
最小堆
堆操作:
插入元素:
先将元素插入到最后
不断更新节点位置
删除堆顶元素:
自底向上堆化:
将堆顶元素删除后,看看他的子节点哪个优秀哪个上位,不断类推
自顶向下堆化:
先将最后一个元素移到堆顶,然后不断地将这个元素向下移动直到到达正确的位置
堆排序:
建堆:
将一个无序数组建立成一个堆
其实就是对所有非叶子节点自顶向下堆化的过程
排序:
将堆顶元素取出放入末尾,然后对所有的其他元素进行堆化,如此反复
树
特点:
树中任意两个节点有且仅有一条通路
有n个节点,则恰好有n-1条边
不包含回路
二叉树 的第 i 层至多拥有 2^(i-1) 个节点,深度为 k 的二叉树至多总共有 2^(k+1)-1 个节点(满二叉树的情况),至少有 2^(k) 个节点
若父结点的序号是 i,那么左子节点的序号就是 2i,右子节点的序号是 2i+1
单位:(高度和深度都是从零开始的,层数是从1开始的)
高度
深度
层数
常用概念:
节点:
根节点
父节点
子节点
兄弟节点
叶子结点
节点高度
节点深度
节点层数
树的高度
分类:
满二叉树:
全满
完全二叉树:
除了最后一层其它层全满,且最后一层从左向右是没有间隙的
平衡二叉树:
空树或者
左右两个子树的高度差的绝对值不超过1,并且两个子树都是平衡二叉树
二叉树的存储:
链式存储:
依靠指针将各节点串联起来,不需要连续的存储空间(java中没有指针,用的是对象的引用)
每个节点有三个属性:
data
左指针
右指针
顺序存储
基于数组
不是完全二叉树利用数组存储,数组中会出现很多的空隙,导致内存利用率下降
二叉树遍历:
前序遍历
中序遍历
后续遍历
红黑树:
是一种自平衡二叉树,防止退化为链表
特点:
1每个节点非红即黑;
2根节点总是黑色的;
3每个叶子节点都是黑色的空节点(NIL 节点);
4如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
5从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。
布隆过滤器:
看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构
一个名叫 Bloom 的人提出了一种来检索元素是否在给定大集合中的数据结构,这种数据结构是高效且性能很好的,但缺点是具有一定的错误识别率(hash冲突)和删除难度。并且,理论情况下,添加到集合中的元素越多,误报的可能性就越大
原理
加入元素时:
1使用hash对元素求值
2将对应hash值下表的值设置为1
判断一个元素是否存在于布隆过滤器中的时候
1对给定元素求hash值
2判断数组中对应下表是否为1,如果为1说明在,如果不为1说明不在
总结:
布隆过滤器说在的时候小概率会误判,说不在的时候一定不在
应用场景:
判断一个元素是否在一个超大集合中,如防止缓存穿透,垃圾邮箱过滤,黑名单等
去重: