分治法查找最大最小值
程序员文章站
2022-05-12 15:17:28
...
实验目的
利用分治法查找数组元素的最大值与最小值,并计算出程序运行所需要的时间,得到不同规模数据实验的时间对比,并进行时间复杂度分析。
实验原理
使用分治法,根据不同的输入用例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;
}