《算法设计与分析》一一3.3 习题

3.3 习题

3.1 请采用数学归纳法证明插入排序(算法5)的正确性。
3.2 (冒泡排序) 冒泡排序(算法6)对数组A[1..n]中的元素进行排序。算法6:BUBBLE-SORT(A[1..n])
1 for i∶=n downto 2 do
2 for j∶=1 to i-1 do
3 if A[j]>A[j+1] then
4 SWAP(A[j], A[j+1]);1) 请证明冒泡排序的正确性。
2) 请分析冒泡排序的最坏情况、平均情况时间复杂度。(注:我们以元素的比较为关键操作,数组元素的交换不计入关键操作。)
3) 我们可以改进冒泡排序来避免在数组尾部进行的不必要的比较操作,具体做法是记录每次循环中最后发生元素交换的位置。假设最后一次元素交换发生在A[k]和A[k+1]之间,则记录下这一位置。未来的数组遍历就不用再扫描下标k之后的元素。请说明这样的做法是否会影响算法的最坏情况和平均情况时间复杂度。
3.3 假设有一堆数量为n的大小互不相同的煎饼,现在需要对这些煎饼排序,使得小的煎饼放在大的煎饼上面。仅可以使用的操作是用一个锅铲插入到最上面的k(1≤k≤n)个煎饼下面,然后将它们一起翻转过去。图3.2给出一个翻转最上面两块煎饼的例子。请针对该问题设计算法,证明算法的正确性,并分析算法的时间复杂度。
图3.2 翻转最上面的两块煎饼
3.4 给定一个数列〈a1,a2,…,an〉,PREVIOUS-LARGER算法对数列中的每个元素ai(1≤i≤n),找到序列中位于ai左边且值比ai大的元素。如果存在多个这样的元素,须返回最右边元素的下标;如果不存在这样的元素,则返回特殊值0。1 Algorithm:PREVIOUS-LARGER(A[1..n])
2 for i∶=1 to n do
3 j∶=i-1;
4 while j>0 and A[j] do
5 j∶=j-1;
6 p[i]∶=j;7 return p[1..n];导致该算法效率不高的一个原因是语句“j∶=j-1”,它使得我们的寻找每次只能向前推进一个元素。可以考虑利用前面已经得到的数组p[1..n]中的值来提高算法的效率。请利用这个提示设计一个复杂度为Θ(n)的算法,证明算法的正确性,并分析算法的时间复杂度。
3.5 假设现在需要颠倒句子中的所有单词的顺序,例如“My name is Chris”,颠倒句子中的所有单词得到“Chris is name My”。请设计一个算法解决该问题,并分析算法的时间和空间复杂度。
3.6 (微博名人问题) 给定n个人。我们称一个人为“微博名人”,即他被其他所有人微博关注,但是自己不关注任何人。为了从给定的n个人中找出名人,唯一可以进行的操作是:针对两个人A和B,询问“A 是否微博关注B”。答案只可能是YES(A关注B)或者NO(A不关注B)。
1) 在一群共n个人中,可能有多少个名人?
2) 请设计一个算法找出名人(你可以很容易地得出一个基于遍历的算法,然后尝试改进它)。
3.7 (最大和连续子序列) 给定一个由一些整数组成的序列S,请找出和最大的连续子序列。例如,S={-2,11,-4,13,-5,-2},得到的结果应为20=11-4+13。
1) 你可以基于简单遍历数组元素,设计一个复杂度为O(n3)的算法。
2) 改进上述算法中的冗余计算,你可以得到一个复杂度为O(n2)的基于遍历的算法。
3) 基于分治策略(详见第三部分的讨论),你可以设计一个复杂度为O(n log n)的算法。
4) 分析遍历算法中的冗余计算,你可以设计一个复杂度为O(n)的算法。
5) 基于动态规划策略(详见第五部分的讨论),你同样可以得到一个复杂度为O(n)的动态规划算法。

时间: 2024-08-19 04:38:34

《算法设计与分析》一一3.3 习题的相关文章

《算法设计与分析》一一2.1 数学运算背后的算法操作

2.1 数学运算背后的算法操作 虽然我们已经熟知很多数学概念与性质,但是从算法设计与分析的角度来看,还需要进一步将这些数学的概念与算法的运作联系起来.下面就从这一角度来讨论几组算法设计与分析中常用的数学概念与性质.2.1.1 取整x和x 我们熟知取整函数的定义:下取整函数x表示不超过x的最大整数:上取整函数x表示不小于x的最小整数.需要取整函数的本质原因在于算法分析中涉及的一些量往往是某种离散对象的个数,它必然是正整数.例如,算法的代价是关键操作的个数,问题的规模经常表示为输入元素的个数.输入数

屈婉玲-算法设计与分析课后习题答案

问题描述 算法设计与分析课后习题答案 需要算法设计与分析屈婉玲课后习题答案,希望哪位大神帮帮忙!大恩不言谢 解决方案 算法设计与分析课后习题3.2算法设计与分析课后习题3.5数据结构与算法分析课后习题第四章(1) 解决方案二: http://download.csdn.net/download/xiaomashengjie/6828333 不谢~

