《Python算法教程》——2.7 练习题

2.7 练习题

2-1. 当我们用Python中的list构建一个多维数组时,通常需要使用循环来完成(或某种与list推导式等效的技术),为什么不能用表达式[[0]10]10来创建一个10×10的数组呢?这样做会有什么问题吗?

2-2. 让我们来做个假设(也许会有点不切实际):如果我们允许在分配内存时出现未初始化的情况(也就是说,这块内存中还保有上一次被使用时留下的“垃圾数据”),并且分配内存也只需要常数时间。这时如果您想创建一个含有n 个整数的数组,并且希望跟踪其每一项——看看它是处于非初始化状态,还是您已经在它里面保存过一个数字了。这种检查操作也是可以在常数时间内完成的。那么,我们究竟应该怎样做,才能保证它在常数时间内完成它的初始化操作呢?(以及应该如何在常数时间里完成一个空邻接数组的初始化操作,以避免其成为一个以平方级时间为最小运行时间的操作?)

2-3. 请证明O 与Ω的性质正好相反,即如果f = O (g ),那么g = Ω(f ),反之亦然。

2-4. 对数通常有各自不同的底数,但在算法学上,我们往往并不会太在意它。为了明白其中的原因,我们可以来考虑一下这个等式:logbn= (logan )/(logab)。首先,您知道这个等式为什么成立吗?其次,为什么它能告诉我们不需要去操心对数的底数问题?

2-5. 请证明任何指数级操作(Θ(kn ),其中k > 1)的增长都要快于多项式级操作(Θ(nj ),其中j > 0)。

2-6. 请证明任何多项式操作(Θ(nk ),其中k 为任意常数且k > 0)的渐近增长都要快于对数级操作(Θ(lg n ))。(值得注意的是,这里的多项式中包括根数在内,如平方根(k = 0.5)等)。

2-7. 请研究或推算一下Python list类型上各个操作的渐近复杂度,如索引、元素项赋值、顺序反转、元素的追加及插入(最后两项我们在list的黑盒子专栏中已经讨论过了)。如果我们改用链表类型来实现这些操作会有什么不同?请以list.extend为例加以说明。

2-8. 请证明表达式Θ(f ) + Θ(g ) = Θ(f + g ) and Θ(f ) · Θ(g ) = Θ(f · g )成立。另外,您也可以试试是否能证明max(Θ(f ), Θ(g )) = Θ(max(f , g )) = Θ(f + g )成立。

2-9. 在附录C中,您会找到一组与树有关的、带编号的陈述句,请证明它们是等效的。

2-10. 假设T 是一棵有根树,它至少应包含三个节点,并且每个内部节点下面又正好都有两个子节点。那么,如果T 上有n 个叶节点,树上到底应有多少个节点呢?

2-11. 请证明一个DAG可以由任何形式的(底层)结构组成。换言之,任何(无向)图结构都可以成为一个DAG的底层图结构。或者说,对于任何给定的图结构,我们都可以通过调整其边线方向,从中产生出一个有向图,而它正好是一个DAG。

2-12. 请考虑下面这种图结构的表示法:我们使用字典类型,设置其每个键为两个节点的元组,然后将该元组的值设置为边的权值,如W[u, v] = 42。请问:该表示法有什么优点和缺点?您有办法弥补这些缺点吗?

时间: 2024-07-30 16:56:29

《Python算法教程》——2.7 练习题的相关文章

《Python算法教程》——1.7 练习题

1.7 练习题 和上面一样,这一节也是我们今后将会反复看到的固定章节.读者可在本书后面(附录D)找到关于这些练习题的提示.这些练习题是为了配合正文内容而设定的,它们主要针对的是那些正文中没有明确讨论,但又可能会引起读者兴趣或值得读者深思的问题.不过,如果您真的想提升自己在算法设计方面的技能的话,或许还需要多多参与解决本书以外的各种编程难题.如参加大量的编程竞赛活动(通过网页搜索应该就能找到许多),里面有许多问题都是值得一试的.除此之外,许多大型软件公司也会在线上不时发布一些用于资格认证的试题,您

《Python算法教程》——2.4 请提防黑盒子

2.4 请提防黑盒子 虽然算法工作本身通常都相当抽象,但我们在实现自己的算法时还是要留些心眼.因为在编程时,我们必须依赖一些组件,而这些组件通常都不是我们自己写的,所以依赖于这些"黑盒子",而不知道其任何内容对我们来说多少是一种风险.在这本书中,您将会看到一系列被标识为"黑盒子"的侧边栏.在这些侧边栏中,我们将会简略讨论Python某些部分中的各种可用的算法.这里既有语言内置的,也有属于标准库的.我们会将它们都包括进来,因为这些算法是非常有意义的,它们能告诉我们Py

