寻找极小值(C百例)

来源:互联网 发布:手机淘宝怎么降价通知 编辑:程序博客网 时间:2024/05/15 23:50
原问题来源于《C语言精选名题百则-技巧篇》
描述:


因为和顺序相关,所以初步估计和二分有关。自己干脆写一个普通的查找和二分做一个效率上的对比(先输出对应最小数再输出查找的时间):
产生数据:
#include <iostream>#include<cstdio>using namespace std;int main(int argc, char *argv[]) {freopen("cout.txt","w",stdout);cout<<1000000<<endl;int i;for(i=1;i<=999992;i++)cout<<i<<" ";for(;i<=1000000;i++)cout<<i-1000004<<" "; cout<<endl;        cout<<10000000<<endl;for(i=1;i<=10000000;i++)cout<<i<<" ";   cout<<endl;        cout<<100<<endl;for(i=1;i<100;i++)cout<<i<<" "; cout<<-1<<endl;return 0;}


普通方法:

#include <iostream>#include<cstdio>#include<cstring>#include<time.h>using namespace std; int a[10000005],n;int main(int argc, char *argv[]) {freopen("cin.txt","r",stdin);freopen("cout.txt","w",stdout);while(cin>>n){memset(a,0,sizeof(a));int i;    for(i=0;i<n;i++)scanf("%d",&a[i]);    clock_t start;    start=clock();    for(i=1;i<n&&a[i]>a[i-1];i++);    if(i==n)i=0;    printf("%d\n",a[i]);    printf("%.8lf\n",(double)(clock()-start)/CLOCKS_PER_SEC);}return 0;}
输出:

-11
0.00400000
1
0.04800000
-1
0.00000000

二分:

#include <iostream>#include<cstdio>#include<cmath>#include<time.h>using namespace std;int a[10000005],n;int midfind(){    int low=0,high=n+1,mid,res=-1;    int count=0,depth=int(log2(n)+1);    //while(low<=high){    while(low<n&&high>1){    if(count>depth)break;        mid=(low+high)/2;        count++;        if(a[mid]<a[mid-1]){    res=mid;            break;        }        if(a[mid]>a[0])low=mid;        else if(a[mid]<a[0])high=mid;    }    return res;}int main(){    freopen("cin.txt","r",stdin);    freopen("cout.txt","w",stdout);    while(cin>>n){          int i;          for(i=1;i<=n;i++)scanf("%d",&a[i]);          clock_t start;          start=clock();          int dex=midfind();          if(dex==-1)dex=1;          printf("%d\n",a[dex]);          printf("%.8lf\n",(double)(clock()-start)/CLOCKS_PER_SEC);    }    return 0;}

输出:

-11
0.00000000
1
0.00000000
-1
0.00000000

嘿嘿,看来还是折半好用。

0 0