【练习3.22】

a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin

返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1)。

b.证明,如果我们加入第四种操作DeleteMin,那么至少有一种操作必须花费Ω(logN)时间。

【练习3.23】

说明如何用一个数组实现三个栈。

【练习3.24】

在2.4节中用于计算斐波那契的递归例程如果在N=50下运行,栈空间有可能用完吗,为什么?

Answer:

【练习3.22】

a.最简单的想法就是再维护一个最小值域,有更小的值被Push入栈的时候,修改最小值。

但这种方法会导致当前的最小值Pop出栈的时候无法获得新的最小值。

相应地把这个最小值域扩展成一个辅助栈。

当新入主栈的元素大于当前最小值时,不作任何附加操作;当新入主栈的元素小于当前最小值时,拷贝一份压入辅助栈。

同理弹出时如弹出的是当前最小值,则辅助栈同时弹出;否则仅主栈弹出。

Push、Pop、FindMin的时间复杂度都是O(1)。

b.当一个操作集共同拥有Pop、Push、FindMin、DeleteMin的时候,它就可以通过比较的方法来执行一组元素的排序了。

确切地说,只要后三个操作共同存在即可。如共N个元素排序,则Push、FindMin、DeleteMin各需N次必然可以完成条件。

众所周知的结论是,以比较的方法来进行排序,其时间复杂度下界为Ω(NlogN),相除有:

执行一次Push+FindMin+DeleteMin的时间复杂度下界为Ω(logN)。

这说明这三个操作不能同时以O(1)时间复杂度共存,至少有一个的复杂度必须花费Ω(logN)。

【练习3.23】

其实自己想是没怎么想出来的,看了答案以后觉得答案的方法也是个坑爹方法,如下:

一个数组,就如同之前题目所模拟的,一个栈从左一个从右开始向中间走,这是两个栈。

第三个栈的起点在数组的中间,一开始,选择任意一个方向扩张,当受阻时,计算并将数据位移到当前数组空间的正中。

………………………………(╯‵□′)╯︵┻━┻

这算是解决办法么!一点效率也没有好不好!照这么说一个数组模拟一百个栈都可以了!

总之答案这么说也只能这样了……

【练习3.24】

N=50妥妥地溢出。

求斐波那契用递归就是指数型增长的时间复杂度。栈空间才多少,50次方下来几个T都不够用。

【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题的更多相关文章

  1. EC读书笔记系列之12:条款22、23、24

    条款22 将成员变量声明为private 记住: ★切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. ...

  2. 第03章 AOP前奏

    第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...

  3. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  4. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  5. 记一次metasploitable2内网渗透之21,22,23,25端口爆破

    Hydra是一款非常强大的暴力破解工具,它是由著名的黑客组织THC开发的一款开源暴力破解工具.Hydra是一个验证性质的工具,主要目的是:展示安全研究人员从远程获取一个系统认证权限. 目前该工具支持以 ...

  6. 【Weiss】【第03章】增补附注

    基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...

  7. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  8. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  9. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

随机推荐

  1. jenkins使用(1)

    术语:构建一次job指的是执行一次任务 注:到了公司,如果需要搭建jenkins环境可以找运维 jenkins使用: 创建视图 常用的两个配置: 新建任务: 可以选择构建后的步骤: 然后保存 图标状态 ...

  2. centos7 开机/etc/rc.local 不执行的问题(转载)

    最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 #!/bin/bash # THIS FILE IS ADDE ...

  3. SpringMVC基本使用步骤

    使用Spring MVC,第一步就是使用Spring提供的前置控制器,即Servlet的实现类DispatcherServlet拦截url:org.springframework.web.servle ...

  4. Ionic3 Demo

    本文为原创文章,转载请标明出处 最近又开源了一个小 Demo,基于 Ionic 3.9.2.注册登录功能使用的是 WildDog 野狗通信云,大家可以放心的注册登录玩.电影相关数据来源自"某 ...

  5. toString()和强制类型转换(String)的用法

    原来是String类型的才可以强转到String,不然会报 ClassCastException异常: 所有的引用类型都从Object类继承了toString方法.

  6. Java如何打印日志

    以下为<正确的打日志姿势>学习笔记. 什么时候打日志 1.程序出现问题,只能通过 debug 功能来定位问题,很大程度是日志没打好.良好的系统,通过日志就能进行问题定位. 2.if-els ...

  7. R (Ani Katchova) · Eric

    首先介绍一下Ani Katchova的R教程,然后再继续总结Advanced R. R introduction setwd("path")设置工作路径 mydata<-re ...

  8. “代码量统计脚本”

    概述 本文从一段统计C/C++程序脚本入手,记录shell脚本常用和重要的知识点. 代码量统计程序 文件名称,count_code_line.sh 12345678910111213141516171 ...

  9. 当iPhone用上联发科,你还会爱上它吗?

    ​ ​ 对于苹果来说,现在正在经历史上罕见的"冰火两重天"境遇.一方面是iPhone 8系列的售价以让人瞠目结舌的速度暴跌,另一方面则是史上售价最高的iPhone X遭遇疯抢,销量 ...

  10. 分布式系统一致性问题与Raft算法(上)

    最近在做MIT6.824的几个实验,真心觉得每一个做分布式相关开发的程序员都应该去刷一遍(裂墙推荐),肯定能够提高自己的技术认知水平,同时也非常感谢MIT能够把这么好的资源分享出来. 其中第二个实验, ...