非线性数据结构--学习笔记

 

        是一种满足以下条件的树:堆中的每一个节点值大于等于(或小于等于)其子树中的所有节点值.
不一定是完全二叉树,底层是数组
    用途:
        优先级队列
    优势:
        插入和删除效率高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说明不在

        总结:

                布隆过滤器说在的时候小概率会误判,说不在的时候一定不在

应用场景:

判断一个元素是否在一个超大集合中,如防止缓存穿透,垃圾邮箱过滤,黑名单等

去重:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值