北航算法设计与分析作业4

合集下载

算法设计与分析习题答案

算法设计与分析习题答案

算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。

以下是一些典型的算法设计与分析习题及其答案。

习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。

答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。

这个过程会不断重复,直到找到目标值或搜索范围为空。

```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。

答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。

```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。

算法分析与设计作业参考答案

算法分析与设计作业参考答案

算法分析与设计作业参考答案《算法分析与设计》作业参考答案作业⼀⼀、名词解释:1.递归算法:直接或间接地调⽤⾃⾝的算法称为递归算法。

2.程序:程序是算法⽤某种程序设计语⾔的具体实现。

⼆、简答题:1.算法需要满⾜哪些性质?简述之。

答:算法是若⼲指令的有穷序列,满⾜性质:(1)输⼊:有零个或多个外部量作为算法的输⼊。

(2)输出:算法产⽣⾄少⼀个量作为输出。

(3)确定性:组成算法的每条指令清晰、⽆歧义。

(4)有限性:算法中每条指令的执⾏次数有限,执⾏每条指令的时间也有限。

2.简要分析分治法能解决的问题具有的特征。

答:分析分治法能解决的问题主要具有如下特征:(1)该问题的规模缩⼩到⼀定的程度就可以容易地解决;(2)该问题可以分解为若⼲个规模较⼩的相同问题,即该问题具有最优⼦结构性质;(3)利⽤该问题分解出的⼦问题的解可以合并为该问题的解;(4)该问题所分解出的各个⼦问题是相互独⽴的,即⼦问题之间不包含公共的⼦问题。

3.简要分析在递归算法中消除递归调⽤,将递归算法转化为⾮递归算法的⽅法。

答:将递归算法转化为⾮递归算法的⽅法主要有:(1)采⽤⼀个⽤户定义的栈来模拟系统的递归调⽤⼯作栈。

该⽅法通⽤性强,但本质上还是递归,只不过⼈⼯做了本来由编译器做的事情,优化效果不明显。

(2)⽤递推来实现递归函数。

(3)通过Cooper 变换、反演变换能将⼀些递归转化为尾递归,从⽽迭代求出结果。

后两种⽅法在时空复杂度上均有较⼤改善,但其适⽤范围有限。

三、算法编写及算法应⽤分析题: 1.冒泡排序算法的基本运算如下: for i ←1 to n-1 dofor j ←1 to n-i do if a[j]交换a[j]、a[j+1];分析该算法的时间复杂性。

答:排序算法的基本运算步为元素⽐较,冒泡排序算法的时间复杂性就是求⽐较次数与n 的关系。

