精华内容
下载资源
问答
  • 分治法求最大最小值
    2021-05-19 01:54:29

    #include

    int main()

    {

    void      max_min( int s[] , int *max ,int *min);

    int         max   ,    min ;

    int         n;

    scanf("%d" ,&n);

    int        num[n];

    while( n-- )

    {

    scanf("%d" , &num[i]);

    }

    max_min(num , &max , &min);

    printf("max=%d , min=%d" ,  max,min);

    return 0;

    }

    void      max_min( int s[] , int *max ,int *min)

    {

    int   max1 , min1 , max2 , min2;

    if(sizeof(s)/sizeof(int)==2)                       //判断数据个数  若数据个数是2个  那么就直接进行比较

    {

    if(*s>*(s+1))

    {

    *max=*s;

    *min =*(s+1);

    }else{

    *max=*(s+1);

    *min =*s;                         }

    }else{                                                                                              //数据个数大于2个 将数据分为2组   进行递归调用

    max_min(s , &max1, &min1);                                            //数据组1

    max_min(s+sizeof(s)/sizeof(int)/2 , &max2 , &min2);   //数据组2

    if(max1>max2)

    {

    *max=max1;

    }else{

    *max=max2;

    }

    if(min1>min2)

    {

    *min=min2;

    }else

    *min=min1;

    }

    }

    }

    更多相关内容
  • 分治法求最大最小值

    2021-10-12 20:48:20
    分治法求最大最小值问题 问题描述:在含有n个不同元素的集合a[n]中同时找出它的最大值和最小值。不妨设n=2m次方,m>=0。 分治法 基本思想:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立...

    分治法解求最大最小值问题

    问题描述:在含有n个不同元素的集合a[n]中同时找出它的最大值和最小值。不妨设n=2m次方,m>=0。

    分治法
    基本思想:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解决这些子问题,然后再将这些子问题合并得到原问题的解。

    Divide-and-Conquer(P)
    {
    	if(|P|<=n0)Adboc(P);
    	divide P into smaller subinstances
    	P1,P2,...,Pk;
    	for(i=1;i<=k;i++)
    	yi=Divide-and-Conquer(Pi);
    	return Merge(y1,y2,...yk);
    }
    

    分治法的基本框架
     其中,|P|是问题P的规模,n0为一阙值,表示当问题P的规模不超过n0时,问题已经容易被解决,不需要继续被分解。Adhoc§是该分治法中的基本子算法,用于直接解决最小的子问题。Merge(y1,y2,…yk)是该分治法中的合并子算法,用于合并P的子问题。
     不难发现,实现分治法的保障是递归,如何构建好递归非常重要,递归的确定需要确定两个部分,分别为递归边界和递归方法。回到本问题,问题需要我们输入问题规模n和问题的具体数字(用整型数组a来存储)。
    例:问题规模n=8,具体数字a[]={22,10,60,78,45,51,8,36}。通过对分治法和递归算法的了解我们不难构建出问题函数的过程图。
    在这里插入图片描述

    递归边界:
    SL和SR是左右子问题返回的最大值与最小值的结构体

    if(i==j)
    	{
    		s.max=s.min=b[i];
    		return s;
    	}
    	if(i==j-1)
    	{
    		if(b[i]>=b[j])
    		{
    			s.max=b[i];
    			s.min=b[j];
    			return s;
    		}
    		if(b[i]<b[j])
    		{
    			s.max=b[j];
    			s.min=b[i];
    			return s;
    		}
    	}
    

    递归函数:

    	SL=MAXMIN(i,mid,b);
    	SR=MAXMIN(mid+1,j,b);
    

    合并:

    	if(SL.max>SR.max)
    		s.max=SL.max;
    	else
    		s.max=SR.max;
    	if(SL.min>SR.min)
    		s.min=SR.min;
    	else
    		s.min=SL.min;
    	return s;
    

    注意
    1(递归边界).我们在设计算法的时候,根据算法中的递归边界可以确定需要确定子问题中的最左边标志i最右边标志j ,在划分子问题的时候我们还得定义一个中间变量mid 作为左子问题的最右边界和mid+1作为右子问题的最左边界。
    2(递归函数).试想,我们把一组数据分为左右两个子问题,每个子问题都需要求出一个最大值和最小值返回,函数返回的时候,为了减少算法的复杂程度,我们可以用C语言当中的结构体变量,定义一个结构体变量S,其中包含两个整型变量最大值max和最小值min。
    3(合并算法).在合并子问题的时候,左右子问题都会产生各自的最大值和最小值,左子问题的最大值SL.max最小值SL.min,右子问题的最大值SR.max最小值SR.min。两边的最大值比较,最大的就是该问题的最大值max,两边的最小值比较,最小值就为该问题的最小值min。
    代码如下

    #include<stdio.h>
    #include<windows.h>
    typedef struct 
    {
    	int max;
    	int min;
    }S;
    S MAXMIN(int i,int j,int b[]){
    	S s,SL,SR;
    	int mid;
    	if(i==j)
    	{
    		s.max=s.min=b[i];
    		return s;
    	}
    	if(i==j-1)
    	{
    		if(b[i]>=b[j])
    		{
    			s.max=b[i];
    			s.min=b[j];
    			return s;
    		}
    		if(b[i]<b[j])
    		{
    			s.max=b[j];
    			s.min=b[i];
    			return s;
    		}
    	}
    	mid=(i+j)/2;
    	SL=MAXMIN(i,mid,b);
    	SR=MAXMIN(mid+1,j,b);
    	if(SL.max>SR.max)
    		s.max=SL.max;
    	else
    		s.max=SR.max;
    	if(SL.min>SR.min)
    		s.min=SR.min;
    	else
    		s.min=SL.min;
    	return s;
    }
    void main(){
    	int k,n,a[100];
    	S d;
    	printf("输入问题规模n:");
    	scanf("%d",&n);
    	printf("输入问题的数字:");
    	for(k=0;k<=n-1;k++)
    	{
    		scanf("%d",&a[k]);
    	}
    	d=MAXMIN(0,n-1,a);
    	printf("最大值为:%d,最小值为:%d\n",d.max,d.min);
    	system("pause");
    }
    
    
    展开全文
  • 分治法求最大值和最小值 实验报告 
  • 分治法查找最大最小值

    千次阅读 2021-07-22 09:51:53
    使用分治法,根据不同的输入用例n,准确输出这n个随机数中的最大最小值。 实验步骤 ①递归将整个数组拆分为多个只有一个元素的小数组。 ②如果数组中只有一个元素,那么只需要将该元素与当前的最大最小值比较并更新...

    实验目的
    利用分治法查找数组元素的最大值与最小值,并计算出程序运行所需要的时间,得到不同规模数据实验的时间对比,并进行时间复杂度分析。

    实验原理
    使用分治法,根据不同的输入用例n,准确输出这n个随机数中的最大最小值。

    实验步骤
    ①递归将整个数组拆分为多个只有一个元素的小数组。
    ②如果数组中只有一个元素,那么只需要将该元素与当前的最大最小值比较并更新最大最小值即可。
    ③将每一个小数组得到的结果进行比较,选取其中的最大值和最小值并进行更新。

    关键代码

    void BS(int a[],int left,int right,int & max,int & min)
    {
    	int mid,max1,max2,min1,min2;
    	if(left==right)
    {		
    		max=a[left];
    		min=a[left];	
    	}
    else
    {
    		mid=(left+right)/2;	
    		BS(a,mid+1,right,max1,min1);
    		BS(a,left,mid,max2,min2);
    		if(min1>min2)
    			min=min2;
    		else
    			min=min1;
    		if(max2>max1)
    			max=max2;
    		else
    			max=max1;
    	}
    }
    

    时间复杂度分析
    对于BS()函数,其比较次数的递推式为:T(1)=T(2)=1,T(n)=2T(n/2)+1,合并的时间为O(1),可以推导出T(n)=O(n)。

    实验心得
    通过这次实验,我学习了分治算法查找,同时巩固了随机数据生成方法和文件读写操作的知识。

    完整代码
    分治法查找

    #include <iostream>
    #include <fstream>
    #include <windows.h> 
    using namespace std;
    void BS(int a[],int left,int right,int & max,int & min)
    {
    	int mid,max1,max2,min1,min2;
    	if(left==right)
    	{		
    		max=a[left];
    		min=a[left];	
    	}
    	else{
    		mid=(left+right)/2;	
    		BS(a,mid+1,right,max1,min1);
    		BS(a,left,mid,max2,min2);
    		if(min1>min2)min=min2;
    		else min=min1;
    		if(max2>max1)max=max2;
    		else max=max1;
    	}
    }
    int main()
    {
    	ifstream in;
    	in.open("input.txt");
    	ofstream out;
    	int n;
    	in>>n;
    	int a[n];
    	for(int i=0;i<n;i++)
    	{
    		in>>a[i];
    	} 
    	in.close(); 
    	int max=a[0];
    	int min=max;
    	LARGE_INTEGER time,time0,time1,time2;
    	QueryPerformanceFrequency(&time);
    	QueryPerformanceCounter(&time0);
    	BS(a,0,n-1,max,min);
    	QueryPerformanceCounter(&time1);
    	out.open("output.txt");
    	out<<"最大值为:"<<max<<"最小值为:"<<min<<"时间为:"<<1000.0*(time1.QuadPart-time0.QuadPart)/time.QuadPart<<"ms"<<endl;
        cout<<"最大值为:"<<max<<"最小值为:"<<min<<"时间为:"<<1000.0*(time1.QuadPart-time0.QuadPart)/time.QuadPart<<"ms"<<endl;
    	out.close();
    	return 0;
    }
    

    随机数生成

    #include<stdlib.h>
    #include<time.h>
    #include<fstream>
    #include<iostream>
    using namespace std;
    int main(){
    	int n;
    	cin>>n;
    	ofstream out("input.txt");
    	out<<n<<'\n';
    	srand((unsigned)time(NULL));
    	for(int i=0;i<n;i++)
    	{
    		out<<rand()<<' ';
    		if((i+1)%10==0) out<<'\n';
    	}
    	out.close();
    	return 0;
    }
    
    
    展开全文
  • C++分治法求最大最小值

    千次阅读 2020-04-09 21:14:28
    分治法 可以用分治法解决的问题一定包含了诸多的子问题,这些子问题的解题方式及问题形式都与大问题一样,并且都是可解的。所以我们利用分治法解决问题一定要先找他的最小的子问题,然后解决它,由于分治法的本质...

    分治法

    可以用分治法解决的问题一定包含了诸多的子问题,这些子问题的解题方式及问题形式都与大问题一样,并且都是可解的。所以我们利用分治法解决问题一定要先找他的最小的子问题,然后解决它,由于分治法的本质其实就是递归问题,所以我们最终可以解决原有问题。下面给出一个数组,求出其中的最大值和最小值。

    代码

    #include <iostream>
    using namespace std;
    void divide_and_conquer(int a[],int begin,int end,int *max_value,int *min_value)
    {
        if(end - begin <= 1)
        {
            if(a[begin] > a[end])
            {
                *max_value = a[begin];
                *min_value = a[end];
                return;
            }
            else
            {
                *max_value = a[end];
                *min_value = a[begin];
                return;
            }
        }
            int mid = (begin + end) / 2;
        int min1,min2,max1,max2;
        //左侧的最大最小值
        divide_and_conquer(a,begin,mid,&max1,&min1);
        //右测的最大最小值
        divide_and_conquer(a,mid+1,end,&max2,&min2);
        *max_value = max1 > max2 ? max1 : max2;
        *min_value = min1 < min2 ? min1 :min2;
    }
    int main()
    {
        int a[] = {1,2,5,6,100,4,2,9};
        int m_x = 0;
        int m_i = 0;
        divide_and_conquer(a,0,9,&m_x,&m_i);
        cout<<"最大值为:"<<m_x<<endl;
        cout<<"最小值为:"<<m_i<<endl;
        return 0;
    }
    展开全文
  • 算法实验-分治法查找最大最小值

    千次阅读 2020-02-02 15:54:55
    利用分治法查找数组元素的最大值与最小值。并计算出程序运行所需要的时间。 实验步骤 ①将问题分解,如果数组中只有一个元素,那么只需要比较该元素与当前的最大最小值并进行更新即可 ②将问题扩大,数组中有多个...
  • 分治算法求最大最小值      首先我们为什么要用分治算法来求最大最小值,用循环比较一个个来不好吗,你去上学走路能到学校,骑自行车也能到学校,可你为什么要骑自行车去呢,不就是为了...
  • 算法思想:如果数组中只有两个元素则较小的为最小值,较大的为最大值;...Java实现:/*** 分治法求数组的最小最大值* @author cht**/public class AlgoTest {public static void main(String[] args) {new ...
  • 分治法求最大最小值

    千次阅读 2014-09-25 09:38:33
    // 用分治法求最大最小值 public static int getMax(int[] array, int i, int j) { int Max1 = 0; int Max2 = 0; if (i == j) { return Max1 = Max2 = array[j
  • 算法之分治法(java) 1.分治法的设计思想 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 1.1分治算法时间复杂度的递归关系式 递归算法的运行时间通常满足一个递归方程式...
  • C语言实现分治法实例

    2021-05-19 05:40:35
    本文为大家分享了C语言实现分治法实例代码,供大家参考,具体内容如下使用分治法求最大值这个函数将数组a[l]...a[r]分成a[l],...,a[m]和a[m+1],...a[r]两部分,分别出每一部分的最大元素(递归地),并返回较大的那一...
  • 使用分治法的思想:首先把数组分成两部分,在把这两部分中的每一部分分成两部分,一直递归分解直到每一部分小于等于2个数为止,然后比较这两个数,判断最大最小值,然后回弹比较直到递归的最外层,就可以判断最大...
  • 分治法查找最大最小值实验

    千次阅读 2020-04-09 21:19:49
    1.问题描述:输入一组数据,找出其中的最大最小值 2.分治思想: 找数组a范围l~R的最值=> ①范围一分为2 mid=(l+r)/2 ②最大值=max(l~mid最大值,mid+1~r最大值); ③最小值=min(l~mid最小值...
  • 分治法-----找最大值与最小值

    千次阅读 多人点赞 2020-10-31 01:38:56
    在20级新生刷题组中我遇到了用分治法求最大值与最小值的算法题,初看一脸懵,深入 初步的了解中突然发现跟二分法(一次划分)有着惊人的相似,好吧qaq,其实二分法就是属于分治法的一种。 首先,分治法顾名思义,即为...
  • **** 分治法求数组的最小值最大值*/import java.util.Arrays;public class MinAndMaxArray {public static void main(String[] args) {int arr[] = { -2, -9, 0, 5, 2 };int result[] = new int[2];result = min...
  • 分治法可以用较少的比较次数解决寻找最大最小值的问题 将数据等分为两组(两组数据可能差1),目的是分别选取其中的最大(小)值。 递归分解指导每组元素的个数小于等于2,可简单地找到最大(小)值。 回溯时合并...
  • * 分治法得到数组的最大最小值,核心思想在于将数组先划分为两个数组,然后比较两个数组的最大和最小(大的为最大值,小的为最小值) * 然后分治下去,直到数组中的元素为两个时,大的为最大值,小的为最小值。也...
  • 求最大最小值分治法

    千次阅读 2018-03-18 20:55:44
    分治法求找出一个数组A[0], A[1], …, A[N-1]中的最大元素和最小元素。输入:共两行,第一行输入一个整数n,表示数组元素的个数,第二行共输入n个元素。输出:输出两个元素,分别为n个整数中的最大值和最小值。...
  • 分治法求一个整数序列中的最大最小值。 输入 输入有多行,第一行是一个整数n,表示后面有n行。从第二行开始的n行,每行包含用空格隔开的多个整数,第一个整数是m,表示本行后面还有m个用空格隔开整数。 输出 ...
  • 利用分治法快速而有效的出任意数组的最大值与最小值。 编码用C++实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,281
精华内容 4,112
关键字:

分治法求最大最小值

友情链接: Form1.zip