• 数据结构与算法笔记


    二分查找(上):如何用最省内存的方式实现快速查找功能?
    二分查找(下):如何快速定位IP对应的省份地址?

    变体一:查找第一个值等于给定值的元素

    变体二:查找最后一个值等于给定值的元素

    变体三:查找第一个大于等于给定值的元素

    变体四:查找最后一个小于等于给定值的元素

    跳表:为什么Redis一定要用跳表来实现有序集合?
    散列表(上):Word文档中的单词拼写检查功能是如何实现的?
    散列冲突

    1. 开放寻址法

    2. 链表法

    散列表(中):如何打造一个工业级水平的散列表?
    二叉树基础(上):什么样的二叉树适合用数组来存储?
    你有没有发现,“树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫做“节点”;用来连接相邻节点之间的关系,我们叫做“父子关系”。比如下面这幅图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。

    除此之外,关于“树”,还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的:

    高度”“深度”“层”

    二叉树(Binary Tree)树结构多种多样,不过我们最常用还是二叉树。二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只有左子节点,有的节点只有右子节点。我画的这几个都是二叉树。以此类推,你可以想象一下四叉树、八叉树长什么样子。

    实际上,二叉树的前、中、后序遍历就是一个递归的过程。比如,前序遍历,其实就是先打印根节点,然后再递归地打印左子树,最后递归地打印右子树。

    二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
    二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。

    1. 二叉查找树的查找操作

    2. 二叉查找树的插入操作

    3. 二叉查找树的删除操作

    4. 二叉查找树的其他操作

    红黑树(上):为什么工程中都用红黑树这种二叉树?
    顾名思义,红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求:根节点是黑色的;每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;

    为什么说红黑树是“近似平衡”的?我们前面也讲到,平衡二叉查找树的初衷,是为了解决二叉查找树因为动态更新导致的性能退化问题。所以,“平衡”的意思可以等价为性能不退化。“近似平衡”就等价为性能不会退化得太严重。

    首先,我们来看,如果我们将红色节点从红黑树中去掉,那单纯包含黑色节点的红黑树的高度是多少呢?

    我们现在知道只包含黑色节点的“黑树”的高度,那我们现在把红色节点加回去,高度会变成多少呢?从上面我画的红黑树的例子和定义看,在红黑树中,红色节点不能相邻,也就是说,有一个红色节点就要至少有一个黑色节点,将它跟其他红色节点隔开。红黑树中包含最多黑色节点的路径不会超过 log2n,所以加入红色节点之后,最长路径不会超过 2log2n,也就是说,红黑树的高度近似 2log2n。所以,红黑树的高度只比高度平衡的 AVL 树的高度(log2n)仅仅大了一倍,在性能上,下降得并不多。这样推导出来的结果不够精确,实际上红黑树的性能更好。

    红黑树的另一种定义是满足下列条件的二叉查找树:
    ⑴红链接均为左链接。
    ⑵没有任何一个结点同时和两条红链接相连。(这样会出现4-节点)
    ⑶该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同。

    理解了这个过程以后,再去看红黑树的各种严格定义,以及其插入,删除还有旋转等操作,相信你脑子里的思路会清晰得多的。

    只为更好的服务;服务工作者。
  • 相关阅读:
    Circular dependency issuse on cocoapods version(0.36.0) 全然解决方式(非降版本号)
    Android Studio经常使用配置及使用技巧(二)
    poj 2195 Going Home(最小费最大流)
    OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检測的測试代码
    Divisibility by Eight
    hdu 5055(坑)
    微服务(Microservices)
    mysql 运行计划explain具体解释
    URAL 题目1297. Palindrome(后缀数组+RMQ求最长回文子串)
    Windows下将nginx安装为服务运行
  • 原文地址:https://www.cnblogs.com/pony-mamba/p/13609331.html
Copyright © 2020-2023  润新知