計科班算法設計與分析_第1頁
計科班算法設計與分析_第2頁
計科班算法設計與分析_第3頁
計科班算法設計與分析_第4頁
計科班算法設計與分析_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

算法:是若干條指令組成的有窮序列算法的三個要素1)數據:運算序列中作為運算對象和結果的數據.2)運算::運算算序列中中的各種種運算::賦值,,算術和和邏輯運運算3)控制和和轉移::運算算序列中中的控制制和轉移移.四條性質::輸入、輸輸出、確確定性、有有窮性四條性質::1)輸入::有零個個或多個個由外部部提供的的量作為為算法的的輸入2)輸出::算法產產生至少少一個量量作為輸輸出3)確定性性:組成成算法的的每條指指令是清清晰的,無無歧義的的。4)有限性性:算法法中每條條指令的的執行次次數是有有限的,執執行每條條指令的的時間也也是有限限的。程序:是算算法用某某種程序序設計語語言的具具體實現現算法的復雜雜性:算算法運行行所需要要的計算算機資源源的量時間復雜性性(算法法運行所所需要的的計算機機時間資資源的量量)空間復雜性性(算法法運行所所需空間間資源的的量)時間復雜性性的三種種情況::最壞情情況(可可操作性性最好且且最優實實際價值值)、最最好情況況、平均均情況分治法的設設計思想想:將一一個難以以直接解解決的大大問題,分分割成一一些規模模較小的的相同問問題,以以便各個個擊破,分分而治之之。遞歸:直接接或間接接地調用用自身的的算法。遞歸函數:用函數自身給出定義的函數。階乘函數可可遞歸定定義為::遞歸定義式式:intffacttoriial((inttn)){ if((n===00)rretuurn1; retuurnn**faactooriaal(nn-1));}Fibonnaccci數列列:無窮窮數列11,1,22,3,55,8,113,221,334,55,…,可遞遞歸定義義為遞歸定義式式:intffiboonaccci((inttn)){ if((n<<=11)reeturrn11; retuurnfibbonaaccii(n--1)++fibbonaaccii(n--2);;}Hanoii塔定義義式:voidhannoi((inttn,,inntaa,iintb,inttc)){if(nn<0){hanoii(nn-1,a,c,b);;move(a,,b));hanoii(nn-1,c,b,a);;}}二分搜索算算法的基基本思想想:是將將n個過過元素分分成大致致相同的的兩半,取取a[nn/2]]與x作作比較。合并排序::用分治治法策略略實現對對n個元元素進行行排序的的算法。基本思想是:將待排序元素分成大小大致相同的兩個子集,分別對兩個子集合進行排序,最終將排好序的子集合并成所要求的排好序的集合。動態規劃算算法基本本思想(自底向上、全局最優):講帶求解的問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。與分治法不不同的是是:適用用于動態態規劃法法求解的的問題,經經分解得得到的子子問題往往往不是是互相獨獨立的。最優子結構構性質(問問題的最最優解包包含了其其子問題題的最優優解)子問題重疊疊性質(在在用遞歸歸算法自自頂向下下求解此此問題時時,每次次產生的的子問題題并不總總是新問問題,有有些子問問題被反反復計算算多次)備忘錄方法法(動態規規劃算法法變形)::用表格格保存已已解決的的子問題題的答案案,在下下次需要要解此子子問題時時,只要要簡單地地查看該該子問題題的解答答,而不不必重新新計算。最優二叉搜搜索樹性性質:存存儲于每每個結點點中的元元素x大大于其左左子樹中中任一結結點所存存儲的元元素,小小于其右右子樹中中任一結結點所存存儲的元元素。貪心算法(自頂向下、局部最優):通過一系列的選擇來得到問題的解。它所做的每一個選擇都是當前狀態下局部最好選擇。貪心選擇性性質(所所求問題題的整體體最優解解可以通通過一系系列局部部最優的的選擇來來達到,是是貪心算算法與動動態規劃劃算法的的主要區區別)最有子結構構性質(一一個問題題的最優優解包含含其子問問題的最最優解)哈夫曼編碼碼:是廣廣泛用于于數據文文件壓縮縮的十分分有效的的編碼方方法。最短路徑::給定一一個,其其中每條條邊的權權是非負負實數。一個帶權有向圖一個帶權有向圖11111100601030105020最小生成樹樹性質::用貪心心算法設設計策略略可以設設計出構構造最小小生成樹樹的有效效算法。回溯法(盲盲人爬山山、迷宮宮問題、nn后問題題):在解解問題的的解空間間樹中,按按深度優優先策略略,從根根節點出出發搜索索解空間間樹。基本思想::從開始始結點(根根節點)出出發,以以深度有有限方式式搜索整整個解空空間。分枝限界法法基本思思想:以以廣度優優先或以以最小耗耗費(最最大效益益)優先先的方式式搜索問問題的解解空間樹樹。分枝限界法法求解目目標是找找出滿足足約束條條件的一一個解,或或是滿足足約束條條件的解解中找出出使某一一目標函函數值達達到極大大或極小小的解,即即在某種種意義下下的最優優解。回溯法求解解目標是是找出解解空間中中滿足約約束條件件的所有有解。批處理作業業調度::給定nn個作業業的集合合J==(JJ1,JJ2,……,Jnn)。每每個作業業Ji都都有兩項項任務分分別在兩兩臺機器器上完成成。每個個作業必必須先由由機器11處理,然然后再由由機器22處理。分支限界法法與回溯溯法:分支限限界法與與回溯法法的求解解目標不不同,回回溯法的的求解目目標是找找出求解解空間中中滿足約約束條件件的所有有解,而而分支限限界法求求解的目目標則是是找出滿滿足約束束條件的的一個解解。回溯溯法以深深度優先先的方式式搜索解解空間,而而分支限限界法則則以廣度度優先或或最小耗耗費優先先的方式式搜索空空間。隨機化算法法基本特特征:對對所求解解問題的的同一實實例用同同一隨機機化算法法求解兩兩次可能能得到完完全不同同的效果果。隨機數在隨隨機化算算法設計計中扮演演著十分分重要的的角色。符號三角問問題:#inclludee<sstdiio.hh>#defiineM113#defiineN113Triannglee(chharA[MM][NN]){ intti,,j; prinntf(("\nn輸入入第1行行的數據據:")); for(j==0;jj<N;;j+++) //輸入第第1行的的數據 scaanf(("%cc",&&A[00][jj]);; for(i==1;ii<M;;i+++) //A數組組的第22行以下下清空 forr(jj=0;;j<NN;j+++) A[[i][[j]=='''; i=0;; j=00; whille(ii<M--1) { whhilee(j<<N-11) { iif((A[ii][jj]===A[ii][jj+2]])///如如果上一一行的相相鄰兩符符號相同同 AA[i++1][[j+11]=''+';; //則下一一行的符符號為''+' ellse AA[i++1][[j+11]=''-';; //否則下下一行的的符號為為'-'' j==j+22; } i+++; j=ii; }}voidmaiin()){ intti,,j; charrA[[M][[N];; Triaanglle(AA); for(i==0;ii<M//2+11;i+++) { foor((j=00;j<<N-ii;j+++) prrinttf(""%4cc",AA[i]][j]]); priintff("\\n\nn");; }}