《Python算法教程》——导读

前 言 这本书结合了我的三大爱好:算法.Python编程及诠释事物.对我来说,这三项都是美学问题--找出让事情尽善尽美的方法.这就需要我们首先去发现相关事物的精华所在,然后精雕细琢,使其发光发亮,或至少比原先要闪亮一些.当然,由于某些材料表面的杂质太多,加工的结果可能会有些不尽人意.但幸运的是,本书中所涉及的内容大多都是现成品,因为我所写的都是一些久负盛名的算法及其论证,采用的也是最受欢迎的编程语言之一.至于在诠释事物方面,我一直在努力试着让事情变得尽可能显而易见一些.但即便如此,我也肯定还有许

《Python算法教程》——2.6 如果您感兴趣

2.6 如果您感兴趣 如果想了解有关图灵机以及计算领域方面更多基础知识的话,或许您会喜欢Charles Petzold写的那本<The Annotated Turing>.尽管该书在结构上依然只是Turing原始论文的一个注释版本,但其大部分内容实际上是Petzold本人对那些主要概念所做的诠释说明,里面含有大量的实例.总之,他对这个话题做了一个非常好的阐述.至于在计算领域的基础教科书方面,您可以看看Lewis与Papadimitriou合作的<Elements of the Theor

《Python算法教程》——2.2 渐近记法

2.2 渐近记法 还记得第1章中那个拿append与insert做对比的例子吗?似乎是出于某种原因,当我们选择将相关元素项添加到list尾端时,其在应对list大小变化时的性能弹性要比在其首端插入要好一些(关于list,读者稍后可以参考黑盒子专栏中的相关内容).而且,这些内置操作通常还都是用C编写的.如果我们花点时间用纯Python重新实现一下list.append方法,(粗略)估计新版本会比原版本慢50倍左右.并且我们还可以做进一步估计,相较于这个较慢的.纯Python实现的append方法在

《Python算法教程》——1.4 本书主要内容

1.4 本书主要内容 本书大体结构如下. 第1章 引言:这章您目前已经读了大半了,主要是对本书内容做一个预览. 第2章 基础知识:这章主要涉及一些基本的概念与术语,以及一些基本的数学运算.除此之外,我们还会介绍一些比以往任何时候都要模糊的计算公式,并试图用它们来获取正确的结果.这就是所谓的渐近记法. 第3章 计数初步:这章会涉及更多数学运算--但这些运算真的很有趣,我保证!主要是一些用于算法运行时间分析的基本组合运算,以及对递归与递推关系的概念性介绍. 第4章 归纳.递归及归简:标题中的这三个词

《Python算法教程》——1.2 为什么要读这本书

1.2 为什么要读这本书 当我们在工作中使用算法时,通常都是希望能更有效地解决问题.使程序运行得更快,并且让解决方案变得更为简短.但实际情况如何呢?我们获得所需要的效率.速度和简洁性了吗?为什么人们在使用Python这种语言时依然要在乎这些事呢?选择这种语言对于追求高速度的人来说是一个好的开端吗?为什么不选择C或Java这样的语言呢? 首先,可能是因为Python语言本身很讨人喜欢,以至于人们不想换别的语言,或者他们目前也没有更好的选择.但最为重要的可能还是第二点,即在这里,算法设计者们首先要担

《Python算法教程》——第1章 引言 1.1 这是一本怎么样的书

第1章 引言 1.提出问题. 2.思考真正困难所在. 3.提出解决方案. --摘自<The Feynman Algorithm>,Murray Gell-Mann著 让我们先来考虑一下下面这个问题:我们想要访遍瑞典境内所有的城市.小镇和村庄,然后再返回出发地点.显然,这段旅程肯定要耗费掉不少时间(毕竟我们要访问24 978个地方),因而我们希望能最小化该旅行路线.也就是说,我们既要能按计划逐个参观这些地方,又要尽可能地走出一条最短路线来.作为一个程序员,我们当然不屑于用手工方式来设计该路线,显

《Python算法教程》——第2章 基础知识 2.1 计算领域中一些核心理念

第2章 基础知识 Tracey:我不知道您在哪里. Zoe:隐身术就是这样--您应该听说过的. Tracey:我可不认为这属于基础知识. --选自<Firefly>第14集台词 在我们将注意力转向本书主体内容,也就是那些数学技术.算法设计原则及经典算法之前,还必须先了解一些最基本的技术与原则.因为当您阅读到后续章节时,至少应该非常清楚类似"无反向环路的加权有向图"以及"Θ(n lg n)运行时间"这些词句所表达的具体含义.同时,我们也理应要对Python