算法导论第二章练习参考答案

2.1-3 考虑以下查找问题:

输入:n个数的一个序列A=<a1,a2,⋯ ,an>A=<a_1,a_2,\cdots,a_n>A=<a1,a2,,an>和一个值vvv

输出:下标iii使得A[i]=vA[i]=vA[i]=v或者当vvv不在AAA中出现时,vvv为特殊值NILNILNIL

写出线性查找的伪代码,它扫描整个序列来查找vvv。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。

LINEARSEARCH(A,v)
	for i=1 to A.length
		if A[i]==v
			return i
	return NIL

循环不变式:子数组中不存在vvv

初始化:i=1i=1i=1时,子数组为空数组中不存在vvv

保持:当迭代到第iii步时,如果A[i]≠vA[i]\neq vA[i]=vA[1…i]A[1\dots i]A[1i]中不存在vvv,循环不变式保持,如果A[i]=vA[i]=vA[i]=v循环不变式终止。

终止:当循环终止时,i=A.length+1i=A.length+1i=A.length+1,数组A[1…n]A[1\dots n]A[1n]中不存在vvv

2.1-4 考虑把两个nnn为二进制数加起来的问题,这两个整数分别存储在两个nnn元数组AAABBB中。这两个整数的和应按二进制形式存储在一个(n+1)(n+1)(n+1)元数组CCC中。请给出该问题的形式化描述,并写出伪代码。

数组AAABBB最高位存储在A[1]A[1]A[1]B[1]B[1]B[1]中,从i=A.lengthi=A.lengthi=A.lengthi=1i=1i=1C[i]=A[i]+B[i]+KC[i] =A[i]+B[i]+KC[i]=A[i]+B[i]+K,其中K为进位,最后把进位KKK赋给C[1]

ADD(A,B)
    let C[1...n+1] be a new array
    K=0
    for i=A.length downto 1
        C[i+1]=A[i]+B[i]+K
        if C[i+1]==2
        	C[i+1]=0
        	K=1
        else
        	k=0
    C[1]=K
    return C

2.2-2 考虑排序存储在数组AAA中的nnn个数:首先找出AAA中的最小元素并将其与A[1]A[1]A[1]中的元素进行交换。接着,找出

AAA中次最小的元素,并将其与A[2]A[2]A[2]中的元素进行交换。对AAA中的前n−1n-1n1个元素按该方式继续。该算法成为选择算法,写出其伪代码。该算法维持循环不变式是什么?为什么它只需要对前n−1n-1n1个元素,而不是对所有nnn个元素运行?用Θ\ThetaΘ记号给出线性查找的平均情况和最坏情况运行时间。证明你的答案。

目录(Table of Contents)   前言(Preface)   第一部分(Part I) 基础(Foundations)   第一章 计算中算法的角色(The Role of Algorithms in Computing)   第二章 开始(Getting Started)   第三章 函数的增长率(Growth of Functions)   第四章 递归(Recurrences)   第五章 概率分析与随机化算法(Probabilistic Analysis and Randomized Algorithms)   第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics)   第六章 堆排序(Heapsort)   第七章 快速排序(Quicksort)   第八章 线性时间中的排序(Sorting in Linear Time)   第九章 中值与顺序统计(Medians and Order Statistics)   第三部分(Part III) 数据结构(Data Structures)   第十章 基本的数据结构(Elementary Data Structures)   第十一章 散列表(Hash Tables)   第十二章 二叉查找树(Binary Search Trees)   第十三章 红-黑树(Red-Black Trees)   第十四章 扩充的数据结构(Augmenting Data Structures)   第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques)   第十五章 动态规划(Dynamic Programming)   第十六章 贪婪算法(Greedy Algorithms)   第十七章 分摊分析(Amortized Analysis)   第五部分(Part V) 高级的数据结构(Advanced Data Structures)   第十八章 B-树(B-Trees)   第十九章 二项式堆(Binomial Heaps)   第二十章 斐波纳契堆(Fibonacci Heaps)   第二十一章 不相交集的数据结构(Data Structures for Disjoint Sets)   第六部分(Part VI) 图算法(Graph Algorithms)   第二十二章 基本的图算法(Elementary Graph Algorithms)   第二十三章 最小生成树(Minimum Spanning Trees)   第二十四章 单源最短路径(Single-Source Shortest Paths)   第二十五章 全对的最短路径(All-Pairs Shortest Paths)   第二十六章 最大流(Maximum Flow)   第七部分(Part VII) 精选的主题(Selected Topics)   第二十七章 排序网络(Sorting Networks)   第二十八章 矩阵运算(Matrix Operations)   第二十九章 线性规划(Linear Programming)   第三十章 多项式与快速傅里叶变换(Polynomials and the FFT)   第三十一章 数论算法(Number-Theoretic Algorithms)   第三十二章 字符串匹配(String Matching)   第三十三章 计算几何学(Computational Geometry)   第三十四章 NP-完备性(NP-Completeness)   第三十五章 近似算法(Approximation Algorithms)   第八部分(Part VIII) 附录:数学背景(Mathematical Background)   附录A 求和(Summations)   附录B 集合,等等。(Sets, Etc.)   附录C 计数与概率(Counting and Probability)   参考文献(Bibliography)   索引(Index)
算法导论》一书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。   《算法导论》一书内容丰富,对本科生的数据结构课程和研究生的算法课程都是很实用的教材。本书在读者的职业生涯中,也是一本案头的数学参考书或工程实践手册。   在有关算法的书中,有一些叙述非常严谨,但不够全面,另一些涉及了大量的题材,但又缺乏严谨性。《算法导论》将严谨性和全面性融为一体。   《算法导论》一书深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系,可以作为独立的学习单元。算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值