算法导论上机报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法导论
上机报告
班级: 1313012
学号:
姓名:黄帮振
描述一个运行时间为θ(nlgn)的算法给定n个整数的集合S和另一个整数x 该算法能确定S中是否存在两个其和刚好为x的元素。
二分查找算法的时间复杂度为θ(lgn)在题目要求的范围内,二分查找的条件为待查的数组为有序序列。算法的主要思想为设定两个数low指向最低元素high指向最高元素,然后比较数组中间的元素与待查元素进行比较。如果待查元素小于中间元素,那么表明查找元素在数组的前半段,反之,如果待查元素大于中间元素,那么表明查找元素在数组的后半段。
二、伪代码:
MERGE(A,p,q,r)
1.n1=q-p+1
2.n2=r-q
3.Let L[1..n1+1]andR[1..n2+1]be new arrays
4.For i=1 to n1
5. L[i]=A[p+i-1]
6.For j=1 to n2
7. R[j]=A[q+j]
8.L[n1+1]=无穷
9.R[n2+1]=无穷
10.I=1
11.J=1
12.For k=p to r
13. If L[i]<=R[j]
实现优先队列排序算法,需要支持以下操作:
INSERT(S,x):把元素x插入到集合S中
MAXMUM(S):返回S中具有最大key的元素
EXTRACT-MAX(S):去掉并返回S中的具有最大key的元素
一、算法原理
快速排序采用分治策略,时间复杂度为θ(nlgn),但是最坏情况下为θ(n2),并且快速排序算法属于原地排序,并不需要开辟空间。快速排序复杂的步骤为其分解的步骤分解的过程数组A[p..r]被划分为两个子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于A[q],而A[q]也小于等于A[q+1..r]中的每个元素。而在实现的过程总是选择将A[r]作为基准点进行划分A[p..r]数组。
二、伪代码
QUICKSORT(A,p,r)
1 if p < r
2 q = PARTITION(A,p,q)
3 QUICKSORT(A,p,q-1)
4 QUICKSORT(A,q+1,r)
PARTITION(A,p,r)
1 x = A[r]
2 i = p-1
3 for j = p to r-1
4 if A[j]x
5 i = i+1
6 exchange A[i] with A[j]
7 exchange A[i+1] with A[r]
8 return i + 1
三、实验总结
问题答案:当选取第一个或者最后一个为基准点时,当n个元素相同的时候为最坏情况比较次数为n*(n-1)/2;快速排序比较次数最少为θ(nlgn),,最大的比较次数为θ(n2)。
运用分治的策略将两个已经排好序的序列中,找出第k大的元素且要求时间
复杂度为θ(lgm+lgn),其中m和n分别为两个序列的长度。
一、算法原理
如果K是中位数,则(M+n)是奇数还是偶数是有关系的。如果是奇数,那么中位数唯一,如果是偶数就有两个中位数,可以随便取一个。如果找到的第K大数是x,假如在A的位置是A(x),在B中的位置是B(x),则Ax+Bx-1=k是成立的。
接下来是具体实现逻辑:
1、首先假设K大数在A数组中,首先检查(m/(m+n))*(k-1),假设其值为A1。然后检查B中
(k+1-(n/(m+n))*(k-1))假设为B1,检查A1、B1是否相等,或者大于B中的第(k+1-(n/(m+n))*(k-1)),并且小于(k+1-(n/(m+n))*(k-1))+1个元素。满足条件就可以知道A1就是所求,否则看条件2。
2、如果两个条件都不满足,那么需要判断第K个元素是位于A1左边还是右边。如果A1>B1,那么K肯定不在A[0, (m/(m + n)) * (k - 1)]以及B[(k + 1 - (m/(m + n)) * (k - 1))+ 1, n]中;
如果A1 1))]中。第K个元素有可能在B中,同理可以假设在B中,再进行一次搜索。复杂度log(m)+log(n)。 二、伪代码 Searchkth(A,B,alow,ahigh,blow,bhigh,k) 1.amid=(alow+ahigh+1)/2 2.bmid=(blow+bhigh+1)/2 3.If alow>ahigh 4. return B[blow+k-1] 5.If blow>bhigh 6. return A[alow+k-1] 7.If A[amid]<=B[bmid] 8.If A[amid]<=B[bmid] 9. If k<= amid-alow+bmid-blow+1 10. Return Searchkth(A,B,alow,ahigh,blow,bmid-1,k) 一、算法原理 1最优子结构为:如果最优的加括号的方式将其分解为Ai..k与Ak+1..j的乘积 则分别对Ai..k与Ak+1..j加括号的方式也一定是最优的。 2定义m[i,j]为计算矩阵Ai..j所需标量乘法次数的最小值,对于i=j时,矩阵链乘只包含唯一的矩阵Ai,因此不需要做任何标量乘法运算,所以m[i,i]=0;当i 3矩阵链乘的递归式 4在算法设计的时候需要m数组记录Ai..j最小相乘次数,s数组记录构造最优解所需要的信息,其记录的k值指出了AiAi+1Aj的最优括号化方案的分割点应在AkAk+1之间。 5 矩阵链乘的时间复杂度为θ(n3) 二、伪代码 MATRIX-CHAIN-ORDER(p) = m[1..n,1..n] and s[1..n-1,2..n] be new tables i=1 to n 4. M[i,i]=0 l=2 to n