算法设计与分析第1章 算法概述
第1章 算法概述(窮舉算法)
重要人物:Alan Turing(圖靈機(jī))、Donald Knuth(TEX系統(tǒng))
算法:解決問題的一種方法或一個(gè)過程
特性:有窮性(Finiteness)、確定性(Definiteness)、可行性(effectiveness)、輸入(Input)、輸出(Output)
程序:算法+數(shù)據(jù)結(jié)構(gòu)
計(jì)算時(shí)間的漸進(jìn)表示:
多項(xiàng)式時(shí)間算法(polynomial time algorithm):O(1) < O(logn) < O(n) < O(nlogn) < O(n2)< O(n3)
指數(shù)時(shí)間算法(exponential time algorithm):O(2n) < O(n!) < O(nn)
算法復(fù)雜性:算法所需要的計(jì)算機(jī)資源
時(shí)間復(fù)雜性:隨著問題規(guī)模n的增大,算法運(yùn)行時(shí)間與問題規(guī)模n的某個(gè)函數(shù)f(n)增長率相同,記時(shí)間復(fù)雜度為T(n)=O(f(n))
空間復(fù)雜性:算法所需空間大小,記為S(n)=O(f(n)),不消耗輔助空間的操作稱為原地操作
漸近分析的記號:漸進(jìn)上界記號O、漸進(jìn)下界記號Ω\OmegaΩ、非緊上界記號o、非緊下界記號ω\omegaω、緊漸近界記號Θ\ThetaΘ
窮舉算法
例1. 雞翁一值錢5,雞母一值錢3,雞雛三值錢1。百錢買百雞,問雞翁、母、雛各幾何?
Cock+Hen+Chick=100
Cock5+Hen3+Chick/3=100
代碼:
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{int x,y,z;x=0;while(x<=20){y=0;while(y<34){z=100-x-y;if((5*x+3*y+z*1.0/3)==100){printf("Cock is %d,Hen is %d,Chick is %d\n",x,y,z);}y++;}x++;}return 0;
}
例2. Google方程式
有一個(gè)字符組成的等式:WWWDOT - GOOGLE = DOTCOM
1)每個(gè)字符代表一個(gè)0-9之間的數(shù)字;
2)WWWDOT、GOOGLE和DOTCOM都是合法的數(shù)字;
3)不能以0開頭。請找出一組字符和數(shù)字的對應(yīng)關(guān)系,使它們互相替換,并且替換后的數(shù)字能夠滿足等式.
代碼1:
/*暴力搜索(窮舉)
*/
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{int w,d,o,t,g,l,e,c,m;int A,B,C;w=1;while(w<=9){d=1;while(d<=9){if(d==w){d++;continue;}o=0;while(o<=9){if(o==w||o==d){o++;continue;}t=0;while(t<=9){if(t==w||t==d||t==o){t++;continue;}g=1;while(g<=9){if(g==w||g==d||g==o||g==t){g++;continue;}l=0;while(l<=9){if(l==w||l==d||l==o||l==t||l==g){l++;continue;}e=0;while(e<=9){if(e==w||e==d||e==o||e==t||e==g||e==l){e++;continue;}c=0;while(c<=9){if(c==w||c==d||c==o||c==t||c==g||c==l||c==e){c++;continue;}m=0;while(m<=9){if(m==w||m==d||m==o||m==t||m==g||m==l||m==e||m==c){m++;continue;}A=w*100000+w*10000+w*1000+d*100+o*10+t;B=g*100000+o*10000+o*1000+g*100+l*10+e;C=d*100000+o*10000+t*1000+c*100+o*10+m;if(A==(B+C)){cout<<"answer: "<<A<<" - "<<B<<" = "<<C<<endl;}m++;}c++;}e++;}l++;}g++;}t++;}o++;}d++;}w++;}return 0;
}
代碼2:
/*遞歸搜索(回溯)
*/
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef struct tagcharitem //數(shù)據(jù)結(jié)構(gòu)
{char c;int value;
} charitem; charitem a[]= //初始化
{{'W',-1},{'D',-1},{'O',-1},{'T',-1},{'G',-1},{'L',-1},{'E',-1},{'C',-1},{'M',-1}
};int mark[10]; //標(biāo)記數(shù)組void search(int cnt) //對字母進(jìn)行搜索 最后判斷下
{if(cnt==10){int sum1=a[0].value*1e5+a[0].value*1e4+a[0].value*1e3+a[1].value*1e2+a[2].value*10+a[3].value;int sum2=a[4].value*1e5+a[2].value*1e4+a[2].value*1e3+a[4].value*1e2+a[5].value*10+a[6].value;int sum3=a[1].value*1e5+a[2].value*1e4+a[3].value*1e3+a[7].value*1e2+a[2].value*10+a[8].value;if(sum1-sum2==sum3)cout<<sum1<<"-"<<sum2<<"="<<sum3<<endl;return;}for(int i=9; i>=0; i--) //為字母賦值,W更可能為較大值{if(mark[i]!=0) continue;if((cnt==0||cnt==4||cnt==2)&&i==0) continue; //剪枝:開頭為0a[cnt].value=i;mark[i]=1;search(cnt+1);a[cnt].value=-1;mark[i]=0;}
}int main()
{memset(mark,0,sizeof(mark));search(0);return 0;
}
總結(jié)
以上是生活随笔為你收集整理的算法设计与分析第1章 算法概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷残疾证免费吗
- 下一篇: 冷暖自知的个性签名名