(1)设⽐较⼀次花时间1;(2)内循环次数为:n-i 次,(i=1,…n ),花时间为:∑-=-=in j i n 1)(1(3)外循环次数为:n-1,花时间为:2.设计⼀个分治算法计算⼀棵⼆叉树的⾼度。

北航201303学期算法与数据结构答案作业4

北航201303学期算法与数据结构答案作业4

作业4单项选择题第1题假设有对角矩阵a[n][n],我们可以按行序为主将对角矩阵A的非零元素存入一个一维数组B[K]中。

给出二维数组的任一元素a[i][j]与一维数组B[K]对应的下标m的关系:()。

A、k = 2*i + jB、k = 2 * j + iC、k = 3* (i + j )D、k = i + j答案:A第2题假设有对称矩阵a[n][n],我们可以按行序为主将对称矩阵A的下三角中的元素存入一个一维数组B[K](K=n(n+1)/2)中。

给出二维数组的任一元素a[i][j]与一维数组B[K]对应的下标m的关系:()。

A、(i-1)*(j+1)=kB、(i+1)*(j+1)=kC、(i-1)*j=kD、i*(j+1)=k答案:A第3题假定M行N列的数组a是行优先存贮的,L是元素a[0][0]的存贮地址,每个元素占K个存贮单元,元素a[I][j]的地址是:()。

A、L + (I –1)* N * K +j*KB、L +( I * N +j)*KC、( I * N * K + (J –1) *KD、L +( I * M +j) * K答案:B第4题对给定的图,Prim方法与Kruskal方法都能给出最小代价生成树,针对最小代价生成树的算法,下面的说法哪一个是正确的:()。

A、Prim方法与Kruskal方法均不需要进行圈的判断B、Prim方法与Kruskal方法都需要进行圈的判断C、Prim方法需要进行圈的判断,Kruskal方法不需要进行圈的判断D、Prim方法不需要进行圈的判断,Kruskal方法需要进行圈的判断答案:D多项选择题第5题假定以单向链表方式存贮堆栈,栈顶指针变量为p,表示栈空时,下面的说法哪一个是正确的():A、p==-1B、p==0C、p==NULLD、p != NULL答案:B|C第6题下述陈述中哪一项是正确的():A、文件中能唯一标识一个记录的数据项称之为主关键字B、文件中能唯一标识一个记录的数据项组合称之为主关键字C、文件中能标识一个记录的数据项称之为主关键字D、文件中能标识一个记录的数据项组合称之为主关键字答案:A|B第7题常用的线性表存贮结构有():A、顺序存贮结构B、链表存贮结构C、队列存贮结构D、堆栈存贮结构E、顺序存贮与链表存贮混合结构答案:A|B|E第8题常用的堆栈存贮结构有():A、顺序存贮结构B、链表存贮结构C、顺序存贮与链表存贮混合结构D、指针存贮结构答案:A|B判断题第9题空串是打印后不出现任何字符的字符器。

算法设计与分析第三版第四章课后习题答案

算法设计与分析第三版第四章课后习题答案

算法设计与分析第三版第四章课后习题答案4.1 线性时间选择问题习题4.1问题描述:给定一个长度为n的无序数组A和一个整数k,设计一个算法,找出数组A中第k小的元素。

算法思路:本题可以使用快速选择算法来解决。

快速选择算法是基于快速排序算法的思想,通过递归地划分数组来找到第k小的元素。

具体步骤如下: 1. 选择数组A的一个随机元素x作为枢纽元。

2. 使用x将数组划分为两个子数组A1和A2,其中A1中的元素小于等于x,A2中的元素大于x。

3. 如果k等于A1的长度,那么x就是第k小的元素,返回x。

4. 如果k小于A1的长度,那么第k小的元素在A1中,递归地在A1中寻找第k小的元素。

5. 如果k大于A1的长度,那么第k小的元素在A2中,递归地在A2中寻找第k-A1的长度小的元素。

6. 递归地重复上述步骤,直到找到第k小的元素。

算法实现:public class LinearTimeSelection {public static int select(int[] A, int k) { return selectHelper(A, 0, A.length - 1, k);}private static int selectHelper(int[] A, int left, int right, int k) {if (left == right) {return A[left];}int pivotIndex = partition(A, left, righ t);int length = pivotIndex - left + 1;if (k == length) {return A[pivotIndex];} else if (k < length) {return selectHelper(A, left, pivotInd ex - 1, k);} else {return selectHelper(A, pivotIndex + 1, right, k - length);}}private static int partition(int[] A, int lef t, int right) {int pivotIndex = left + (right - left) / 2;int pivotValue = A[pivotIndex];int i = left;int j = right;while (i <= j) {while (A[i] < pivotValue) {i++;}while (A[j] > pivotValue) {j--;}if (i <= j) {swap(A, i, j);i++;j--;}}return i - 1;}private static void swap(int[] A, int i, int j) {int temp = A[i];A[i] = A[j];A[j] = temp;}}算法分析:快速选择算法的平均复杂度为O(n),最坏情况下的复杂度为O(n^2)。

《算法分析与设计》课后作业

《算法分析与设计》课后作业

《算法分析与设计》各章课后作业第一章 课后作业1. 设某算法在输入规模为n 时的计算时间为T(n)=10*2n。

若在甲台计算机上实现并完成该算法的时间为t 秒,现有一台运行速度是甲的64倍的另一台计算机乙,问在乙计算机上用同一算法在t 秒内能解决的问题的规模是多大?2.按照渐近阶从低到高的顺序排列以下表达式:4n 2,logn ,3n,20n ,2,n 2/3。

又n!应该排在哪一位?第二章 课后作业1. 用展开法求解下列递推关系:T(n)=⎩⎨⎧>+=1n )()2/(20n )1(n O n T O,写出T(n)的大O 记号表示。

2. 下面是实现在a[0]<=a[1]<=…<=a[n-1]中搜索x 的二分搜索算法,请根据二分 搜索技术在下划线处填充语句。

算法描述如下: template<class Type>public static int BinarySearch(int []a, int x, int n) { //在a[0]<=a[1]<=…<=a[n-1]中搜索 x // 找到x 时返回其在数组中的位置,否则返回-1 int left = 0; int right = n - 1; while ( ) {int middle = ;if(x == a[middle]) return ; if(x > a[middle]) left = middle + 1; else right= ; }return -1; // 未找到x}第三章课后作业1、选择题。

(1)下列算法中通常以自底向上的方式求解最优解的是()。

A、备忘录法B、动态规划法C、贪心法D、回溯法(2)备忘录方法是那种算法的变形。

()A、分治法B、动态规划法C、贪心法D、回溯法(3)矩阵连乘问题的算法可由()设计实现。

A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法2.计算题。

算法设计与分析常见习题及详解

算法设计与分析常见习题及详解

算法设计与分析常见习题及详解⽆论在以后找⼯作还是⾯试中,都离不开算法设计与分析。

本博⽂总结了相关算法设计的题⽬,旨在帮助加深对贪⼼算法、动态规划、回溯等算法的理解。

1、计算下述算法执⾏的加法次数:输⼊:n =2^t //t 为整数输出:加法次数 k K =0while n >=1 do for j =1 to n do k := k +1 n = n /2return k解析:第⼀次循环执⾏n次加法,第⼆次循环执⾏1/2次加法,第三次循环执⾏1/次加法…因此,上述算法执⾏加法的次数为==2n-12、考虑下⾯每对函数 f(n) 和 g(n) ,如果它们的阶相等则使⽤Θ记号,否则使⽤ O 记号表⽰它们的关系解析:前导知识:,因为解析:,因为解析:,因为解析:解析:3、在表1.1中填⼊ true 或 false解析:利⽤上题的前导知识就可以得出。

2=21/4n +n +21n +41...+1n +n −n +21n −21n +41....−1f (n )=(n −2n )/2,g (n )=6n1<logn <n <nlogn <n <2n <32<n n !<n ng (n )=O (f (n ))f (n )=Θ(n ),g (n )=2Θ(n )f (n )=n +2,g (n )=n n 2f (n )=O (g (n ))f (n )=Θ(n ),g (n )=Θ(n )2f (n )=n +nlogn ,g (n )=n nf (n )=O (g (n ))f (n )=Θ(nlogn ),g (n )=Θ(n )23f (n )=2(log ),g (n )=n 2logn +1g (n )=O (f (n ))f (n )=log (n !),g (n )=n 1.05f (n )=O (g (n ))4、对于下⾯每个函数 f(n),⽤f(n) =Θ(g(n))的形式,其中g(n)要尽可能简洁,然后按阶递增序排列它们(最后⼀列)解析:最后⼀个⽤到了调和公式:按阶递增的顺序排列:、、、、、、、、、(n −2)!=Θ((n −2)!)5log (n +100)=10Θ(logn )2=2n Θ(4)n 0.001n +43n +31=Θ(n )4(lnn )=2Θ(ln n )2+3n logn =Θ()3n 3=n Θ(3)n log (n !)=Θ(nlogn )log (n )=n +1Θ(nlogn )1++21....+=n1Θ(logn )=∑k =1nk 1logn +O (1)1++21....+n 15log (n +100)10(lnn )2+3n logn log (n !)log (n )n +10.001n +43n +313n 22n (n −2)!5、求解递推⽅程前导知识:主定理前导知识:递归树:例⼦:递归树是⼀棵节点带权的⼆叉树,初始递归树只有⼀个结点,标记为权重W(n),然后不断进⾏迭代,最后直到树种不再含有权为函数的结点为⽌,然后将树根结点到树叶节点的全部权值加起来,即为算法的复杂度。

北京大学算法设计方案与分析课期末试题

北京大学算法设计方案与分析课期末试题

内部资料,转载请注明出处,谢谢合作。

北京大学信息科学技术学院考试试卷考试科目:算法设计与分析姓名:学号:考试时间:2009年6月9日任课教师:考场纪律1.请持学生证入场考试,并按指定座位就座;除必要的文具和教师指定的用具用书外,其他所有物品包括手机、呼机、MP3、电子词典、书籍、笔记、纸张等严禁带入座位,必须放在指定位置。

凡有试卷印制问题请向监考教师提出,不得向其他考生询问。

2.认真、诚实、独立并在规定时间内完成答卷,严禁任何形式的违纪作弊行为;否则,本答卷成绩以0分记,并根据《北京大学本科考试工作与学术规范条例》给予纪律处分。

3.提前交卷的考生不要在考场逗留,不要在门口、窗外大声喧哗。

考试结束时间到,请停止答卷,在座位等候监考教师收卷并清点完毕,方可离开考场;考题和试卷不得带出考场。

以下为试卷和答题纸,共 9 页。

一、填空题(选做5道,10分)1.用矩阵幂的方法求斐波那契数,其运行时间为()。

题号一二三四五六七八总分分数阅卷人装订线内不要答题2.对于一个可以用动态规划法求解的问题,要求问题既要满足()的特性,又要具有大量的()。

3.对于一个可以用贪心法求解的问题,不仅要求问题满足()的特性,还应证明其贪心策略的()。

4.设有n 个栈操作(PUSH 、POP 、MULTIPOP )的序列,作用于初始为空的栈S 。

不区分三种操作,则每个操作的最坏运行时间为(),平摊运行时间为()。

5.三种平摊分析的方法分别为()、()、()。

6.四后问题的搜索空间为()树;0-1背包问题的搜索空间为()树;巡回售货员问题的搜索空间为()树。

7.()法的求解目标是找出解空间树中满足约束条件的所有解,而()法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

8.回溯法一般以()优先的方式搜索解空间树,而分支限界法则一般以()优先或以最小耗费优先的方式搜索解空间树。

二、单项选择题 (10分) 1.下列关于排序算法的叙述,不正确的是?()A) 堆排序的最差情形运行时间为Θ(nlgn)B) 快速排序平均情形运行时间为Θ(nlgn) C) 任何排序算法的最差情形运行时间都不可能比Ω(nlgn)更小D) 插入排序在最好情形下的运行时间为Θ(n) 2.对于课堂讲解的线性时间内找第i 小的元素的算法,()下列叙述中不正确的是?A) 算法第一步中可以按每五个元素一组找中位数;B) 算法第一步中可以按每七个元素一组找中位数;B) 算法第一步中不能按每三个元素一组找中位数;D) 如果要求的n 个元素的中位数,则中位数一定是第一步中找到的中位数中的某一个。