矩陣相乘乘://兩矩矩陣相乘乘#inclludee<sstdiio.hh>#defiineM22#defiineN33MatriixMuultiiplyy(inntAA[M]][N]],inntBB[N]][M]],inntCC[M]][M]]){ intti,,j,kk,suum; for(i==0;ii<M;;i+++) forr(jj=0;;j<MM;j+++) { summ=0;; foor((k=00;k<<N;kk++)) ssum==summ+A[[i][[k]**B[kk][jj]; C[[i][[j]==summ; }}voidmaiin()){ inttA[[M][[N],,B[NN][MM],CC[M]][M]],i,,j,kk; for(i==0;ii<M;;i+++) //輸入66個整數數給矩陣陣A forr(jj=0;;j<NN;j+++) sccanff("%%d",,&A[[i][[j])); for(i==0;ii<N;;i+++) //輸入66個整數數給矩陣陣B forr(jj=0;;j<MM;j+++) sccanff("%%d",,&B[[i][[j])); MatrrixMMulttiplly(AA,BB,CC); prinntf(("\nn兩矩矩陣相乘乘的的結結果如下下:\nn\n""); for(i==0;ii<M;;i+++) { foor((j=00;j<<M;jj++)) prrinttf(""%4dd",CC[i]][j]]); priintff("\\n\nn");; }}二分搜索算算法:是是用分支支策略的的典型例例子,需需要先排排序。#inccludde<<stddio..h>#deffineeMAAXLEEN111typeddefstrructt{ inttkeey;} typpe_eelemmentt;intbbinaary__seaarchh(tyype__eleemenntrr[],,inttkeey){ inttleeft==1,rrighht=MMAXLLEN,,midddlee; whille((lefft<==rigght)) { miiddlle=((lefft+rrighht)//2; if(r[[midddlee].kkey===keey) reeturrnmmidddle;; if(r[[midddlee].kkey>>keyy) riightt=miiddlle-11;//在右半半部繼續續查找 elsse leeft==midddlee+1;;//在右半部繼繼續查找找 } retuurn-1;;}voidmaiin()){ intti,,j,kkey;; typee_ellemeenttemmp,rr[MAAXLEEN+11]={{0,99,133,155,300,377,555,600,755,800,900,922}; for(i==1;ii<MAAXLEEN;ii++)) //對數組組進行排排序 forr(jj=i++1;jj<=MMAXLLEN;;j+++) iff(rr[i]].keey>rr[j]].keey) { temmp=rr[i]]; rr[i]]=r[[j];; rr[j]]=teemp;; } for(i==1;ii<=MMAXLLEN;;i+++) priintff("%%3d"",r[[i]..keyy); prinntf(("\nn\n輸入欲欲查找的的數據::");; scannf(""%d"",&kkey)); i=biinarry_ssearrch((r,kkey)); if((i===-1)) priintff("\\n已已經查找找完,尚尚未找到到該數!!\n\\n")); elsee priintff("\\n\nn已找找到,其其序號是是:%dd\nn\n"",i));}

