第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. shell-变量输入内置read命令详解

    1. shell变量的输入 shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入得. [语法格式] read [参数] [变量名] [常用参数] -p:指定读取值时的提示符: ...

  2. Windows VS Code 配置 C/C++ 开发环境

    准备 Windows [这个相信大家都有 笑: )] VS Code MinGW-w64 C/C++ 安装 MinGw-w64 具体说明细节和安装体验可以在<⑨也懂系列:MinGW-w64安装教 ...

  3. Vim最强调试插件:vimspector

    最近看到了韦大在知乎的回答后,想去试用一下vimspector,却发现vimspector诞生两年了却没有介绍它的中文资料.我查阅官方文档遇到不少困难,在这里记录折腾出来的结果,与大家分享. vims ...

  4. 如何让矢量瓦片配图神器maputnik支持 geoserver

    关键词:maputnik.geoserver.矢量地图.矢量瓦片.mapbox.mapboxgl.地图配图.地图配色 一直想搞一个类似百度.高德地图那样的矢量地图配图工具 百度个性化地图配图工具: 高 ...

  5. 主流开源分布式图数据库 Benchmark

    本文由美团 NLP 团队高辰.赵登昌撰写 首发于 Nebula Graph 官方论坛:https://discuss.nebula-graph.com.cn/t/topic/1377 1. 前言 近年 ...

  6. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  7. dubbo配置加载优先级

    优先级从高到低: JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口: XML 次之,如果在 XML 中有配置,则 dubbo.properties ...

  8. 解决Java连接Oracle 12c存在的问题

    感谢作者 原文链接:https://blog.csdn.net/peng_wei_kang/article/details/80403486 1.发现项目报以下错误:   Caused by: jav ...

  9. 抽空学学KVM(六)qemu-img命令使用

    通过KVM创建虚拟机,用到的命令不多,而且可以通过qemu-img -help查看到非常详细的解释,常用的主要有以下几种: 1.qemu-img info  查看磁盘信息     #info [-f ...

  10. this.getResolve is not a function VUE中使用sass

    1. 安装以下依赖 npm install node-sass --save-dev //安装node-sass npm install sass-loader --save-dev //安装sass ...