算法分析与设计作业

算法分析与设计作业

最接近点对问题问题此问题分为一维,二维,三维的情况1. 一维: 给定直线上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,这个问题比较简单,是引出二维解法的一个引子,因为一维的直线上的点,相邻点的距离肯定小于相隔的点的距离,只需要考虑相邻点即可。

2. 二维:给定平面上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,这是我们这一问题的重点3. 三维:给定空间上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,此问题是二维的解法的复杂化,具体可以在飞机航线等问题上运用,但在此不多做介绍。

基本思想由于该问题的基本解法是去考察每个点和其他所有点的距离。

因此它的时间复杂度是2()O n ,这样做的效率太低,我们就要去寻找一个更高效的办法:分治法。

1. 因二维的情况太过复杂,先考虑一维的情况中,可以用分治法对其进行分部计算: 把直线分成两部分, 1s 2s ,分别求出其最接近点的距离1d 2d 。

但分割开的地方的两点距离可能小于这两个值,这三个值进行比较之后,得到最后结果。

2. 鉴于此,二维的也可以用此方法进行计算:把待计算的点s 分成两部分1s 2s ,分别求出其最接近点的距离1d 2d 。

但1d 2d 最小的未必是s 中的最小距离d ,它有可能是1s 中的一个点和2s 中的一个点组成的最接近点对。