快速排序序:#inclludee<sstdiio.hh>#inclludee<sstdllib..h>#defiineMAXXLENN100intpparttitiion((inttr[[],iints,iintt) { intti,,j,rrp; i=s;; j=t;; //一一趟快速速排序,將將基準記記錄移到到正確位位置 rp=rr[s]]; //基基準記錄錄暫存rp中 whille(ii<j)) //從從序列的的兩端交交替向中中間掃描描 { whhilee(i<<j&&&rr[j]]>=rrp) //掃掃描比基基準記錄錄小的位位置 j---; r[ii]=rr[j]]; //將將比基準準記錄小小的數據據移到低低端 whiile((i<jj&&&r[[i]<<=rpp) //掃掃描比基基準記錄錄大的位位置 i+++; r[jj]=rr[i]]; //將將比基準準記錄大大的數據據移到高高端 } r[i]]=rpp; //基基準記錄錄到位 retuurni;}voidQuiickSSortt(inntrr[],,intts,,inttt)) //快快速排序序遞歸算算法{ inttk;; if((s<tt) //長長度達于于1 { k==parrtittionn(r,,s,tt); //調調用一趟趟快速排排序算法法將r[[s]...r[[t]一一分為二二 QuiickSSortt(r,,s,kk-1)); //對對低端子子序列遞遞歸排序序,k是是支點位位置 QuiickSSortt(r,,k+11,t)); //對對高端子子序列遞遞歸排序序 }}voidmaiin()){ intti;; intr[MMAXLLEN]]; prinntf(("\nn請輸輸入%dd個整數數:",,MAXXLENN); for(i==0;ii<MAAXLEEN;ii++)) scaanf(("%dd",&&r[ii]);; QuicckSoort((r,00,MAAXLEEN-11); prinntf(("\nn快速速排序的的結果如如下:\\n\nn");; for((i=00;i<<MAXXLENN;i+++) priintff("%%3d"",r[[i])); prinntf(("\nn\n"");}循環賽日程程表:#inclludee<sstdiio.hh>#defiineMAXXLENN8voidmaiin()){ intti,,j; intx[MMAXLLEN++1][[MAXXLENN+1]]={00}; //數組清清零 for(i==1;ii<=MMAXLLEN;;i+++) ///產產生第11列數據據 x[ii][11]=ii; for(i==1;ii<=MMAXLLEN;;i+++) ///產產生第22列數據據 if(i%22!==0) x[[i][[2]==x[ii+1]][1]]; ///產產生奇數數行的第第2列的的數據 elsse x[[i][[2]==x[ii-1]][1]]; ///產產生偶數數行的第第2列的的數據 for((i=11;i<<=8;;i+++) ///產產生左半半部表中中的右半半部分 forr(jj=1;;j<==2;jj++)) { iif((i===1|||ii==22|||i===5||i===6) xx[i++2][[j+22]=xx[i]][j]]; ellse xx[i--2][[j+22]=xx[i]][j]]; } for((i=11;i<<=8;;i+++) //產生生右半部部表的數數據 forr(jj=1;;j<==4;jj++)) { if((i<==4) xx[i++4][[j+44]=xx[i]][j]]; ellse xx[i--4][[j+44]=xx[i]][j]]; } prinntf(("\nn循環環賽日程程表如下下:\nn\n""); for(i==1;ii<=MMAXLLEN;;i+++) ///輸出該該表 { foor((j=11;j<<=MAAXLEEN;jj++)) prrinttf(""%6dd",xx[i]][j]]); priintff("\\n\nn");; }}

