第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. ansible-playbook模板化(jinja2)

    1. ansible-playbook模板化(jinja2)条件与循环  1.1) jinja使用结构图 2. 编写jinja2的循环  2.1) 编写jinja2模板 1 [root@test-1 ...

  2. JVM(五):JVM模型与GC

    确定垃圾 引用计数(存在循环引用问题) 根可达算法 常见的垃圾回收算法 标记清除算法-位置不连续,产生碎片 拷贝算法- 没有碎片,浪费空间 标记压缩-没有碎片,效率偏低(多线程需要进行线程同步,单线程 ...

  3. 制作西北地区地图数据并maskout

    1.从全国地图数据中选中西北5省:打开bou2_4p.shp文件添加相应的图层(中国各省的行政区域),选中工具栏中的"通过矩形选择要素"工具,用鼠标点击选择要输出的图元,按住ctr ...

  4. Flask实现群聊

    后端 from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import WSGIServer from ge ...

  5. C 语言因为疫情重登最流行编程语言榜第一名!其实它一直都在~

      C 语言时隔五年后再次荣登最流行编程语言榜单第一名. 通过调查得出结论, C 语言再次受欢迎的原因竟然是因为病毒,这听起来愚蠢但确实是事实,嵌入式语言 C 和 C++ 被用于医疗设备中的幅度因为疫 ...

  6. 这玩意比ThreadLocal叼多了,吓得why哥赶紧分享出来。

    这是why哥的第 70 篇原创文章 从Dubbo的一次提交开始 故事得从前段时间翻阅 Dubbo 源码时,看到的一段代码讲起. 这段代码就是这个: org.apache.dubbo.rpc.RpcCo ...

  7. C# indexof和indexofany区别(转)

    定位子串是指在一个字符串中寻找其中包含的子串或者某个字符.在String类中,常用的定位子串和字符的方法包括IndexOf/LastIndexOf及IndexOfAny/LastIndexOfAny, ...

  8. java中继承和多态

    转自原文http://blog.csdn.net/xinxin19881112/article/details/2944760 若冒犯博主,请勿见怪! 1.  什么是继承,继承的特点? 子类继承父类的 ...

  9. Maven1详解

    Maven详解(一)------ Maven概述   目录 1.引言 2.常规项目开发存在的问题 3.什么是 Maven ? 4.Maven 的历史 5.Maven 的目标 6.Maven 的理念 回 ...

  10. centos7 添加环境变量

    修改/etc/profile文件使其永久性生效,并对所有系统用户生效 PATH=$PATH:/usr/local/php/bin export PATH source /etc/profile