算法设计与分析第三章:分治法

本文是关于算法设计与分析实验报告,重点介绍了分治法及其在解决各种问题中的应用,包括寻找整数序列中的最大和最小元素、计算x^n、在有序数组中查找特定元素、计算整数的不同分解式个数、寻找递增有序序列的众数、计算逆序对数量、解决半数集问题、快速排序以及寻找最大和次大元素等。实验通过具体的代码实现,加深了对分治法的理解,并展示了如何运用分治法解决实际问题。
摘要由CSDN通过智能技术生成

算法分析与设计实验报告
第 三 次实验
姓名 裴朵朵 学号 5001170016 班级 计科一班
时间 2019.10 地点

实验名称 分治法及其应用
实验目的 1、理解分治法的概念、原理方法。
2、掌握分治法的使用规律与编程技巧
3.能够应用分治法求解日常生活中问题

实验原理 1.设计一个算法,利用分治法求一个整数序列中的最大和最小元素
2.设计一个算法,采用分治法求x^n
3.有n个互不相同的整数,按递增顺序存放在数组a[1,n-1]中,若存在一个下标i(0<=i<=n) ,使得a[i]=i,设计一个算法以O(log2n)时间找到这个下标
4.对于大于1的正整数n,可以分解为n=x1x2x3*…xm,其中xi>=2。例如,n=12时有8种不同的分解式,即12=12,12=62;12=43,12=34,12=322,12=26,12=232,12=22*3,设计一个算法求n的不同分解式个数。
5.给定一个整数序列,每个元素出现的次数称为众数。编写一个实验程序对递增有序序列a求众数。例如S={1,2,2,2,3,5},多重集S的众数是2,其中重数是3
6.给定一个整数数组A=(a0,a1…an-1),若i<j且ai>aj,则<ai,aj>就为一个逆序列对。例如数组(3,1,4,5,2)的逆序列对有<3,1>、❤️,2>,<4,2>,<5,2>。编写一个实验程序采用分治法求A中逆序对的个数,即逆序数
7.求解半数集问题:给定一个自然数n,由n可以依次产生半数集set(n)中的数如下:(1)n属于set(n)。(2)在n的左边加一个自然数,但该自然数不能超过最近添加的数的一半。(3)按此规则进行处理,直到不能再添加自然数为止。例如,set(6)={6,16,26,126,36,136},半数集set(6)中有6个元素。编写一个实验程序求给定n时对应半数集中元素的个数。
8. 快速排序:分治法,将待排序数组通过一次排序分为两段,用相同方法排序 。
9.对于给定的含有n个元素的无序序列,求这个序列中最大和次大的两个不同元素
10.折半查找:要求元素有序

实验步骤 1.将数组a均分为s1和s2,求解s1和s2中的最大和最小值,最终的最大和最小值可以在s1和s2中的最大最小值中比较得到;对于s1和s2中的最大最小值,可以用同样的方法得到。
2.当n=1时,结果为x;当n为奇数时,结果为f(x,n)=f(x,(n-1)/2)*f(x,(n-1)/2)*x;当n为偶数时,结果为f(x,n/2)*f(x,n/2)
3.采用二分查找法。a[i]=i时表示该元素在有序非重复序列a中恰好第i大。对于序列a[low…high],mid=(low+high)/2,若a[mid]=mid表示查找到该元素;若a[mid]>mid,说明右区间的所有元素都大于其位置,只能在左区间中查找;若a[mid]<mid,说明左区间的所有元素都小于其位置,只能在右区间中查找
4.f(n)为n的所有因数的不同分解式个数之和,f(1)=1,是递归的出口
5.count记录最大的重数,count1记录每个元素的重数,相同大小的元素记录完重数后,count1与count比较,若count1>count,则count1成为新的count,接下来进行下一个不同数值的比较,直到数组遍历完毕;如果count1=count,则表示最大重数有两个或多个,定义数组记录最大重数的数值
6.定义两个变量i和j,最大值分别是n-1和n,从第一个元素开始,依次与其后面的元素比较大小,若符合逆序数的条件,则count加1
7.半数集set(n)中元素个数的求解是个递归的过程,设set(n)中的元素个数为f(n),则明显有递归表达式:f(n)=1+∑f(i),i=1,2……n/2
8.先将数列中的第一个数作为基准, 将a[0]中的数保存到tmp中,可以理解为在a[0]上挖了个坑,可以将其他数据填充过来,从j开始向前找一个比tmp小或者等于tmp的数,找到符合条件的数时,将其位置挖坑,它本身填到a[0]位置上,然后从i开始找一个大于tmp的数,将其挖坑,其本身填到上一个坑中,直到a[i]=a[j],将tmp填到a[i]中,这样就完成了一次排序,然后递归调用。
9.若只有一个元素,则此元素是最大元素,没有元素;若只有两个元素,则最大元素为两个之中的较大者,次大元素为两个之中的较小者;若有两个以上元素,则分为[low…mid],[mid+1…high],分别求出两边的最大值和次大值,左右最大值相互比较,左右次大值相互比较,递归进行,依次比较,直到结束
10.首先确定元素的中间位置mid,将待查找元素与mid比较,若相等,则找到;若比mid小,则带查找元素在0…mid之间,查找0…mid的中间元素;若比mid大,则在mid+1…high之间,查找mid+1…high的中间值,依次进行

关键代码 1-1
void MaxMin(int a[],int low,int high,int &maxe,int &mine)
{
if(lowhigh) //只有一个元素
{
maxe=a[low];
mine=a[low];
}
else if(low
high-1)//只有两个元素
{
maxe=max(a[low],a[high]);
mine=min(a[low],a[high]);

}
else
{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值