算法导论第十二章练习参考答案(22) - 12.1-12.4

 Exercise 12.1-1

任何时候,如果一个节点有一个子节点,就把它当作右子节点,左子节点为NIL。

 

  Exercise 12.1-2

二叉搜索树的属性保证了左子树的所有节点都更小,右子树的所有节点都更大。最小堆属性只保证一般的子节点大于父节点的关系,但不区分左右子节点。因此,min-heap 属性不能用于在线性时间内按排序顺序打印出键,因为我们没有办法知道哪个子树包含下一个最小的元素。

  Exercise 12.1-3

我们对习题 10.4-5 的解决方案解决了这个问题。

  Exercise 12.1-4

我们调用 T.root 上的每个算法。参见算法 PREORDER-TREE- WALK 和 POSTORDER-TREE-WALK。

  Exercise 12.1-5

假设有一个矛盾我们可以在最坏情况下建立一个 BST 时间为 o(nlgn),然后, 为了排序,我们只需要构造 BST 然后读取无序遍历中的元素。第二步可以通过定理 12.1 在时间 Θ(n)内完成。同样,无序遍历必须是有序的,因为左子树中的元素都是比当前元素小的元素,它们都在当前元素之前被打印出来,而右子树的元素都是比当前元素大的元素,它们在当前元素之后被打印出来。这样就可以让我们在 o(n lg(n))时间内对一个矛盾进行排序。 


  Exercise 12.2-1

选项 c 不可能是探索的节点序列,因为我们从 911 节点取了左子节点,但 不知何故设法到达了 912 节点,该节点不属于 911 的左子树,因为它更大。选 项 e 也是不可能的,因为我们在 347 节点上取右子树,但后来遇到了 299 节点。

 Exercise 12.2-2

参见TREE-MINIMUM和TREE-MAXIMUM。

Exercise 12.2-3 

 

  

 Exercise 12.2-4

假设我们在这棵树中搜索4。 则 A = {2}, B = {1, 3, 4}, C =∅ ,班扬教授的主张因 1 < 2 而失败。

 Exercise 12.2-5

假设节点x有两个子节点。然后它的后继是 BST 在 x右的最小元素。如果它有一个左子元素,那么它就不是最小元素。所以,它一定没有左子元素。同样,前导必须是左子树的最大元素,所以不能有右子树。

 Exercise 12.2-6

首先我们确定 y 一定是 x的祖先,如果 y 不是 x的祖先,则设 z 表示 x和 y的第一个共同祖先,根据二叉搜索树的性质,x < z < y,因此 y 不能是 x的后继。

接下来观察 y.left 必须是 x 的祖先,因为如果它不是,那么 y.right 将是 x的祖先,这意味着 x > y.最后,假设 y 不是 x的最低祖先,它的左子也是 x的祖先,设 z 表示这个最低祖先。那么 z 一定在 y 的左子树中,这意味着 z < y,这与 y 是 x的后继结点的事实相矛盾。

 Exercise 12.2-7

为了在运行时上显示这个边界,我们将展示使用这个过程,我们遍历每条边两次。这就足够了,因为树中边的数量比顶点的数量少一个。
考虑一个 BST 的顶点,比如 x。然后,我们知道,当在 x.p 上调用后继函数时,在 xp 和 x之间的边被使用,当在以 x为根的子树的最大元素上调用它时,它又被使用。因为除了最初找到树的最小值外,这是唯一两次可以使用这条边。我们知道运行时间是 O(n)。我们得到的运行时间是 Ω(n)因为这是输出的大小。

 Exercise 12.2-8

设 x是我们调用 TREE-SUCCESSOR 的节点,y 是 th x的 k - successor。设 z是 x 和 y 的最低共同祖先。连续调用永远不会遍历一条边超过两次,因为TREE-SUCCESSOR 的行为类似于树遍历,所以我们永远不会检查单个顶点超过三次。此外,任何键值不在 x 和 y 之间的顶点将最多检查一次,并且它将发生在从 x到 z 或 y 到 z 的简单路径上。由于这些路径的长度以 h 为界,因此运行时间可以以 3k + 2h = O(k + h)为界。

 Exercise 12.2-9

