算法导论
文章平均质量分 84
yangtzhou
这个作者很懒,什么都没留下…
展开
-
算法导论 — 9.1最小值和最大值
算法导论 9.1 - 最小值和最大值原创 2023-02-04 20:12:42 · 1357 阅读 · 0 评论 -
算法导论 — 思考题4-3 更多的递归式例子
(更多的递归式例子)对下列每个递归式,给出T(n)T(n)T(n)的渐近上界和下界。假定对足够小的nnn,T(n)T(n)T(n)是常数。给出尽量紧确的界,并验证其正确性。 a. T(n)=4T(n/3)+nlgnT(n)=4T(n/3)+n{\rm lg}nT(n)=4T(n/3)+nlgn b. T(n)=3T(n/3)+n/lgnT(n)=3T(n/3)+n/{\rm lg}nT(n)=3T(n/3)+n/lgn c. T(n)=4T(n/2)+n2nT(n)=4T(n/2)+n^2\sq原创 2020-08-27 23:46:07 · 3808 阅读 · 4 评论 -
算法导论 — 思考题4-2 参数传递代价
(参数传递代价)我们有一个贯穿本书的假设——过程调用中的参数传递花费常量时间,即使传递一个NNN个元素的数组也是如此。在大多数系统中,这个假设是成立的,因为传递的是指向数组的指针,而非数组本身。本题讨论三种参数传递策略: 1. 数组通过指针来传递。时间 = Θ(1)Θ(1)Θ(1)。 2. 数组通过元素复制来传递。时间 = Θ(N)Θ(N)Θ(N),其中NNN是数组的规模。 3. 传递数组时,只复制过程可能访问的子区域。若子数组A[p..q]A[p..q]A[p..q]被传递,则时间 = Θ(q原创 2020-06-22 22:48:30 · 829 阅读 · 0 评论 -
算法导论 — 思考题4-1 递归式例子
(递归式例子)对下列每个递归式,给出T(n)T(n)T(n)的渐近上界和下界。假定n≤2n ≤ 2n≤2时T(n)T(n)T(n)是常数。给出尽量紧确的界,并验证其正确性。 a. T(n)=2T(n/2)+n4T(n)=2T(n/2)+n^4T(n)=2T(n/2)+n4 b. T(n)=T(7n/10)+nT(n)=T(7n/10)+nT(n)=T(7n/10)+n c. T(n)=...原创 2020-04-21 19:53:34 · 13035 阅读 · 0 评论 -
算法导论 — 4.5 用主方法求解递归式
笔记利用主定理可以对形如T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n)T(n)=aT(n/b)+f(n)的递归式直接求解。下面先给出主定理的描述。 令a≥1a ≥ 1a≥1和b>1b > 1b>1是常数,f(n)f(n)f(n)是一个函数,T(n)T(n)T(n)是定义在非负整数上的递归式: T(n)=aT(n/b)+f(n)T(n...原创 2020-04-16 01:12:54 · 5671 阅读 · 1 评论 -
算法导论 — 4.4 用递归树方法求解递归式
笔记在应用代入法求解递归式时,需要事先做出一个好的猜测。然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法。在递归树中,每个结点表示一个单一子问题的代价。创建递归树之后,对树的每层的各子问题的代价进行求和,得到每一层的代价,然后将所有层的代价加起来,得到整棵递归树的总代价,这个总代价就是递归式的解。当然,递归树方法是一种粗略的方法,因为递归树会引入一些“不精确”因素,这一点在后文再详...原创 2020-04-06 11:51:20 · 16055 阅读 · 6 评论 -
算法导论 — 4.3 用代入法求解递归式
笔记代入法求解递归式分为两步: 1) 猜测解的形式。 2) 用数学归纳法证明猜测的解是正确的。 例如,我们要确定递归式T(n)=2T(⌊n/2⌋)+nT(n)=2T(⌊n/2⌋)+nT(n)=2T(⌊n/2⌋)+n的上界。我们猜测其解为T(n)=O(nlgn)T(n) = O(n{\rm lg}n)T(n)=O(nlgn),这意味着存在正常数ccc和n0n_0n0,使得T(n)≤c...原创 2020-03-31 16:54:13 · 5139 阅读 · 2 评论 -
算法导论 — 4.2 矩阵乘法的Strassen算法
笔记给定两个n×nn×nn×n正方矩阵AAA和BBB,这两个矩阵的乘法定义为 其中 下面是矩阵乘法的伪代码。 很显然,执行SQUARE-MATRIX-MULTIPLY需要花费Θ(n3)Θ(n^3)Θ(n3)时间。然而,有一种方法可以花费更少的时间,这就是Strassen算法,它本质上也是一种分治法,它的时间复杂度为Θ(nlg7)=O(n2.81)Θ(...原创 2020-03-23 11:18:58 · 6589 阅读 · 5 评论 -
算法导论 — 4.1 最大子数组问题
笔记本节给出了分治法的一个例子。给定一个数组A[1..n]A[1..n]A[1..n],找出一个元素和为最大的连续子数组A[i..j]A[i..j]A[i..j],其中1≤i≤j≤n1 ≤ i ≤ j ≤ n1≤i≤j≤n,称这样的子数组为最大子数组。例如,下图所示数组中,第888个元素到第111111个元素之间的子数组为最大子数组。 求解最大子数组问题,最简单的方法是暴力检查所有的子...原创 2020-03-16 23:50:47 · 1695 阅读 · 0 评论 -
算法导论 — 思考题8-6 合并有序列表的下界
(合并有序列表的下界)合并两个有序列表是我们经常会遇到的问题。作为MERGE-SORT的一个子过程,我们在2.3.1节中已经遇到过这一问题。对这一问题,我们将证明在最坏情况下,合并两个都包含nnn个元素的有序列表所需的比较次数的下界是2n−12n−12n−1。 首先,利用决策树来说明比较次数有一个下界2n−o(n)2n−o(n)2n−o(n)。 a. 给定2n2n2n个数,请算出共有多少种...原创 2020-03-01 21:57:10 · 589 阅读 · 0 评论 -
算法导论 — 思考题8-5 平均排序
(平均排序)假设我们不是要完全排序一个数组,而只是要求数组中的元素在平均情况下是升序的。更准确地说,如果对所有的i=1,2,…,n−ki = 1, 2, …, n−ki=1,2,…,n−k有下式成立,我们就称一个包含nnn个元素的数组AAA为kkk排序的(kkk-sorted): ∑j=ii+k−1A[j]k≤∑j=i+1i+kA[j]k\frac{\sum_{j=i}^{i+k-1}...原创 2020-02-27 21:42:33 · 755 阅读 · 0 评论 -
算法导论 — 思考题8-4 水壶
(水壶)假设给了你nnn个红色的水壶和nnn个蓝色的水壶。它们的形状和尺寸都各不相同。所有红色水壶的容量都不一样多,蓝色水壶也是如此。而且,对于每一个红色水壶来说,都有一个对应的蓝色水壶,两者容量相等;反之亦然。 你的任务是找出所有的容量相等的红色水壶和蓝色水壶,并将它们配成一对。为此,可以执行如下操作:挑出一对水壶,其中一个是红色的,另一个是蓝色的,将红色水壶中倒满水,再将水倒入蓝色水壶中。...原创 2020-02-20 01:21:05 · 1182 阅读 · 2 评论 -
算法导论 — 思考题8-3 变长数据项的排序
(变长数据项的排序) a. 给定一个整数数组,其中不同的整数所包含的数字的位数可能不同,但该数组中,所有整数中包含的总数字位数为nnn。设计一个算法,使其可以在O(n)O(n)O(n)时间内对该数组进行排序。 b. 给定一个字符串数组,其中不同的字符串所包含的字符数可能不同,但所有字符串中的总字符个数为nnn。设计一个算法,使其可以在O(n)O(n)O(n)时间内对该数组进行排序。(注意:...原创 2020-02-04 13:17:55 · 1443 阅读 · 3 评论 -
算法导论 — 思考题8-2 线性时间原址排序
(线性时间原址排序)假设有一个包含nnn个待排序数据记录的数组,且每条记录的关键字的值为000或111。对这样一组记录进行排序的算法可能具备如下三种特性中的一部分: 1. 算法的时间代价是O(n)O(n)O(n)。 2. 算法是稳定的。 3. 算法是原址排序,除了输入数组之外,算法只需要固定的额外存储空间。 a. 给出一个满足上述条件1和条件2的算法。 b. 给出一个满足上述条...原创 2020-01-27 21:07:09 · 624 阅读 · 1 评论 -
算法导论 — 思考题8-1 比较排序的概率下界
(比较排序的概率下界)在这一问题中,我们将证明对于给定的nnn个互异的输入元素,任何确定或随机的比较排序算法,其概率运行时间都有下界Ω(nlgn)Ω(n{\rm lg}n)Ω(nlgn)。首先来分析一个确定的比较排序算法AAA,其决策树为TATATA。假设AAA的输入的每一种排列情况都是等可能的。 a. 假设TATATA的每个叶结点都标有在给定的随机输入情况下到达该终点的概率。证明:恰有n!n...原创 2020-01-18 22:24:49 · 1281 阅读 · 0 评论 -
算法导论 — 8.4 桶排序
笔记为简化对于桶排序的分析,我们假设nnn个输入数据分布在[0,1)[0, 1)[0,1)区间上。将[0,1)[0, 1)[0,1)区间划分为nnn个相同大小的子区间,这些子区间都称为桶。如果输入数据是均匀分布的,可以预见每个桶所包含的元素个数是近乎均匀的,不太可能出现很多元素都落在同一个桶中的情况。为得到输出,我们先对每个桶中的元素进行排序,然按照次序把每个桶中的元素列出来即可。 在下面桶...原创 2020-01-16 01:14:10 · 1012 阅读 · 1 评论 -
算法导论 — 8.3 基数排序
笔记基数排序的做法为:对一组输入整数,先按最低位数字排好序,然后按次低位数字排好序,如此迭代,直至最后一步按最高位数字排好序,此时所有输入数据已排好序。基数排序要求对单个数字采用的排序算法是稳定的。 以十进制数为例,基数排序算法先按个位数字排序,然后按十位数字排序……直至最后按最高位数字排序。下图给出了一个例子。 下面给出基数排序的伪代码。在下面的代码中,我们假设输入数组AAA包含...原创 2020-01-14 23:25:24 · 975 阅读 · 0 评论 -
算法导论 — 8.2 计数排序
笔记假设输入的nnn个元素中的每一个都是在000 ~ kkk内的一个整数。kkk表示了输入元素所处的范围。一般在kkk远小于nnn时,可以采用计数排序算法。 计数排序的基本思想是:对每一个输入元素xxx,确定小于xxx的元素个数。利用这一信息,可以直接把xxx放到正确的位置。例如,如果有171717个元素小于xxx,则x就应该放在第181818个位置上。 以下为计数排序的伪代码。假设输入...原创 2019-11-21 00:16:44 · 618 阅读 · 0 评论 -
算法导论 — 8.1 排序算法的下界
笔记我们所熟知的插入排序、归并排序、快速排序等排序算法,它们的排序过程都依赖于比较元素间的大小,我们称这些算法为比较排序。本节讨论比较排序算法的运行时间的下界。 给定一个输入序列<a1,a2,…,an><a_1, a_2, …,a_n><a1,a2,…,an>。为简化分析,假定所有输入元素都是互异的。 比较排序可以抽象为一棵决策树。下图决策树展示...原创 2019-11-12 00:24:30 · 1643 阅读 · 0 评论 -
算法导论 — 思考题15-4 整齐打印
(整齐打印)考虑整齐打印问题,即在打印机上用等宽字符打印一段文本。输入文本为nnn个单词的序列,单词长度分别为l1,l2,…,lnl_1, l_2, …, l_nl1,l2,…,ln个字符。我们希望将此段文本整齐打印在若干行上,每行最多MMM个字符。“整齐”的标准是这样的。如果某行包含从第iii个到第j(i≤j)j (i ≤ j)j(i≤j)个的单词,且单词之间的间隔为一个空格符,则行尾的剩...原创 2018-10-27 23:25:01 · 4704 阅读 · 2 评论 -
算法导论 — 思考题7-2 针对相同元素值的快速排序
(针对相同元素值的快速排序)在7.4.2节对随机化快速排序的分析中,我们假设输入元素的值是互异的。在本题中,我们将看看如果这一假设不成立会出现什么情况。 a. 如果所有输入元素的值都相同,那么随机化快速排序的运行时间会是多少? b. PARTITION{\rm PARTITION}PARTITION过程返回一个数组下标qqq,使得A[p..q−1]A[p..q-1]A[p..q−1]中的每...原创 2019-03-23 22:50:08 · 2209 阅读 · 3 评论 -
算法导论 — 思考题7-3 另一种快速排序的分析方法
(另一种快速排序的分析方法)对随机化版本的快速排序算法,还有另一种性能分析方法,这一方法关注于每一次单独递归调用的期望运行时间,而不是比较次数。 a. 证明:给定一个大小为nnn的数组,任何特定元素被选为主元的概率为1/n1/n1/n。利用这一点来定义指示器随机变量Xi=IX_i = IXi=I{第iii小的元素被选为主元},E[Xi]E[X_i]E[Xi]是什么? b. 设T(n)T...原创 2019-03-23 23:55:08 · 488 阅读 · 11 评论 -
算法导论 — 2.3 设计算法
笔记算法设计方法有多种。插入排序使用了增量法:在排序子数组A[1..j−1]A[1..j-1]A[1..j−1]后,将单个元素A[j]A[j]A[j]插入子数组的适当位置,产生排序好的子数组A[1..j]A[1..j]A[1..j]。 本节采用另一种方法,即分治法,同样来完成数组的排序。总的来说,分治法的思想是:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合...原创 2019-03-26 23:29:41 · 687 阅读 · 0 评论 -
算法导论 — 思考题7-4 快速排序的栈深度
(快速排序的栈深度)7.1节中的QUICKSORT算法包含了两个对其自身的递归调用。在调用PARTITION后,QUICKSORT分别递归调用了左边的子数组和右边的子数组。QUICKSORT中的第二个递归调用并不是必须的。我们可以用一个循环控制结构来代替它。这一技术称为尾递归,好的编译器都提供这一功能。考虑下面这个版本的快速排序,它摸拟了尾递归的情况: a. 证明:TAIL−RECURS...原创 2019-03-24 14:18:45 · 1916 阅读 · 0 评论 -
算法导论 — 思考题7-5 三数取中划分
(三数取中划分)一种改进RANDOMIZED-QUICKSORT的方法是在划分时,要从子数组中更细致地选择作为主元的元素(而不是简单地随机选择)。常用的做法是三数取中法:从子数组中随机选出三个元素,取其中位数作为主元(见练习7.4-6)。对于这个问题的分析,我们不妨假设数组A[1..n]A[1..n]A[1..n]的元素是互异的且有n≥3n ≥ 3n≥3。我们用A’[1..n]A’[1..n]A’...原创 2019-03-24 14:32:07 · 1442 阅读 · 0 评论 -
算法导论 — 思考题2-4 逆序对
(逆序对)假设A[1..n]A[1..n]A[1..n]是一个有nnn个不同数的数组。若i<ji < ji<j且A[i]>A[j]A[i] > A[j]A[i]>A[j],则对偶(i,j)(i, j)(i,j)称为A的一个逆序对(inversion)。 a. 列出数组<2,3,8,6,1>&...原创 2019-04-01 21:03:37 · 9290 阅读 · 0 评论 -
算法导论 — 3.1 渐近记号
笔记通常我们分析一个算法,不用去关心它的精确运行时间,而是要研究它的渐近效率。“““渐近”””在这里的意思是,当输入规模足够大时,并且输入规模趋向于∞∞∞时,算法运行时间的增长能体现出某种明显的规律性,即算法的运行时间按照某种特定的规律随输入规模的变大而增长。 在第2章中,我们介绍了两种排序算法:插入排序和归并排序,它们的渐近运行时间分别为Θ(n2)Θ(n^2)Θ(n2)和Θ(nlgn)Θ(...原创 2019-04-02 12:18:34 · 820 阅读 · 1 评论 -
算法导论 — 3.2 标准记号与常用函数
笔记1. 向下取整与向上取整 ⌊x⌋⌊x⌋⌊x⌋是对xxx向下取整,表示小于或等于xxx的最大整数。⌈x⌉⌈x⌉⌈x⌉是对xxx向上取整,表示大于或等于xxx的最小整数。向下取整与向上取整具有以下规律: (1) 对所有实数xxx,有x−1<⌊x⌋≤x≤⌈x⌉<x+1x-1<⌊x⌋≤x≤⌈x⌉<x+1x−1<⌊x⌋≤x≤⌈x⌉&...原创 2019-04-08 17:34:57 · 855 阅读 · 1 评论 -
算法导论 — 思考题3-3 根据渐近增长率排序
(根据渐近增长率排序) a. 根据增长的阶来排序下面的函数,即求出满足g1=Ω(g2),g2=Ω(g3),…,g29=Ω(g30)g_1 = Ω(g_2), g_2 = Ω(g_3), …, g_{29} = Ω(g_{30})g1=Ω(g2),g2=Ω(g3),…,g29=Ω(g30)的函数的一种排序g1,g2,…,g30g_1, g_2, …, g_{30}g1,g2,…,...原创 2019-04-09 22:23:38 · 10947 阅读 · 0 评论 -
算法导论 — 思考题3-4 渐近记号的性质
(渐近记号的性质)假设f(n)f(n)f(n)和g(n)g(n)g(n)为渐近正函数。证明或反驳下面的每个猜测。 a. f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))蕴含g(n)=O(f(n))g(n) = O(f(n))g(n)=O(f(n))。 b. f(n)+g(n)=Θ(min(f(n),g(n)))f(n) + g(n) = Θ({\rm min}(...原创 2019-04-09 23:18:10 · 2570 阅读 · 0 评论 -
算法导论 — 2.2 算法分析
练习2.2-1 用ΘΘΘ记号表示函数n3/1000–100n2–100n+3n^3/1000 – 100n^2 – 100n + 3n3/1000–100n2–100n+3。 解 Θ(n3)Θ(n^3)Θ(n3)。 2.2-2 考虑排序存储在数组AAA中的nnn个数:首先找出AAA中的最小元素并将其与A[1]A[1]A[1]中的元素进行交换。接着,找出AAA中的次最小元素并将其与A...原创 2019-03-26 22:56:03 · 640 阅读 · 0 评论 -
算法导论 — 2.1 插入排序
笔记插入排序是最简单的一种排序算法,它的伪代码如下。 相信读者对插入排序都很熟悉,并且算法很简单,这里就不做具体分析了。练习2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A=<31,41,59,26,41,58>A = <31, 41, 59, 26, 41, 58>A=<31,41,59,26,4...原创 2019-03-26 22:47:20 · 412 阅读 · 0 评论 -
算法导论 — 思考题15-12 签约棒球自由球员
(签约棒球自由球员)假设你是一支棒球大联盟球队的总经理。在寒季休季期间,你需要签入一些自由球员。球队老板给你的预算为XXX美元,你可以使用少于XXX美元来签入球员。但如果超支,球队老板就会解雇你。 你正在考虑在NNN个不同位置签入球员,在每个位置上,有PPP个该位置的自由球员供你选择。由于你不希望任何位置过于臃肿,因此每个位置最多签入一名球员(如果在某个特定位置上你没有签入任何球员,则意味着计...原创 2018-11-25 00:21:37 · 1237 阅读 · 1 评论 -
算法导论 — 思考题15-11 库存规划
(库存规划)Rinky Dink公司是一家制造溜冰场冰面修整设备的公司。这种设备每个月的需求量都在变化,因此公司希望设计一种策略来规划生产,需求是给定的,即它虽然是波动的,但是是可预测的。公司希望设计接下来nnn个月的生产计划。对第iii个月,公司知道需求did_idi,即该月能够销售出去的设备的数量。令D=∑i=1ndiD = \sum_{i=1}^nd_iD=∑i=1ndi 为后nnn个...原创 2018-11-24 01:51:04 · 4802 阅读 · 0 评论 -
算法导论 — 思考题15-10 投资策略规划
(投资策略规划)你所掌握的算法知识帮助你从Acme计算机公司获得了一份令人兴奋的工作,签约奖金1万美元。你决定利用这笔钱进行投资,目标是10年后获得最大回报。你决定请Amalgamated投资公司管理你的投资,该公司的投资回报规则如下。该公司提供nnn种不同的投资产品,从111~nnn编号。在第jjj年,第iii种投资产品的回报率为rijr_{ij}rij。换句话说,如果你在第jjj年在第iii...原创 2018-11-24 01:11:56 · 1959 阅读 · 1 评论 -
算法导论 — 思考题15-9 字符串拆分
(字符串拆分)某种字符串处理语言允许程序员将一个字符串拆分为两段。由于此操作需要复制字符串,因此要花费nnn个时间单位来将一个nnn个字符的字符串拆分为两段。假定一个程序员希望将一个字符串拆分为多段,拆分的顺序会影响所花费的时间。例如,假定这个程序员希望将一个20个字符的字符串在第2个、第8个及第10个字符后进行拆分(字符由左至右,从1开始升序编号)。如果她按由左至右的顺序进行拆分,则第一次拆分花...原创 2018-11-21 23:34:55 · 3732 阅读 · 0 评论 -
算法导论 — 思考题15-8 基于接缝裁剪的图像压缩
(基于接缝裁剪(seam carving)的图像压缩)给定一幅彩色图像,它由一个m×nm×nm×n的像素数组A[1..m,1..n]A[1..m, 1..n]A[1..m,1..n]构成,每个像素是一个红绿蓝(RGB)亮度的三元组。假定我们希望轻度压缩这幅图像。具体来说,我们希望从每一行中删除一个像素,使得图像变窄一个像素。但为了避免影响视觉效果,我们要求相邻两行中删除的像素必须位于同一列或相邻列...原创 2018-11-21 01:15:42 · 1360 阅读 · 0 评论 -
算法导论 — 思考题15-6 公司聚会计划
(公司聚会计划)一位公司主席正在向Stewart教授咨询公司聚会的计划。公司的内部结构关系是层次化的,即员工按“主管─下属”关系构成一颗树,根结点为公司主席。人事部按“宴会交际能力”为每个员工打分,分值为实数。为了使所有参加聚会的员工都感到愉快,主席不希望员工及其直接主管同时出席。 公司主席向Stewart教授提供公司结构树,采用10.4节介绍的左孩子右兄弟表示法描述。树中每个结点除了保存指针...原创 2018-11-20 16:54:04 · 2775 阅读 · 0 评论 -
算法导论 — 思考题15-5 编辑距离
(编辑距离)为了将一个文本串x[1..m]x[1..m]x[1..m]转换为目标串y[1..n]y[1..n]y[1..n],我们可以使用多种变换操作。我们的目标是,给定xxx和yyy,求将xxx转换为yyy的一个变换操作序列。我们使用一个数组zzz保存中间结果,假定它足够大,可存下中间结果的所有字符。初始时,zzz是空的;结束时,应有z[j]=y[j],j=1,2,…,nz[j] = y[j],...原创 2018-10-28 00:02:11 · 3386 阅读 · 4 评论 -
算法导论 — 思考题15-3 双调欧几里得旅行商问题
(双调欧几里得旅行商问题)在欧几里得旅行商问题中,给定平面上nnn个点作为输入,希望求出连接所有nnn个点的最短巡游路线。下图(a)给出了一个7点问题的解。此问题是NP难问题,因此大家相信它并不存在多项式时间的求解算法(参见第34章)。 J. L. Bentley建议将问题简化,限制巡游路线必须为双调巡游(bitonic tours),即从最左边的点开始,严格向右前进,直至最右边的点,然后调头...原创 2018-10-27 22:56:46 · 4015 阅读 · 7 评论