所以还要考虑1s 中的所有点到2s 中的每一个点的距离,一一比较之后得出一个最小值,再和1d 2d 比较,这就得出了最后结果。

3. 接下来是具体算法实现的步骤:1. 把待计算的点s 分成两部分1s 2s :重要的如何去划分,这里采用在二维平面上的中线(用横坐标的最小值加上最大值的平均数)来划分。

2. 分别求出其最接近点的距离1d 2d :这可以用一个递归来完成。

3. 计算1s 中的所有点到2s 中的每一个点的距离:这个问题是此问题的关键。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 题目1
如图表1,建立图G =(V,E )。

下半部分共18个节点,看作V a ,上半部分可以看作有点集合{V 2,V 3,V 4,…,V 18},其中Vi 表示该集合中有⌊18i ⌋节点,且表示该集合中每个节点和下半部分的V a 中的i 个点有边。

图表 1图G
由此,按照题意,V a 中顶点最大度数为17,所以首先选择V 18,然后V a 中最大顶点度数会少1,因此选择V 17,不断计算下去,最终,会选择{V 2,V 3,V 4,…,V 18}整个集合,而不是V a 。

即选取的点为
m =∑⌊18i ⌋18
i=2=9+6+4+3+3+2+2+2+9∗1=40 由图可以很容易知道图G 的最小顶点覆盖为A ,即共m ∗=18个点。