如果 x = y.left,则在 x上调用继任者将不会导致 while 循环的迭代,因此将返回 y。类似地,如果 x = y.right,调用前身(参见练习 3)的 while 循环将不会运行多次,因此将返回 y。然后,只需要认识到问题要求显示的是 y 是前身(x)还是后继(x)。


 Exercise 12.3-1

对TREE-INSERT-REC的初始调用应该是NIL, T.root , z

 Exercise 12.3-2

在 TREE-INSERT 的 while 循环中检查的节点与在 TREE-SEARCH 中检查的节点相同。在 TREE-INSERT 的第 9 到 13 行中,只检查了一个额外的节点。

 Exercise 12.3-3

最坏的情况是,所形成的树的高度为 n,因为我们按照已经排序好的顺序插入它们。这将导致运行时间为 Θ(n2)。在最好的情况下,形成的树是近似平衡的。这将意味着高度不超过 O(lg(n))。注意它不能有更小的高度,因为高度为 h的完全二叉树只有 Θ(2 h )个元素。这将导致运行时间为 O(n lg(n))。我们在练习12.1-5 中展示了 Ω(n lg(n))。

 Exercise 12.3-4

删除是不可交换的。在下面的树中,删除 1 然后删除 2 得到的结果与删除2 然后删除 1 得到的结果不同。

 Exercise 12.3-5

我们的插入过程与 12.3-1 的解决方案密切相关,不同之处在于,一旦它找到插入给定节点的位置,它就会适当地更新 suc 字段,而不是 z p 字段。

我们的 Search 过程与前一节给出的版本没有变化
对于删除过程,我们将假设所有键都是不同的,因为这是本章中经常出现的假设。然而,这将取决于它。我们的删除过程首先调用 search ,直到我们离要查找的节点只有一步之远,也就是说,它调用 TREE-PRED(T.root,z.key)

它可以使用这个 TREE-PRED 过程来计算 up和 vp。TRANSPLANT 程序。由于 TREE-DELETE 只调用 TRANSPLANT 的次数是恒定的,因此以这种方式将 TRANSPLANT 的运行时间增加到 O(h)会导致新的TREE-DELETE 过程的运行时间为 O(h)

 Exercise 12.3-6

更新第 5 行,使 y 等于 TREE-MAXIMUM(z.left)。为了实现公平策略,我们可以在每次调用 TREE-DELETE 时随机决定是否使用前任或继任者。


Exercise 12.4-1 

 

考虑大小为 4 n + 3 子集中最大元素的所有可能位置。假设它在某个i≤n1 的位置为 i + 4。然后,我们有 i+3 个位置,我们可以从中选择子集中剩下的三个元素。由于每个最大元素不同的子集都是不同的,我们只需将它们全部加起来就可以得到总数(包含排除原理)

 Exercise 12.4-2

为了保持平均深度较低但高度最大化,期望的树将是一个完整的二叉搜索
树,但是长度为 c(n) 的链从其中一个叶节点垂下。设 k = log(n c(n)) 为完整二
叉搜索树的高度。则平均高度近似为
上界由最大的 c(n)给出,使得 和 c(n) =ω(lg n) 一个可行的函数是\sqrt{n}

 Exercise 12.4-3

假设我们有元素{1,2,3}。然后,如果我们用随机排序构造一棵树,那么,

我们得到的树出现的概率是 1/ 6 。然而,如果我们考虑键集 {1,2,3} 上所有有效的
二叉搜索树。那么,我们将只有 5 种不同的可能性。所以,每一种发生的概率
都是 1/5 ,这是一个不同的概率分布。

Exercise 12.4-4 

 

