第5节课主要讲述了二分搜索树概念和BST排序。讲师提出一个关于“跑道预订系统”的问题,假设飞机场只有一个跑道,飞机需要为未来降落时间t进行预订,如果时间集合R中,在t时间前后k分钟内没有其他飞机着陆计划,时间t可以被安排进R中。那么请问“时间t被安排进R”的时间复杂度能不能为Ο(log2n)(假设R长度为n)?

首先我们先看下图的一个例子:

如果现在时间是37, 然后R集合中,在41.2,49,和56.3三个时间点上,其他飞机已经预订了跑道。如果我此次要预订t=53进行着陆,是可以安排的因为49+3<53<56.3-3,而如果是t=44,飞机无法安排因为t=41.2的飞机着陆完毕后t=41.2+3=44.2>41.2。而t=20的时间也不能安排,因为现在已经是t=37了。“挨个遍历R中所有元素进行时间t的比较”下的时间复杂度是Ο(n)

如果时间集合R是个已经排好序的数列,那么就可以用之前课程提到的二分查找法去做,具体如下图所示:

假设想要安排的时间t=34,那么我想从中间开始对比,t=34>32,那么之后就在数列右半边的中间数进行对比,最后找到插入点位于32和37之间。整个操作除了二分查找插入点还有移动(shifting,因为插入点后的数据需要向后移动),整个过程的时间复杂度是Ο(log2n+n), n的原因是最坏情况下,插入点在数列首元素前面。

而如果通过第4节课的Heap来做,时间复杂度是Ο(n)。可见,以上三种方法都不能实现Ο(log2n)的时间复杂度,为此讲师提出了二分搜索树(BST)进行操作。BST的该概念如下图所示:

二分搜索树的属性是,对于所有结点x:

  • 如果y是x的左子树,y的值 ≤ x的值;
  • 如果y是x的右子树,y的值 ≥ x的值;

举个构建BST和插入飞机时间t的例子:

先重构建BST说起:

  1. 插入49,放在树的顶端;
  2. 插入79,因为79>49,放在49右下边;
  3. 插入46,因为46<49,放在49左下边;
  4. 插入41,因为41<46,放在41左下边。

此时要插入时间t=42(k=3):

  1. 42<49-3,可以放在49左下边;
  2. 42<46-3,可以放在46左下边;
  3. 41+3>42,所以42不能放在41右下边,因此t=42不能被安排进R。

若h为BST的高,那么插入(不带检查)的时间复杂度是Ο(h)。

之后讲师提出一个新问题:求Rank(t) - 在时间≤t下,多少飞机能被安排进R?在回答这个问题之前,需要了解关于“子树尺寸subtree size”的概念,如下图所示:

子树尺寸subtree size = 当前结点(1个)+ 当前结点下所有结点数。

那么,在“时间≤t下,多少飞机能被安排进R?”的解决步骤如下:

  1. 树向下走到最终该达到的时间点(walk down tree to find desired time);
  2. 对较小的结点进行添加操作(add in the nodes that are smaller);
  3. 将左子树尺寸进行添加操作(add in the subtree size to the left)。

上面的步骤可能比较难理解,但通过下面例子就能很好的明白了:

  1. 如果问题中的t=79,那么先看BST的根节点:49<79,则+1;
  2. 看左子树:对49的左子树尺寸进行添加操作,则+2;
  3. 看右子树:79=79,则+1,对79的左子树尺寸进行添加操作,再加2;

最后结果为5(即时间≤79下,5个飞机能被安排进R)。

关于“时间t被安排进R”的时间复杂度能不能为Ο(log2n)?”和BST时间复杂度Ο(h)的关系将在后面课程进行讲解。

[MIT6.006] 5. Binary Search Trees, BST Sort 二分搜索树,BST排序的更多相关文章

  1. [leetcode]96. Unique Binary Search Trees给定节点形成不同BST的个数

    Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Input: ...

  2. [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  3. [Leetcode] Unique binary search trees 唯一二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  4. [LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Example ...

  5. [LeetCode] 96. Unique Binary Search Trees 唯一二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  6. [MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序

    一.深度优先搜索 它的定义是:递归探索图,必要时要回溯,同时避免重复. 关于深度优先搜索的伪代码如下: 左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点 ...

  7. [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  8. [LeetCode] 96. Unique Binary Search Trees(给定一个数字n,有多少个唯一二叉搜索树) ☆☆☆

    [Leetcode] Unique binary search trees 唯一二叉搜索树 Unique Binary Search Trees leetcode java 描述 Given n, h ...

  9. [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

随机推荐

  1. OpenCV计算机视觉学习(5)——形态学处理(腐蚀膨胀,开闭运算,礼帽黑帽,边缘检测)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 形态 ...

  2. 【水】怎么在 HZOI 上水到更高的分

    前言 这些东西在联赛并用不了 预编译优化 40行优化 #define _CRT_SECURE_NO_WARNINGS #pragma GCC optimize(2) #pragma GCC optim ...

  3. php-fpm 高并发 参数调整 转

    工作中经常会遇到会给客户配置服务器,其中有的客户还会有并发量要求,其中也会必须要用负载均衡承载压力的.增加服务器数量肯定能有效的提升服务器承载能力,但只有根据目前已有配置设置好单台服务器才能更好的发挥 ...

  4. linux(centos8): 临时关闭/永久关闭交换分区swap?

    一,为什么要关闭swap? 1,swap的用途? swap 分区就是交换分区,(windows平台叫虚拟内存) 在物理内存不够用时, 操作系统会从物理内存中把部分暂时不被使用的数据转移到交换分区, 从 ...

  5. nginx安全: 配置http基本验证(Basic Auth)(nginx 1.18.0)

    一,http基本验证的作用: 1,http基本身份验证会从浏览器弹出登录窗口, 简单明了,容易理解, 对于面向终端用户的前台来说,不够友好, 但对于内部员工操作的后台还是很有用,通常作为一层安全措施应 ...

  6. django—模板相关

    关于在html文件中使用模板语言时,一些符号的含义 {{}}:显示变量相关,在模板渲染的时候替换成值 {%%}:处理逻辑相关 django模板语言中,对于列表字典等容器类型,不能够通过[ 索引/键值 ...

  7. Linux入门到放弃之七《进程管理》

    进程管理 1.查看所有进程,并用全格式显示: 命令:ps -ef 2.用ps命令查看系统当前的进程,并把系统当前的进程保存到文件process中: 命令:ps aux >> process ...

  8. if当中是赋值怎么办

    1.Java中,赋值是有返回值的 ,赋什么值,就返回什么值.比如这题,x=y,返回y的值,所以括号里的值是1. 2.Java跟C的区别,C中赋值后会与0进行比较,如果大于0,就认为是true:而Jav ...

  9. js 值类型与引用类型

    说明之前先提一个提问题,看一下你是怎么理解的 1. 值类型 简单的数据类型,存放在栈中 var num = 100; var num2 = num; num += 100; console.log(n ...

  10. laravel 验证码 auth方式登录 中间件判断session是否存在

    首先下载laravel的插件 composer下载  实现验证码       composer require mews/captcha 在config/app.php进行配置 'providers' ...