所以计算得到:
R =max (m m ∗,m ∗m )=4018
>2 因此,该贪心算法不是2-近似算法。

2.题目2
(1)
该问题的判定问题:
是否存在一个调度方案A(1),A(2),…,A(m),使得最大负载max i T i≤T。

证明其为NP-难问题:
1.证明该问题是NP问题,即多项式时间内可以验证结果。

如果我们找到了一个分配调度方案A(1),A(2),…,A(m),直接计算所有机器负载,然后与给定负载T进行比较即可,验证的时间复杂度是O(n),即在多项式时间内可以完成。

2.找到一个NPC问题Q,使得Q≤题目描述问题(最小工期分配调度问题)。

假设Q为partition problem,设其中一个实例为I={S},S表示p个数的集合,即S= {K1,K2,…,K p},给定整数d,请问将S集合中的数字分到两个集合中去,是否存在一种分配方案使得两个集合中元素的和的差值的绝对值不大于d,其中d=0。

根据题目,当最小工期分配调度问题中,及其数量m=2,作业数量n=p,作业时间t i= K i,则可以构造一个最小工期调度实例I′={m,n,t1,t2,…,t n,T}。

因为上述两个问题的解都对应一种情况,即问题I有解当且仅当问题I′有解。

综上所述,最小工期分配的调度问题是NP难问题。

(2)
贪心算法:
想法:将所有作业时间按照从大到小排序,依次将作业分配给机器,每次选择负载最小的机器进行分配,直到所有作业分配完毕。

排序的时间复杂度可以计算为O(n2),符合多项式时间贪心算法的要求。

证明该算法为2-近似算法:
1.当n≤m时,将所有的作业依次分配给机器,此时解就是最优解,即T∗=T=max(t j)
2.当n>m时,考虑最大负载的机器分配的最后一个任务为j∗
a)若j∗=1,即最大负载的机器为T=max(t j),则有T∗=T=max(t j)
b)若j∗≠1,有:
T−t j∗≤1
m
∑T k
m
k=1
=
1
m
∑t k
n−{j∗}
k

1
m
∑t k
n
k
≤T∗

T≤T∗+t j∗因为t j∗≤T∗,所以有T≤2T∗,即
T
T∗
≤2综上所述,该贪心算法是2-近似算法。

相关文档
最新文档