第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. Redis安装使用以及可能的算法实践

    layout: post title: 2017-12-05-Redis 入门 tags: - Redis - 实时特征 - UCB, Tompson sampling Redis 是什么? Redi ...

  2. antd pro 下的文件下载

    概要 示例 后端 前端 直接显示图片 提供下载链接, 点击后下载 文件导出, 前端没有显示下载链接的位置 概要 前端上传文件的例子很多, 但是下载相关的例子不多, 主要是因为下载本身比较简单. 但是这 ...

  3. day55 Pyhton 前端Jquery07

    昨日回顾: 表单,点击submit提交以后,服务端受到信息 import socket import pymysql from urllib.parse import unquote def run( ...

  4. redhat系统服务器重启后提示An error occurred during the file system check.

    问题描述 浪潮一台NF8480M3外观红灯报警,鉴于无法登陆带外,只能对服务器进行断电重启操作 问题现象 重启后进入开机过程并报错,报错如下内容及图片如下所示,正常来说进入此界面后直接输入root密码 ...

  5. Java改写重构第2版第一个示例

    写在前面 <重构:改善既有代码的设计>是一本经典的软件工程必读书籍.作者马丁·福勒强调重构技术是以微小的步伐修改程序. 但是,从国内的情况来而论,"重构"的概念表里分离 ...

  6. zookeeper在生产环境中的配置(zookeeper3.6)

    一,zookeeper中日志的配置 1,快照文件snapshot的目录: dataDir=/data/zookeeper/data 存储快照文件snapshot的目录.默认情况下,事务日志也会存储在这 ...

  7. selenium 提取天猫网页数据

    from time import sleep from selenium import webdriver br = webdriver.Chrome() url = "https://ww ...

  8. 【应用服务 App Service】Azure App Service 中如何安装mcrypt - PHP

    问题描述 Azure App Service (应用服务)如何安装PHP的扩展 mcrypt(mcrypt 是php里面重要的加密支持扩展库) 准备条件 创建App Service, Runtime ...

  9. linux 环境搭建Jenkins

    这里提供一个本地搭建Jenkins的方法,基于wins 的 https://blog.csdn.net/u011541946/article/month/2017/09/2   下面讲的是在服务器上操 ...

  10. win10+ubuntu18.04lts双系统安装葵花宝典(解疑篇)

    本文将对win10+ubuntu18.04lts双系统安装过程中的一些操作的目的和可能遇到的问题进行解释. 文章目录 如何正确分区 创建双系统后直接进入了windows怎么办 修改ubuntu开机界面 ...