- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法导论第一次上机报告
班级:1403018 姓名:张可心 学号:14030188030
(一)题目一
一、问题
Design a Θ(n lg n)-time algorithm that, given a set S of n integers and another integer x, determines whether or not there exist two elements in S whose sum is exactly x.
二、问题分析
集合S中有n个整数,给定一个整数x,设计一个算法,求出S中是否有两个元素相加之和为x。首先采用归并排序算法,复杂度为nlg n。再设计算法进行查找。
三、算法伪代码
merge(A,beg1,mid,end1)
n1=mid-beg1+1
n2=end1-mid
let A1[1..n1+1]andA2[1..n2+1]be new arrays
for i=1 to n1
A1[i]=A[beg1+i-1]
for j=1to n2
A2[j]=A[mid+j]
A1[n1+1]= ∞
A2[n2+1]= ∞
i=1
j=1
for k=beg1 to end1
if A1[i] ≤A2[j]
A[k]=A1[i]
i=i+1
else A[k]=A2[j]
j=j+1
merge_sort( A, beg1,end1)
if beg1end1
mid=(beg1+end1)/2
merge_sort(A,beg1,mid)
merge_sort(A,mid+1,end1)
merge(A,beg1,mid,end1)
main(A ,n,x)
A[n+1]= ∞
cinnx
for i=1 to n
cinA[i]
i=i+1
merge_sort(A,1,n)
int i=1,j=n,t=0;
while i!=j
if A[i]+A[j]x
i=i+1
if A[i]+A[j]x
j=j-1
if A[i]+A[j]=x
coutYESendl
t=1
break
if t=0
coutNOendl
return 0
四、算法分析
首先采用归并排序,分为递归与合并两个部分,合并部分中A是一个数组,beg1、mid、end1为下标,满足beg1≤mid<end1,A[beg1...mid]与A[mid+1...end1]都是已排序好的,并合并成一个已排序好的子数组代替当前子数组A[beg1...end1]。pro过程的时间代价为?(n)其中n = end1 - beg1 + 1为待合并元素个数;归并的递归过程,归并的临界点与数组元素为1,因为数组元素个数为1,代表数组元素已排序。否则进行数组一分为2的操作。利用merge-sort( A, beg1, end1 )对子数组A[beg1...end1]进行排序。如果beg1≥end1,则该子数组中至多只有一个元素,当然就是已排序的。否则,分解步骤就计算出一个下一个mid,将A[beg1...end1]分解为A[beg1...mid]和A[mid+1...end1],各含[n/2]个元素。最后进行查找,对排序过后的整数从两头相加,若结果大于x,则从末尾倒序取数再相加,若结果小于x,则从开头取下一个整数相加。总时间复杂度为n lg n。
五、测试结果
INPUT:4 31 1 30 24 67
OUTPUT:YES
INPUT:5 21 1 7 9 25 64
OUTPUT:NO
(二)题目二
一、问题
Let A[1 ‥ n] be an array of n distinct numbers. If i j and A[i] A[j], then the pair (i, j) is called an inversion of A.
Give an algorithm that determines the number of inversions in any permutation on n elements in Θ(n lg n) worst-case time. (Hint: Modify merge sort.)
二、问题分析
由题目知,要求出A中的逆序对数,且时间复杂度在最坏情况下为n lg n。故仍采用归并排序算法,并在其中加入计数代码。
三、算法伪代码
count=0
merge(A,beg1,mid,end1)
n1=mid-beg1+1
n2=end1-mid
let A1[1..n1+1]andA2[1..n2+1]be new array
您可能关注的文档
最近下载
- 香港电影简史年表.docx VIP
- 临床免疫学检验:免疫原和抗血清的制备.ppt VIP
- 项目生命周期与项目管理过程课件.pptx VIP
- GB50348-2004 安全防范工程技术规范.docx VIP
- 大模型时代的具身智能.pptx
- 2024-2025学年安徽省合肥四十五中九年级(上)第一次月考物理试卷(含答案).pdf VIP
- 戏剧教育与戏剧表演技巧培训.pptx VIP
- 新药研究与开发技术 课件全套 第1--7章 概论、新药的发现研究---新药选题与信息利用.pptx
- 2025年中国智慧停车行业研究报告-鼎帷咨询.docx
- 《AI时代新机遇》AIGC如何为教师赋能培训课件.pptx VIP
文档评论(0)