二阶导数是2^{x}ln^{2}(2)它总是正的,所以函数是凸的。  

 Exercise 12.4-5

假设快速排序总是选择中间的元素每次都是个元素。然后,问题的大小每次至少以(1−k/2)次幂缩小。因此,最大递归深度d将使,求解d,我们得到。所以,设A(n)表示在对长度为n的列表进行快速排序时,选择的某个枢轴不在中间的概率。这不是以的概率发生的。然后,我们得到两个子问题规模为n1, n2,且n1+n2=n-1,且。因此,A(n)≤
因此,由于深度以O(1/ lg(n))为限,设\left \{ a_{i,j} \right \}_{i}是深度j处剩下的所有子问题的大小,因此,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你在测试金字塔的哪一层(上)

​在准备将软件上线到生产环境之前需要进行测试。随着软件测试方式日趋成熟&#xff0c;软件开发团队的测试也在取代大量手动测试&#xff0c;逐渐实现自动化测试。 通过自动化测试&#xff0c;开发团队可以在短短几分钟内就了解到软件是否存在问题&#xff0c;而不需要等待几天…

航空公司遭遇Play恶意家族攻击,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件95起&#xff0c;与上周相比数量持平。 本周Play是影响最严重的勒索家族&#xff0c;Blacksuit和Ransomhub恶意家族紧随其后&#xff0c;从整体上看lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。 本周大陆航空技…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— 弹窗组件

简介 弹窗是移动应用中常见的一种用户界面元素&#xff0c;常用于显示一些重要的信息、提示用户进行操作或收集用户输入。ArkTS提供了多种内置的弹窗供开发者使用&#xff0c;除此之外还支持自定义弹窗&#xff0c;来满足各种不同的需求。 下面是所有涉及到的弹窗组件官方文档…

CSS 浮动

浮动 在标准流当中&#xff0c;元素或者标签在页面上摆放的时候会出现不如意的地方。要想解决这些问题可以采用脱离标准流的方式来进行解决这些问题&#xff0c;脱离标准流也称为脱离文档流。 脱离标准流的解决方式有三种&#xff0c;一种是浮动&#xff0c;另外一种是固定定位…

如何读懂磁滞回曲线(磁化曲线、退磁曲线、内禀曲线)

硬磁性材料&#xff0c;如钕铁硼磁钢&#xff0c;有两个显著特征&#xff0c;一是在外磁场作用下能被强烈磁化&#xff0c;另一个是磁滞&#xff0c;即撤走外磁场后硬磁材料仍保留磁化状态&#xff0c;下图为硬磁材料的磁感应强度B与磁化场强度H之间的关系曲线。 当磁场按Hs→H…

算法——贪心

「贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优」 贪心无套路 1. 分发饼干 贪心策略&#xff1a; &#xff08;1&#xff09;局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩 &#xff08…

Linux chapter1 常用命令 cp

note 1 : netstat、curl、ip、nmap、dig 这些都是常用的网络诊断工具&#xff0c;它们的全称如下&#xff1a; netstat&#xff1a;Network Statistics&#xff0c;网络统计&#xff0c;用于显示网络连接&#xff0c;路由表&#xff0c;网络接口统计等网络信息。curl&#xf…

Kali Linux 更换优质国内源

文章目录 环境说明1 Kali Linux 源简介2 Kali Linux 更换国内源 环境说明 操作系统&#xff1a;kali-linux-2024.1-installer-amd64 1 Kali Linux 源简介 所谓的 Kali Linux 源&#xff0c;你可以将它理解为软件仓库&#xff0c;系统通过它安装和更新软件&#xff1b;源的服务…

nodeJs 学习

常用快捷键 二、fs模块 回调函数为空&#xff0c;则表示写入成功&#xff01; 练习 const fs require(fs); fs.readFile(../files/成绩.txt, utf-8, (err, dataStr) > {if (err) {console.log(读取失败);return err;}console.log(读取成功);const arr dataStr.split( )co…

RPC 和 序列化

RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口&#xff0c; 包含kvserver功能的一对一映射&#xff1a;Get/PutAppend&#xff0c;通过stub对象——raftKVRpcProctoc:…

web前端之实现复选功能、repeat

MENU 1、原生实现1.1、html部分1.2、JavaScript部分1.3、css部分1.4、效果图 2、uniApp实现2.1、html部分2.2、JavaScript部分2.3、css部分2.4、效果图 1、原生实现 1.1、html部分 暂时为null&#xff0c;后续会补充。1.2、JavaScript部分 暂时为null&#xff0c;后续会补充…

算法第二十九天-森林中的兔子

森林中的兔子 题目要求 解题思路 重点&#xff1a;某个兔子回答x的时候&#xff0c;那么数组中最多循序x1个同花色的兔子同时回答x 我们可以通过举例子得出一下的规律&#xff1a; 我们统计数组中所有回答x的兔子的数量n&#xff1a; 若n%(x1)0&#xff0c;说明我们此时只需…

Vector[C++]

文章目录 C中的std::vector简介std::vector的特点std::vector的重要接口用法介绍1. 初始化vector 2. 添加元素push_backemplace_back 3. 访问元素operator[]back 4. 修改元素operator 5. 遍历三种&#xff0c;下标&#xff0c;迭代器&#xff0c;范围for 6. 容量和大小sizeempt…

Induction or tail-recursion

选择排序 遍历整个待排序的数组&#xff0c;从第一个元素开始。在未排序的部分中&#xff0c;找到最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其与第一个元素交换位置。接着从第二个元素开始&#xff0c;重复步骤2&#xff0c;直到所有元素都被排序 迭代版 递…

Qt实现简单的五子棋程序

Qt五子棋小程序 Qt五子棋演示及源码链接登陆界面单机模式联机模式联网模式参考 Qt五子棋 参考大佬中国象棋程序&#xff0c;使用Qt实现了一个简单的五子棋小程序&#xff0c;包含了单机、联机以及联网三种模式&#xff1b;单机模式下实现了简易的AI&#xff1b;联机模式为PtoP…

OPTIONS请求(跨域预检查)

目录 一、什么是OPTIONS请求&#xff1f;二、简单请求、复杂请求三、特定的请求头、响应头 一、什么是OPTIONS请求&#xff1f; OPTIONS 请求方式是 HTTP 协议中的一种&#xff0c;主要用于 从响应头中获取服务器支持的HTTP请求方式。 OPTIONS 请求方式是 浏览级行为&#xf…

Redis命名设计

可读性和管理性 以项目名为前缀(防止key冲突)&#xff0c;用冒号分隔&#xff0c;比如项目名:表名:id zh(知乎):news_data(新闻数据):2(主键id) zh:news_data:2 精简性 key的命名&#xff0c;尽量精简&#xff0c;key的名字长度对内存的占用不可忽视&#xff0c;我们来实际…

网络编程--高并发服务器

这里写目录标题 引入场景 多进程并发服务器二级目录二级目录二级目录 多线程并发服务器二级目录二级目录二级目录 多路IO转接服务器设计思路对比引入 select函数简介参数介绍第一个参数第234参数返回值对于第234参数的应用对于最后一个参数总结 附加操作&#xff08;附加四个函…

【SRE系列之docker容器】--dockerfile镜像优化

dockerfile镜像优化 1.1 镜像优化方法 系统镜像采用ubuntu或者alpine&#xff0c;会比centos少1G左右编写业务镜像时从官网拉取镜像&#xff0c;其余配置根据业务需求再配置编写dockerfile时把不用的安装包卸载或者删除尽量减少run命令的使用&#xff08;一个run命令&#xf…

牛客题霸-SQL入门篇(刷题记录二)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 以下内容是牛客题霸-SQL入门篇剩余的第 21-39 道题目的 SQL 代码答案。 由于涉及到的数据库表较多&#xff0c;因…