《算法设计与分析》一一导读

前言 算法是计算的灵魂(spirit of computing),而算法设计与分析的基础知识是计算机科学的基石.算法设计与分析的知识内容很丰富,可以从不同视角进行组织与阐述.一种视角是关注经典的算法问题,如排序.选择.查找.图遍历等:另一种视角是关注经典的算法设计策略,包括分治.贪心.动态规划等.本书的组织兼顾问题与策略两种视角.首先按照经典的算法设计策略,将书中的主体内容分为遍历.分治.贪心.动态规划4个部分.其次在每个部分之内,又围绕经典的算法问题来阐述该部分所着重讨论的策略. 本书集中讨论

《算法设计与分析》一一第3章 线性表的遍历

第3章 线性表的遍历 线性表是一种简单又广泛使用的数据结构.线性表中所有的元素组成线性序列.除头尾之外的每个元素都有唯一的前驱和后继:头元素只有后继,没有前驱,而尾元素只有前驱,没有后继.线性表的特征决定了我们很容易从头至尾依次扫描其中的每一个元素,而这一简单的遍历过程可以解决很多重要的算法问题. 线性表的遍历是在算法的简单性与高效性之间的一种权衡.基于线性表遍历的算法往往原理简单.易于实现和维护:但是其效率往往较低,有较大的提升空间.以线性表遍历为基础,我们可以进行更复杂的算法设计,例如,以遍

《算法设计与分析》一一第2章 从算法的视角重新审视数学的概念

第2章 从算法的视角重新审视数学的概念 CHAPTER 2 第2章 从算法的视角重新审视数学的概念根据我们在第1章中对抽象算法设计与分析的讨论,算法的本质是预先给定的一组指令的排列组合:而算法分析是对指令的执行和存储单元的使用等离散现象的计数.源于算法的这一本质属性,我们需要熟练掌握相应的数学知识为抽象算法设计与分析服务.这些数学知识往往是我们已经学习过的,现在的重点是要从抽象算法设计与分析的角度来重新审视它们.本章首先讨论算法设计与分析中常用的数学对象与数学性质.其次,为了进一步讨论算法代价的

动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中

问题描述 动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中 列表并至少给出4步典型过程,求文本串"Do you like those people who always think of money and cannot remember the past."在列宽为15,惩罚函数为行空余空间的平方(最后一行不计惩罚)时的最优分行方案.不需要给出具体的实现代码.用动态规划算法给出列表

概率-算法设计与分析基础》书上看到的一道练习题

问题描述 算法设计与分析基础>书上看到的一道练习题 2C 丢失的袜子:假设在洗了5双各不相同的袜子以后,你发现有两只袜子不见了且每只袜子丢失的概率都相同,请找出最佳情况(留下四双完整袜子)的发生概率和最差情况(留下三双完整袜子)的发生概率以及平均情况下的概率. 解决方案 最佳情况发生的概率: C(51)/C(210) = 1/9最差情况发生的概率: 1 - 1/9 = 8/9 (因为非4即3),即:1-C(51)/C(102).顶多丢2双.期望: 4×(1/9)+ 3×(8/9) = 28/9

算法设计与分析 (希望答案能具体点)

问题描述 算法设计与分析 (希望答案能具体点) 设S1S2..Sk是整数集合每个集合Si(1<=i<=k)中整数取值范围是1到n且(求和 符号)|Si|=n试设计一个算法在O(n)时间内将S1S2..Sn分别排序.答案说用桶排序或者基数排序,有大神能快点解决么 解决方案 就用基数排序好了int sort(int * data int n){ int temp[k + 1]; for (int i = 1; i <=k; i++) temp[i] = 0; for (int i = 0;

《算法设计与分析》一一2.3 “分治递归”求解

2.3 "分治递归"求解 递归是一种基本的算法设计方法,而递归算法的代价往往可以用递归方程来描述,因而解递归方程就成为递归算法分析的重要技术.分治策略(divide and conquer)是一种简单而有效的算法设计策略(详见第三部分各章节的讨论),源自于分治算法分析的一类特定形式的递归方程我们称之为"分治递归"(divide and conquer recursion).本节着重讨论"分治递归"的求解方法.2.3.1 替换法 有一种"

《算法设计与分析》一一1.2 抽象算法设计

1.2 抽象算法设计 算法设计源于我们面临一个有待解决的算法问题.为此,我们首先讨论算法问题的严格定义,其次讨论算法设计,主要讨论证明算法正确性的基本方法.1.2.1 算法问题规约 基于RAM模型,我们主要讨论这样的算法:它接受有限的数据作为输入,进行相应的处理,在有限步内终止,并给出输出.因此我们可以将算法问题严格地定义为精确限定输入/输出的"规约"(specification)形式. 定义1.1(算法问题规约) 一个算法问题的规约主要包括两部分: ●输入:明确规定了算法接受的所有合