[练习3.17] 不同于我们已经给出的删除方法,另一种是使用懒惰删除的方法. 为了删除一个元素,我们只标记上该元素被删除的信息(使用一个附加的位域). 表中被删除和非被删除的元素个数作为数据结构的一部分被保留. 如果被删除元素和非被删除元素一样多,我们就遍历整个表,对所有被标记的节点执行标准的删除算法. a.列出懒惰删除的优点和缺点. b.编写实现使用懒惰删除的标准链表操作的例程. Answer: a:优点——思想简单粗暴易于理解,误删可有恢复空间 缺点——需要额外的域且节点不及时释放,需要更多…
第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀.每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点. ○代码分散: 以日志需求为例,只是为了满足这个单一需求,就不得不在多个模块(方法)里多次重复相同的日志代码.如果日志需求发生变化,必须修改所有模块. 动态代理 代理设计模式的原理:使用…
第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰.但在这片浩荡的波动里,有一门技术从未消失,甚至"老当益壮",那就是 SQL. 45 年前,也就是 1974 年,IBM 研究员发布了一篇揭开数据库技术的论文<SEQUEL:一门结构化的英语查询语言>,直到今天这门结构化的查询语言并没有太大…
文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入etcd 1.3.4.配置flannel为systemctl管理 1.3.5.分发flannel证书和启动文件到所有节点 1.3.6.配置并启动flannel服务 1.3.7.查看已分配的pod网段列表 1.3.8.查看各节点是否都存在flannel网卡 suse 12 二进制部署 Kubernetes…
第四章习题:二叉查找树类实现懒惰删除,注意findMin()和findMax()(递归) 算是发布的第一篇学习笔记.也不敢保证写的代码一定正确,错了的地方请大家指正,谢谢. 直接开始吧.先谈谈数据结构,二叉查找树懒惰删除较于一般的二叉查找树,多了一些域:theSize(剩下的节点数).deletedSize(懒惰删除的节点数).BinaryNode<AnyType> min,max(用于保留在findMin和findMax方法中递归查询到的flag!=1的最值点):在内部节点类中,多了一个by…
基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以单个数据结构为单位放在一个文档里面. [未做习题] 习题3.1:编写打印出一个单链表的所有元素的程序. //这题例程里就有了,没必要单独开. 习题3.10:………………(题目太长懒得打,约瑟夫环问题). //这里应该是做循环链表,但是约瑟夫环本身可以用数学方法优化用循环链表做效率还挺低的,于是放弃.…
[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空间有限,入队需要检测数组是否已经满 ②.数组经过几次操作后,rear可能绕回front前面,所以许多操作都要用模来实现. 测试代码: #include <iostream> #include "queue.h" using namespace std; using namesp…
[练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中的伪代码程序段.过程Delete删除位置j上的元素并使表破坏. a.解释该过程是如何工作的 b.利用一般的表操作重写这个过程 c.如果用标准的数组实现,则这个过程的运行时间是多少? d.使用链表实现的时间是多少? e.给出一个算法以O(NlogN)时间解决问题 f.证明:如果只使用比较,那么解决该问…
[练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. Inject(X,D):将项X插入到双端队列D的尾端. Eject(D):从双端队列D中删除尾端项并返回. 编写支持双端队列的例程,每种操作均花费O(1)时间. Answer: 相当简单的题目,把改一改双向链表就可以了. 测试代码: #include <iostream> #include &q…
[练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果我们加入第四种操作DeleteMin,那么至少有一种操作必须花费Ω(logN)时间. [练习3.23] 说明如何用一个数组实现三个栈. [练习3.24] 在2.4节中用于计算斐波那契的递归例程如果在N=50下运行,栈空间有可能用完吗,为什么? Answer: [练习3.22] a.最简单的想法就是再…