实验四 线性时间选择问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四线性时间选择问题
一、实验目的:
综合利用之前学习的各类算法特点,求解问题。
二、实验内容:
给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。
对于线性序列集合中元素个数比较少的情况,可以先排序,再选择这n个元素中第k小的元素。但排序的时间复杂度最好是O(nlogn)。
如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。
请编程实现线性时间选择问题。
三、实验设备:
Windows XP系统、Visual C++
四、实验完成情况:
1、算法分析:
将n个输入元素划分成⎡n/5⎤个组,每组5个元素,只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共⎡n/5⎤个。
递归调用select( )来找出这⎡n/5⎤个元素的中位数。如果⎡n/5⎤是偶数,就找它的2个中位数中较大的一个。以这个元素作为划分基准。
设所有元素互不相同。在这种情况下,找出的基准x至少比3(n-5)/10个元素大,因为在每一组中有2个元素小于本组的中位数,而n/5个中位数中又有(n-5)/10个小于基准x。同理,基准x也至少比3(n-5)/10个元素小。而当n≥75时,3(n-5)/10≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。
按照此法计算所花费时间为:T(n)=O(n)
2、程序源码(可付纸)(要求手写):
3、程序运行结果:
(将运行结果截图贴/粘在Word文档中)
4、实验心得体会:
(请写出程序在编写、调制、编译、运行时出现的问题,以及解决问题的方法。另外附以对本次实验/程序/算法的意见和建议)
通过本次上机试验,我学会了综合利用之前学习的各类算法特点,并且求解问题。