最大公約數數:intggcd((inttm,,inttn)){ intr; whille(nn!=00){ r==m%nn; m==n;; n==r;; } retuurnm;}最小公倍數數:intggcm((inttm,,inttn)){ intti,,k,ff; if((m<nn)///交交換m與與n { i==m; m=nn; n=ii; } f=1;; if((m%nn==00) { f==f*mm; retturnnf;; } i=2;; k=(iint))(sqqrt((n)));///求nn的平方方根取整整數 whille(ii<=kk) { iff(((m%ii==00)&&&(n%%i===0))) { ff=f**i; m==m/ii; n==n/ii; i==2; } elssei+++; } f=f**m*nn; retuurnf;}冒泡排序:://交交換排序序中的冒冒泡排序序法#inccludde<<stddio..h>#deffineeLEENGTTH110voidmaiin()){ inntii,j,,k,ttempp; intr[LLENGGTH]]; for(i==0;ii<LEENGTTH;ii++)) scaanf(("%dd",&&r[ii]);; //輸入入10個個整數 for(i==1;ii<=LLENGGTH--1;ii++))//共共進行LENNGTHH-1趟排序序 { k==0; forr(jj=0;;j<LLENGGTH--i;jj++))//第第i趟排序序比較的的次數 iff(rr[j]]>r[[j+11])///若相相鄰兩記記錄的關關鍵字逆逆序, { k+++; ///則則互相交交換 temmp=rr[j]]; r[jj]=rr[j++1];; r[jj+1]]=teemp;; } iff(kk==00) //說明該該趟沒有有發生交交換 bbreaak; //跳出該該層循環環 } for((i=00;i<<LENNGTHH;i+++) priintff("%%3d"",r[[i]));///輸輸出排序序結果}

素數判斷::intnnumbber;; ///nnumbber為全局局變量boolpriime((inttx)){ intti,,k; k=sqqrt((x);; for(i==2;ii<=kk;i+++) ///如果果X能被被2-----ssqrtt(x))中的的任何一一個整數數整除, if(x%%i===0) // 則X不不是素數數,因此此應跳出出該層循循環 reeturrnffalsse; retrruntruue; //表示示X未被被2-----ssqrtt(x))中的的任何一一個整數數整除}素數因子分分解:#inclludee<sstdiio.hh>#inclludee<mmathh.h>>#defiineN1100voidmaiin()){ intti,,j,kk,x,,y,ssievve_AA[N++1],,sieeve__B[NN+1]],siievee_C[[N+11]; scannf(""%d"",&xx); //輸入一一個1000以內內的非負負整數 y=x; if(xx<0)) retturnn; //輸入整整數是負負數 for((i=22;i<<=x;;i+++) //設置ssievve_AA篩中數數據22~X sieeve__A[ii]=ii; k=(iint))sqrrt(xx); for((i=22;i<<=k;;i+++) { j==i*ii; whiile((j<==x) { iif((sieeve__A[jj]!==0) // 定位i的的倍數處處 ssievve_AA[j]]=0;; // 篩去i的的倍數即即將其變變為00 j==j+ii; // 求出i的的下一個個倍數 } } j=0;; for(i==2;ii<=xx;i+++) // 將siievee_A篩篩中的素素數賦給給sieeve__B篩子子 if(siievee_A[[i]!!=0)) { ssievv

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論