版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、算法效率與程序優(yōu)化在信息學(xué)競(jìng)賽中,常遇到程序運(yùn)行超時(shí)的情況。然而,同一個(gè)程序設(shè)計(jì)思想,用不同算法,會(huì)有不同的運(yùn)行效率;而即使是同樣的算法,由于在代碼的細(xì)節(jié)方面設(shè)計(jì)有所不同,執(zhí)行起來(lái)效率也會(huì)有所不同。當(dāng)遇到所需時(shí)間較長(zhǎng)的問題時(shí),一個(gè)常數(shù)級(jí)優(yōu)化可能是AC的關(guān)鍵所在。下面,我們就從代碼細(xì)節(jié)與算法設(shè)計(jì)兩方面,比較不同程序執(zhí)行時(shí)間的異同,從而選擇其中較優(yōu)的算法,提高程序運(yùn)行效率。本試驗(yàn)所所采用的的環(huán)境是是: CCPU Celleroon 33.066GHzz,內(nèi)存存2488M,操操作系統(tǒng)統(tǒng)Winndowws XXP SSP2,程序語(yǔ)語(yǔ)言C。編譯環(huán)環(huán)境Deev-cc+。以下稱稱為1號(hào)號(hào)機(jī)。配配置略好好于N
2、OOIP標(biāo)標(biāo)準(zhǔn)測(cè)試試機(jī)CPPU 22.0GGHz。第一章 各種運(yùn)運(yùn)算的速速度一、基本本運(yùn)算的速速度為了增強(qiáng)強(qiáng)算法效效率的計(jì)計(jì)算準(zhǔn)確確性,我我們采用用重復(fù)試試驗(yàn)200次取平平均值的的做法。每次試試驗(yàn)運(yùn)行行100000000000次?;具\(yùn)行行時(shí)間,是指在在準(zhǔn)備計(jì)計(jì)算的運(yùn)運(yùn)算復(fù)雜雜度之外外,只包包括循環(huán)環(huán)控制變變量的加加減與比比較所消消耗的時(shí)時(shí)間。要要從實(shí)際際運(yùn)行時(shí)時(shí)間中減減去基本本運(yùn)行時(shí)時(shí)間,才才是這種種運(yùn)算真真正的運(yùn)運(yùn)行時(shí)間間,稱為為凈運(yùn)行行時(shí)間。#inccluddemainn() innt ii,j; dooublle aa,b,summ=0; foor(jj=0;j220;jj+) /此此
3、處添加加隨機(jī)數(shù)數(shù)產(chǎn)生 a=cclocck(); forr(i=0;ii100000000000;ii+);/此處添添加運(yùn)算算 b=cclocck(); priintff(%lfn,b-aa); summ+=bb-a; prrinttf(anss = %lff,ssum/20.0); geetchh();運(yùn)行平均均時(shí)間是是:2002.33ms。(1)賦賦值運(yùn)算算凈運(yùn)行時(shí)時(shí)間0.8mss,與基基本運(yùn)行行時(shí)間2202.3mss相比,可忽略略不計(jì),故以后后將賦值值運(yùn)算作作為基本本運(yùn)行時(shí)時(shí)間的一一部分,不予考考慮。(2)加加法運(yùn)算算 產(chǎn)生隨隨機(jī)數(shù): x=rrandd();y=raand();循環(huán)內(nèi)加加法
4、:t=x+y;下面的各各種簡(jiǎn)單單運(yùn)算只只是更改改運(yùn)算符符即可,不再寫寫出代碼碼。凈運(yùn)行時(shí)時(shí)間411.455ms,即:在在1s的的時(shí)限中中,共可可進(jìn)行 (10000-2022.3)/ 441.445*11088=1.99*1009次次加法運(yùn)運(yùn)算,即即:只通通過循環(huán)環(huán)、加法法和賦值值的運(yùn)算算次數(shù)不不超過11.9*109.。而應(yīng)用+=運(yùn)算算,與普普通加法法時(shí)間幾幾乎相同同,所以+=只是一一種方便便書寫的的方法,沒有實(shí)實(shí)質(zhì)效果果。同樣的的,各種種自運(yùn)算算并不能能提高效效率。(3)減減法運(yùn)算算 凈運(yùn)行行時(shí)間442.995mss,與加加法運(yùn)算算基本相相同??梢姡谟?jì)算算機(jī)內(nèi)部部實(shí)現(xiàn)中中,把減減法變成成加法
5、的的求補(bǔ)碼碼過程是是較快的的,而按按位相加加的過程程占據(jù)了了較多的的時(shí)間,借用化化學(xué)中的的一句術(shù)術(shù)語(yǔ),可可以稱為為整個(gè)運(yùn)運(yùn)算的“速控步步”。當(dāng)然,這個(gè)“速控步步”的運(yùn)行行速度受受計(jì)算機(jī)機(jī)本身制制約,我我們無(wú)法法優(yōu)化。在下面面的算法法設(shè)計(jì)中中,還會(huì)會(huì)遇到整整個(gè)算法法的“速控步步”,針對(duì)對(duì)這類情情況,我我們要對(duì)對(duì)占用時(shí)時(shí)間最多多的步驟驟進(jìn)行細(xì)細(xì)心優(yōu)化化,減少少常數(shù)級(jí)級(jí)運(yùn)算次次數(shù)。(4)乘乘法運(yùn)算算凈運(yùn)行時(shí)時(shí)間58.255ms,明顯比比加減法法要慢,但不像像某些人人想象的的那樣慢慢,至少少速度大大于加減減法的11/2。所以在在實(shí)際編編程時(shí),沒有必必要把兩兩個(gè)或三三個(gè)加法法變成乘乘法,其其實(shí)不如如元素
6、乘乘常數(shù)來(lái)來(lái)得快。不必“談乘色色變”,實(shí)際際乘法作作為CPPU的一一種基本本運(yùn)算,速度還還是很快快的。以上四種種運(yùn)算速速度都很很快,比比循環(huán)所所需時(shí)間間少很多多,在普普通的算算法中,每個(gè)最內(nèi)內(nèi)層循環(huán)環(huán)約含有有4-55個(gè)加、減、乘乘運(yùn)算,故整個(gè)個(gè)算法的的運(yùn)行時(shí)時(shí)間約為為循環(huán)本本身所需需時(shí)間的的2倍。(5)除除法運(yùn)算算凈運(yùn)行時(shí)時(shí)間12210.2mss,是四四種常規(guī)規(guī)運(yùn)算中中最慢的的一種,耗時(shí)是是加法的的28倍倍,是乘乘法的221.55倍,確確實(shí)如常常人所說說“慢幾十十倍”,一秒秒的時(shí)限限內(nèi)只能能運(yùn)行88.266*1007次次,不足足一億次次,遠(yuǎn)大大于循環(huán)環(huán)時(shí)間。所以,在計(jì)算算時(shí)應(yīng)盡盡量避免免除法,
7、尤其是是在對(duì)時(shí)時(shí)間要求求較高的的內(nèi)層循循環(huán),盡盡量不安安排除法法,如果果整個(gè)循循環(huán)中值值不變,可以使使用在循循環(huán)外預(yù)預(yù)處理并并用一個(gè)個(gè)變量記記錄,循循環(huán)內(nèi)再再調(diào)用該該變量的的方法,可以大大大提高高程序運(yùn)運(yùn)行效率率。(6)取取模運(yùn)算算凈運(yùn)行時(shí)時(shí)間11178.15mms,與與除法運(yùn)運(yùn)算速度度幾乎相相當(dāng),都都非常慢。所以,取模運(yùn)運(yùn)算也要要盡量減減少。在在大數(shù)運(yùn)運(yùn)算而只只要求求求得MOOD NN的值的題題目中,應(yīng)盡量量利用數(shù)數(shù)據(jù)類型型的最大大允許范范圍,在在保證不不超過MMAXIINT的的前提下下,盡量量少執(zhí)行行MODD運(yùn)算。例如在循循環(huán)數(shù)組組、循環(huán)環(huán)隊(duì)列的的應(yīng)用中中,取模模運(yùn)算必必不可少少,這時(shí)時(shí)優(yōu)
8、化運(yùn)運(yùn)算便十十分重要要??衫糜?jì)數(shù)數(shù)足夠一一定次數(shù)數(shù)后再統(tǒng)統(tǒng)一MOOD,循循環(huán)完后后再M(fèi)OOD,使使用中間間變量記記錄MOOD結(jié)果果等方法法減少次次數(shù)。在高精度度計(jì)算中中,許多多人喜歡歡邊運(yùn)算邊整整理移位位,從而而在內(nèi)層層循環(huán)中中有除、模運(yùn)算算各一次次,效率率極低。應(yīng)該利利用innt的數(shù)數(shù)據(jù)范圍圍,先將將計(jì)算結(jié)結(jié)果保存存至當(dāng)前前位,在在各位的的運(yùn)算結(jié)結(jié)束后再再統(tǒng)一整整理。以下是用用統(tǒng)一整整理法編編寫的高高精度乘乘法函數(shù)數(shù),規(guī)模模為1000000位。int a1100000=0,b100000=00,cc1000000=0;voidd muul() innt ii,j,t; foor(ii=0
9、;i1100000;ii+) ffor(j=00;j100000-i;jj+) cii+j+=aai*bj; foor(ii=0;i999999;i+) cii+1+=cci/100; cii%=10; 以上函數(shù)數(shù)運(yùn)行后后,平均均用時(shí)2276.55mms。以下是邊邊運(yùn)算邊邊整理的的程序。voidd muul() innt ii,j,t; foor(ii=0;i1100000;ii+) ffor(j=00;jy) x=y;凈運(yùn)行時(shí)時(shí)間399.1mms,與與加法運(yùn)運(yùn)算速度度相當(dāng)。故比較較運(yùn)算也也屬于較較快的基基本運(yùn)算算。二、位運(yùn)運(yùn)算的速速度(1)左左移、右右移x11;凈運(yùn)行時(shí)時(shí)間無(wú)法法測(cè)出,證明位
10、位運(yùn)算速速度極快快。而使用用自乘計(jì)計(jì)算需要要64.1mss,自除除運(yùn)算需需要1664.885mss,所以以盡可能能使用位位運(yùn)算代代替乘除除。(2)邏邏輯運(yùn)算算t=x|y; t=xxy; t=x&yy;凈運(yùn)行時(shí)時(shí)間約30mss,比加加法運(yùn)算算(約440mss)快較多,是是因?yàn)槿前炊M(jìn)制位位計(jì)算。但加減減與位運(yùn)運(yùn)算關(guān)系系并不大大,所以以利用位位運(yùn)算主主要是利利用左右右移位的的高速度度。三、數(shù)組組運(yùn)算的的速度(1)直直接應(yīng)用用數(shù)組for(i=00;i100000;i+) ffor(k=00;k100000;k+) t=qkk;凈運(yùn)行時(shí)時(shí)間399.855ms。這里計(jì)計(jì)算了內(nèi)內(nèi)層循環(huán)環(huán)的時(shí)間間。若
11、改改為for(i=00;i100000000000;i+) t=q00;則凈運(yùn)行行時(shí)間為為1.550mss,很快快,與2202.3mss的循環(huán)環(huán)時(shí)間相相比,可可以忽略略。故應(yīng)應(yīng)用數(shù)組組,速度度很快,不必?fù)?dān)擔(dān)心數(shù)組組尋址耗耗時(shí)。同同時(shí)我們們發(fā)現(xiàn),循環(huán)耗耗時(shí)在各各種運(yùn)算算中是很很大的,僅次于于乘除,故我們們要盡量量減少循循環(huán)次數(shù)數(shù),能在在一個(gè)循循環(huán)中解解決的問問題不放放在兩個(gè)個(gè)循環(huán)中中,減少少循環(huán)變變量次數(shù)數(shù)。(2)二二維數(shù)組組for(i=00;i50000;ii+) foor(kk=0;k550000;k+) t=zzik;實(shí)際運(yùn)行行時(shí)間為為80.45mms,若若規(guī)模擴(kuò)擴(kuò)至1000000則100
12、s內(nèi)無(wú)無(wú)法出解解,由于于頻繁訪訪問虛擬擬內(nèi)存??梢栽囋囅?,若若物理內(nèi)內(nèi)存足夠夠大,則則運(yùn)行時(shí)時(shí)間約為為3200ms,僅為為2022.3mms的基基準(zhǔn)運(yùn)行行時(shí)間的的3/22,差距距似乎并不不是很大大;由此此推得其其凈運(yùn)行行時(shí)間約約為1220mss。但相相較加、減等簡(jiǎn)簡(jiǎn)單操作作,速度度仍為33倍,尤尤其與幾幾乎不需需時(shí)間的的一維數(shù)數(shù)組相比比差距巨巨大。尤尤其是在在計(jì)算中中,二維維數(shù)組元元素經(jīng)常常調(diào)用,時(shí)間效效率不可可忽視。所以,對(duì)于已已知數(shù)目目不多的的同樣大大小的數(shù)數(shù)組,可可用幾個(gè)個(gè)變量名名不同的的一維數(shù)數(shù)組表示示,如xx、y方方向,兩兩種不同同參數(shù),而不要要濫用二二維數(shù)組組。在滾滾動(dòng)數(shù)組組中,可
13、可用兩個(gè)個(gè)數(shù)組交交替計(jì)算算的方式式,用二二維數(shù)組組同樣較較慢。四、實(shí)數(shù)數(shù)運(yùn)算的的速度測(cè)試方法法與“基本運(yùn)運(yùn)算”類似。(次數(shù)數(shù):100000000000,單單位:mms)運(yùn)算符=+-*/%longg intt43.00531.33-74.7569.555299.65360.5int66441.44514.9957.9566.412433.45518588.855doubble46.11510.22512.6633.66517533.555-由上表可可見,涉涉及乘除除、取模模時(shí)innt644很慢,要慎用用;innt顯然然最快,但對(duì)大大數(shù)據(jù)要要小心越越界。若若一組變變量中既既有超出出intt的,又又
14、有不超超過innt的,則要分分類處理理,不要要直接都都定義成成intt64,尤其在在乘除模模較多的的高精度度過程中中。以上討論論了主要要基本運(yùn)運(yùn)算的速速度問題題。概括括起來(lái)說說,除、模最慢慢,二維維數(shù)組較較慢,加加減乘、邏輯位位運(yùn)算、比較大大小較快快,左右右移位、一維數(shù)數(shù)組、賦賦值幾乎乎不需要要時(shí)間。而循環(huán)環(huán)forr或whhilee語(yǔ)句十分分特殊,它的運(yùn)運(yùn)算速度度大于判判斷大小小、自加加控制變變量所用用時(shí)間之之和,無(wú)無(wú)論采用用內(nèi)部iif判斷斷退出,還是在在入口處處判斷,都回用用去約2200mms的時(shí)時(shí)間。所所以盡量量減少循循環(huán)次數(shù)數(shù),是優(yōu)優(yōu)化算法法的關(guān)鍵鍵。對(duì)于于雙層或或多層的的循環(huán),應(yīng)把循循
15、環(huán)次數(shù)數(shù)少的放放在最外外層,最最大的循循環(huán)位居居最內(nèi)部部,以減減少內(nèi)層層循環(huán)的的執(zhí)行次次數(shù)。第二章 各種算算法的速速度一、排序序算法的的速度1.冒泡泡排序for(i=00;i200000;i+) aai=raand();s=cllockk();for(i=00;in;ii+) foor(jj=0;jaaj) tt=ai; aai=aj; aaj=t; b=cclocck();運(yùn)行時(shí)間間:14407mms2.選擇擇排序for(i=00;i200000;i+) ai=rannd(); s=cloock(); foor(ii=0;inn;i+) maxx=0; forr(j=0;jjammax) m
16、max=j; bii=aamaax; ammax=-1100000000; t=cloock();運(yùn)行時(shí)間間:12220mms3.插入入排序for(i=00;i200000;i+) ai=rannd(); s=cclocck(); foor(ii=0;i=0;j-) iff(ajt) bbreaak; forr(l=i;llj+1;ll-) al=all-1; ajj+1=t; t=cclocck();運(yùn)行時(shí)間間:9844ms以上三種種都是OO(n2)的的排序,其中插插入排序序最快,且可以以用指針針加以優(yōu)優(yōu)化。從從編程復(fù)復(fù)雜度上上,冒泡泡排序最最簡(jiǎn)單。從算法法的穩(wěn)定定性上,插入排排序是穩(wěn)穩(wěn)定的
17、,即排序序后關(guān)鍵鍵字相同同的記錄錄順序不不改變,特別適適用于表表達(dá)式處處理等問問題。一般的的選擇排排序是不不穩(wěn)定的的,但這這里給出出的程序序由于使使用了人人類最原原始的方方法,即即依次選選擇最大大的并排除,故是穩(wěn)穩(wěn)定的。冒泡排排序是不不穩(wěn)定的的,涉及及必須保保持?jǐn)?shù)據(jù)據(jù)原順序序的題目目時(shí)不能能選擇冒冒泡排序序,而必必須選擇擇穩(wěn)定的的排序方方式。以下試驗(yàn)驗(yàn)所采用用的環(huán)境境是: CPUU Inntell Coore 1.773GHHz*22,內(nèi)存存5122M,操作作系統(tǒng)WWinddowss 7 Ulttimaate Betta,程程序語(yǔ)言言C。編編譯環(huán)境境Devv-c+,以以下稱為為2號(hào)機(jī)機(jī)。由于C
18、CPU速速度較慢慢,且操操作系統(tǒng)統(tǒng)占用資資源較多多,程序序運(yùn)行速速度明顯顯減慢,第一章章的“基本運(yùn)運(yùn)行測(cè)試試”需要時(shí)時(shí)間約為為前者的的2倍,即為4406mms。故故第一章章的程序序運(yùn)行時(shí)時(shí)間此處處應(yīng)乘22。4.快速速排序的的標(biāo)準(zhǔn)版#deffinee MAAX 11000000000int aMMAX;int p(iint l,iint r) innt xx=al,i=ll-1,j=rr+1,t; whhilee(1) do-jj; whhilee(ajx); if(ijj) tt=ai;aii=aaj;aj=t; elsse rretuurn j; voidd q(intt l,intt r)
19、 innt nn; iff(lr) n=pp(l,r); q(ll,n); q(nn+1,r); 運(yùn)行時(shí)間間:29948mss。注意意:不要要以為三三種平方方級(jí)排序序方法的的速度與與快速排排序可比比擬,因因?yàn)槠椒椒郊?jí)的數(shù)數(shù)據(jù)范圍圍是1000000,而快快速排序序的范圍圍是10000000000。對(duì)于1100000的數(shù)數(shù)據(jù),快快速排序序只需33.1mms。另另外,快快速排序序不是穩(wěn)穩(wěn)定的排排序,需需要保持持原順序序的不能能用此法法。voidd p(intt l,intt r) innt xx=al,i=ll-1,j=rr+1,t; iff(lr) whhilee(1) do-jj; whhile
20、e(ajx); if(ijj) tt=ai;aii=aaj;aj=t; elsse bbreaak; p(l,jj); p(j+11,r); 若程序改改為以上上形式,則運(yùn)行行時(shí)間為為29117mss,稍快快了一些些,是因因?yàn)闇p少少了函數(shù)數(shù)調(diào)用次次數(shù)。對(duì)對(duì)于函數(shù)數(shù)調(diào)用,我們進(jìn)進(jìn)行這樣樣的測(cè)試試。s=cllockk();for(i=00;i100000000000;i+) ttestt();t=cllockk();int tesst() innt nn; n+;凈運(yùn)行時(shí)時(shí)間2000mssint tesst() innt nn;凈運(yùn)行時(shí)時(shí)間844msint tesst()凈運(yùn)行時(shí)時(shí)間10ms由此可見
21、見,調(diào)用用函數(shù)本本身并不不浪費(fèi)時(shí)時(shí)間,僅僅相當(dāng)于于循環(huán)本本身時(shí)間間4000ms的的1/440,相相當(dāng)于加加法800ms的的1/88,是很很快的運(yùn)運(yùn)算。但由于于在函數(shù)內(nèi)內(nèi)部需要要進(jìn)行現(xiàn)現(xiàn)場(chǎng)保護(hù)護(hù),調(diào)用用系統(tǒng)堆堆棧,所所以用時(shí)時(shí)大幅增增加,定定義變量量后只是是一個(gè)自自增運(yùn)算算就用去去1200ms,相當(dāng)于于主程序序中加法法運(yùn)算時(shí)時(shí)間的33/2倍。故函數(shù)中中的運(yùn)算算比主程程序中要要慢,尤尤其是反反復(fù)調(diào)用用函數(shù),會(huì)增加加不必要要的時(shí)間間開銷。所以,一些簡(jiǎn)簡(jiǎn)單的功功能盡量量在一個(gè)個(gè)函數(shù)或或主程序序內(nèi)完成成,不要要使用過過多的函函數(shù);涉涉及全局局的變量量不要在在函數(shù)調(diào)調(diào)用時(shí)由由接口給給出,再再返回值值,盡量
22、量使用全全局變量量。這些些方法可可能使程程序的可可讀性降降低,不不利于調(diào)調(diào)試,但但有利于于提高時(shí)時(shí)效,正正如匯編編語(yǔ)言程程序比高高級(jí)語(yǔ)言言快一樣樣。5.優(yōu)化化的快速速排序(1)用用插入排排序優(yōu)化化由于遞歸歸調(diào)用浪浪費(fèi)大量量時(shí)間,本算法法的思想想是,當(dāng)當(dāng)首尾間間距小于于minn時(shí),改改用效率率較高的的插入排排序,減減少反復(fù)復(fù)遞歸。這個(gè)想想法是好好的,但但運(yùn)行效效果并不不如人意意。當(dāng)mmin=4時(shí),程序運(yùn)運(yùn)行時(shí)間間降為229011ms,優(yōu)化幅幅度不大大,且增增加了編編程復(fù)雜雜度,故故不宜采采用。其其原因是是遞歸調(diào)調(diào)用、插插入排序序內(nèi)部循循環(huán)所用用時(shí)間過過長(zhǎng)。(2)用用小數(shù)據(jù)據(jù)判斷優(yōu)優(yōu)化 iff(l
23、+1rr) whhilee(1)/與普通通快速排排序相同同 ellse if(l+11=rr&aalar) tt=ai;aii=aaj;aj=t;僅就區(qū)間間長(zhǎng)度為為2的情情況進(jìn)行行判斷優(yōu)優(yōu)化,減減少一次次遞歸調(diào)調(diào)用,就就能使運(yùn)運(yùn)行時(shí)間間縮短為為26999mss,降低低了2000mss以上。而區(qū)間間長(zhǎng)度不不小于33的直接接判斷有有困難??焖倥判蛐蜻\(yùn)行時(shí)時(shí)間(單單位:mms)數(shù)據(jù)規(guī)模模10000010000001000000001000000000原始快速速排序1.50025.220258.5527166.455優(yōu)化快速速排序2.30023.440245.4025644.8006.歸并并排序歸并排
24、序序是一種種穩(wěn)定的的排序方方法,且且時(shí)間效效率與快快速排序序相同,都是OO(nllognn)。但但歸并排排序比快快速排序序的常數(shù)數(shù)因子大大,故快快速排序序還是最最快的排排序方法法。歸并并排序則則適用于于有特殊殊要求的的題目,如不滿滿足交換換律的表表達(dá)式處處理。int aMMAX,bMAXX;voidd coombiine(intt frrom,intt too) innt ii,t,midd=(ffromm+too)/22,f,r; iff(frrom=too|ffromm+1=too) rretuurn; iff(frrom+2=to) if(affrommarr) bii+=af+; ee
25、lsee bi+=aar+; foor(ii=frrom;itto;ii+) aai=bi; 調(diào)用:ccombbinee(0,MAXX);歸并排序序算法還還可用于于統(tǒng)計(jì)逆逆序?qū)?shù)數(shù)。所謂謂逆序?qū)?duì),即為為在一個(gè)個(gè)數(shù)組aa中,滿滿足iaj(或aiajj,依依排序方方向而定定)的點(diǎn)(ii,j)的個(gè)數(shù)數(shù)。voidd soort(intt frrom,intt too) innt ii,t,midd=(ffromm+too)/22,f,r; iff(frrom=too|ffromm+1=too) rretuurn; iff(frrom+2=to) if(affrommarr) bii+=af+; ee
26、lsee bi+=aar+; iff(f!=miid) ttot+=(mmid-froom); foor(ii=frrom;itto;ii+) aai=bi; 主函數(shù): soort(0,nn); prrinttf(%d,n*(n-1)/2-ttot);7.多關(guān)關(guān)鍵字排排序多關(guān)鍵字字排序,經(jīng)常出出現(xiàn)于要要求按某某要素排排序姓名名,該要要素相同同的按字字典序排排列的題題目。這這樣,此此要素是是第一關(guān)關(guān)鍵字,姓名是是第二關(guān)關(guān)鍵字。qistt(0,n-11);j=0;for(i=11;i0); do+ii; whhilee(sttrcmmp(nnameelooj,nnameelooi)0); if(i
27、jj) tt=looi;looi=looj;looj=t; elsse bbreaak; iff(lr) qnnamee(l,j); qnnamee(j+1,rr);上述排序序方法,實(shí)質(zhì)上上是將普普通快速速排序中中的數(shù)大大小比較較換成字字符串大大小比較較。為了了避免字字符串交交換浪費(fèi)費(fèi)時(shí)間,采用了了類似指指針的定定位數(shù)組組,只需需交換定定位數(shù)組組的元素素即可。當(dāng)然,用指針針直接實(shí)實(shí)現(xiàn)效率率更高。關(guān)于字符符串比較較函數(shù)sstrccmp的的時(shí)間效效率,我我們有如如下試驗(yàn)驗(yàn):for(i=00;i1000;i+) ai=rannd(); bii=rrandd();s=cllockk();for(i=0
28、0;ibbi) reeturrn 11; if(aiibbi) reeturrn -1; reeturrn 00; 運(yùn)行時(shí)間間:11131mms,凈凈運(yùn)行時(shí)時(shí)間約7725mms,相當(dāng)于于9次整整數(shù)比較較時(shí)間,比標(biāo)準(zhǔn)準(zhǔn)庫(kù)函數(shù)數(shù)稍慢。顯然,標(biāo)準(zhǔn)庫(kù)函函數(shù)是經(jīng)經(jīng)過精心心優(yōu)化的的,我們們?cè)谟袔?kù)庫(kù)函數(shù)可可用時(shí)盡盡量用庫(kù)庫(kù)函數(shù),不僅降降低編程程復(fù)雜度度,降低低錯(cuò)誤率率,還能能提高時(shí)時(shí)間效率率。9.Haash排排序#deffinee MOOD 99999997/Ass a bigg prrimee#deffinee MAAX 1100000/As thee maax llenggth of thee sttr
29、inngint ELFFhassh(ccharr *kkey) unnsiggnedd loong h=00; whhilee(*kkey) h=(h24; h&=g; reeturrn hh%MOOD;Hashh排序,就是先先對(duì)讀入入的字符符串求HHashh值。第第一種方方案是,再對(duì)HHashh值進(jìn)行行快速排排序,最最后應(yīng)用用二分搜搜索查找找。此時(shí)時(shí)無(wú)需MMOD大大質(zhì)數(shù)。第二種種方案是是,將HHashh值MOOD后,放入HHashh表中,并用開開散列等等方法處處理沖突突。顯然然,第二二種方案案更優(yōu),但編程程復(fù)雜度度也較高高。綜上所述述,在選選擇適當(dāng)當(dāng)?shù)呐判蛐蛩惴〞r(shí)時(shí),要注注意時(shí)間間復(fù)雜度度和
30、編程復(fù)復(fù)雜度,同時(shí)保保證滿足足題意。二、最短短路算法法的比較較在圖論中中,最短短路算法法是常見見的。對(duì)對(duì)于常見見的幾種種算法,到底哪哪種更優(yōu)優(yōu),還是是各有千千秋?我我們不妨妨一試。以下實(shí)實(shí)驗(yàn)在11號(hào)機(jī)上上進(jìn)行,均為試試驗(yàn)200次隨機(jī)機(jī)數(shù)取平平均值的的結(jié)果。1.單源源最短路路徑dijjksttra算算法voidd diijksstraa() innt ii,j,minn=0; foor(ii=0;inn;i+) ddisi=d00ii; foor(ii=1;inn;i+) minn=n; forr(j=0;jjn;j+) iff(!uusej&dijdiimmin) mmin=j; useemi
31、in=1; forr(j=0;jjn;j+) iff(diismmin+dminnjjddisj) ddisj=dissmiin+dmminj; 隨機(jī)數(shù)產(chǎn)產(chǎn)生器:for(i=00;iMAXX;i+) foor(jj=0;jMMAX;j+) iif(ii!=jj) diijj=rrandd();當(dāng)MAXX=20000時(shí)時(shí)(即點(diǎn)點(diǎn)數(shù)為220000個(gè)),運(yùn)行時(shí)時(shí)間:228.22ms。當(dāng)當(dāng)MAXX更大時(shí)時(shí),內(nèi)存存會(huì)使用用過多,故在11s時(shí)限限內(nèi)至多多運(yùn)行規(guī)規(guī)模為220000的單源源最短路路徑355次。2.單源源最短路路徑Forrd算法法int forrd() innt ii,j; foor(ii=1;
32、inn;i+) ddi=MAAXINNT; foor(ii=1;inn;i+) ffor(j=00;jnumm;j+) iff(dfjj+wjjddej) ddej=dfjj+wjj; foor(jj=0;jnnum;j+) iif(ddfj+wjdeej) retturnn 0; reeturrn 11; 數(shù)據(jù)構(gòu)構(gòu)造:110*nn條隨機(jī)機(jī)邊。當(dāng)當(dāng)n=110000時(shí),運(yùn)運(yùn)行時(shí)間間:499.955ms。當(dāng)n=100000時(shí)時(shí),運(yùn)行行時(shí)間:67666mss。數(shù)據(jù)構(gòu)構(gòu)造:nn*n條條邊的完完全圖。當(dāng)n=10000時(shí),運(yùn)行時(shí)時(shí)間64469mms。比比Dijjksttra和和SPFFA都慢慢很多,因?yàn)槠?/p>
33、其算法的的理論時(shí)時(shí)間復(fù)雜雜度就達(dá)達(dá)到了OO(VEE),屬屬于介于于O(nn2)與O(n33)的算算法。但我們們?nèi)匀恍栊枰@種種算法,因?yàn)楫?dāng)當(dāng)圖中存存在負(fù)權(quán)權(quán)時(shí),必必須使用用Forrd算法法。同時(shí)時(shí),該算算法還能能判斷圖圖中是否否存在負(fù)負(fù)權(quán)回路路(無(wú)解解)。3.單源源最短路路徑SPFFA算法法struuct missingg intt nuum; intt pooo; strructt miisinng *p; ;int worr50000000;int diss6000011;int yess6000011=0;int begg=0,endd=1;mainn() iint n,mm; iint
34、 a,bb,c,i; sstruuct missingg q600001,*qqq6600001,*x; ddoubble s,tt; FFILEE *ffp; ffp=ffopeen(1.ttxt,rr); ffscaanf(fp,%dd%d,&nn,&mm); ffor(i=00;in;ii+) qqqii=&qii; ffor(i=00;ip=(strructt miisinng *)maallooc(ssizeeof(strructt miisinng); qqqbb-p=(strructt miisinng *)maallooc(ssizeeof(strructt miisinng)
35、; qqqaa=qqqaa-p; qqqbb=qqqbb-p; qqqaa-pooo=b; qqqbb-pooo=a; qqqaa-numm=qqqb-nnum=c; ss=cllockk(); ffor(i=00;ip=NNULLL; ddisi=-1; yyes0=1; wwor0=0; ddis0=0; wwhille(bbeg!=ennd) xx=qworrbeeg.p; wwhille(xx!=NNULLL) if(ddisx-pooo=-1|(ddisx-poooxx-nnum+disswoorbbeg&dissx-pooo!=-11) ddisx-pooo=ddisworrbee
36、g+x-nuum; wworendd=xx-ppoo; iif(yyesx-pooo=0) yyesx-pooo=11; eend+; xx=x-p; yyesworrbeeg=0; bbeg+; pprinntf(%dd,ddisn-11); tt=cllockk();隨機(jī)數(shù)生生成模塊塊: fprrinttf(ffp,%d %dn,n,110*nn); forr(i=0;ii100*n;i+) j=rrandd()%n+11; kk=raand()%nn+1; wwhille(jj=kk) j=rrandd()%n+11; kk=raand()%nn+1; ffpriintff(fpp,%d
37、 %d %dnn,jj,k,rannd(); 運(yùn)行時(shí)間間(不含含文件操操作):當(dāng)n=10000000時(shí),運(yùn)運(yùn)行時(shí)間間19337mss;當(dāng)nn=1000000時(shí),運(yùn)運(yùn)行時(shí)間間1411ms;當(dāng)n=10000時(shí),運(yùn)行時(shí)時(shí)間小于于10mms。特別需需要注意意的是,當(dāng)n=500000時(shí)時(shí),用時(shí)時(shí)8288ms,再加上上文件操操作用時(shí)時(shí),可稱稱為是SPFFA算法法數(shù)據(jù)規(guī)規(guī)模的上上限。這這組數(shù)據(jù)據(jù)是n個(gè)個(gè)點(diǎn),110*nn條隨機(jī)機(jī)邊的情情況下作作出的。若使用用O(nn2)的Diijksstraa算法,時(shí)間將將大幅增增加。對(duì)于單源源最短路路徑,要要考慮題題意要求求,稀疏疏圖使用用SPFFA,密密集圖使使用Diij
38、ksstraa,以提提高運(yùn)行行效率。3.點(diǎn)對(duì)對(duì)點(diǎn)最短短路徑Flloyeed算法法voidd flloyeed() innt ii,j,k,mmin=0; foor(kk=0;knn;k+) ffor(i=00;in;ii+) forr(j=0;jjn;j+) iff(dik+dkkjjddij) ddij=dik+dkkjj;當(dāng)MAXX=5000時(shí),運(yùn)行時(shí)時(shí)間:9979.85mms。這這提示我我們,點(diǎn)點(diǎn)對(duì)點(diǎn)最最短路徑徑的規(guī)模模最大為為5000,否則則會(huì)超時(shí)時(shí)。若使用MMAX-1次ddijkkstrra算法法voidd diijksstraa() innt ii,j,k,mmin=0; foor
39、(kk=0;knn-1;k+) intt usseMMAX=00; foor(ii=0;inn;i+) ddisi=dkkii; foor(ii=1;inn;i+) minn=n; forr(j=0;jjn;j+) iff(!uusej&dijdiimmin) mmin=j; useemiin=1; forr(j=0;jjn;j+) iff(diismmin+dminnjjddisj) ddisj=dissmiin+dmminj; 當(dāng)MAXX=5000時(shí),運(yùn)行時(shí)時(shí)間:116255ms,與flloyeed的9980mms相比比,顯然然慢了很很多。因因此,ffloyyed算算法是點(diǎn)點(diǎn)對(duì)點(diǎn)最最短路徑
40、徑的“正統(tǒng)”算法。三、字符符串匹配配算法的的比較1.樸素素匹配算算法for(i=00;i10000;ii+) Si=1; forr(j=0;jj10000000;jj+) Tj=1; s=cclocck(); tott=0; ls=strrlenn(S); lt=strrlenn(T); forr(i=0;iiltt-lss;i+) ffor(j=00;jls;j+) if(Tii+j!=SSj) brreakk; iif(jj=lls) tott+; priintff(%d ,toot); t=cclocck();運(yùn)行時(shí)間間:3335.335mss。這組組測(cè)試數(shù)數(shù)據(jù)是:原串11000000個(gè)
41、個(gè)1,匹匹配串110000個(gè)1.若使用更更極端的的數(shù)據(jù),如匹配配串1000000個(gè)1,則需要要數(shù)秒出出解,顯顯然過慢慢。對(duì)于于隨機(jī)數(shù)數(shù)據(jù),由由于匹配配的可能能性極小小,用時(shí)時(shí)很快是是必然的的。我們們只考慮慮極端數(shù)數(shù)據(jù)。2.KMMP算法法(優(yōu)化化)int KMPP() innt ii,q=0; foor(ii=1;i0&Tq+11!=Sii) q=nnexttq; iif(TTq+1=Si) q+; iif(qq=llt) attot+=i-llt+11; voidd fff() intt q,k; forr(q=1;qq0&Tkk+1=TTq+1) kk=neextk; neextq=k; v
42、oidd f() intt q,k; nexxt11=00;k=0; forr(q=2;qq0&Tk+11!=Tqq) k=nnexttk; iif(TTk+1=Tq) k=kk+1; nnexttq=k; 調(diào)用過程程: f(); fff(); KMMP();算法說明明:函數(shù)數(shù)f計(jì)算算初始“回復(fù)位位置”,函數(shù)數(shù)ff計(jì)計(jì)算優(yōu)化化后的“回復(fù)位位置”,函數(shù)數(shù)KMPP是依賴賴上述“回復(fù)位位置”進(jìn)行快快速匹配配的算法法。Si為為待匹配配串,TTi為目標(biāo)標(biāo)串,nnextti計(jì)算“回復(fù)位位置”。運(yùn)行時(shí)間間:當(dāng)目標(biāo)串串長(zhǎng)10000,匹配串串長(zhǎng)10000000時(shí)00.8mms。目目標(biāo)串長(zhǎng)長(zhǎng)1000時(shí)2.3mss
43、。目標(biāo)標(biāo)串長(zhǎng)110或1100000時(shí),運(yùn)行時(shí)時(shí)間1.55ms??煽梢?,KKMP算算法極快快,確實(shí)實(shí)是O(n)的的時(shí)間復(fù)復(fù)雜度。故正確確的優(yōu)化化KMPP算法是是不會(huì)超超時(shí)的。同樣,優(yōu)化KKMP與與普通KKMP的的差距也也很明顯顯,尤其其是在極極端數(shù)據(jù)據(jù)時(shí)。四、最小小生成樹樹算法的的比較1.Prrim算算法voidd prrim() innt llowccostt20002,clloseet220022,ii,j,k,mmin,tott=0; foor(ii=1;i=n;ii+) lowwcosstii=ccostt1i; cloosetti=1; foor(ii=1;inn;i+) minn=M
44、AAXINNT; forr(j=1;jj=nn;j+) iff(loowcoostjminn&llowccosttj!=00) minn=loowcoostj; k=jj; tott+=llowccosttk; lowwcosstkk=00; forr(j=1;jj=nn;j+) iff(coostkjlowwcosstjj) lowwcosstjj=ccosttkj; cloosettj=k; prrinttf(%d ,ttot);隨機(jī)數(shù)生生成:for(i=11;i=MAAX;ii+) foor(jj=1;j=MAXX;j+) iif(ii!=jj) cosstiijj=rrandd();當(dāng)
45、數(shù)據(jù)范范圍MAAX=220000時(shí),平均均運(yùn)行時(shí)時(shí)間:446.995mss。 由于Prrim算算法是OO(n2)的的,速度度快不是是偶然。由此可可見,最最小生成成樹不是是程序運(yùn)運(yùn)行時(shí)間間的瓶頸頸。從算算法上看看,我們們注意到到Priim算法法十分類類似求單單源最短短路徑的的Dijjksttra算算法。兩兩種算法法都是先先找出不不在集合合中的最最近元素素,將其其加入集集合,并并對(duì)該元元素連接接的點(diǎn)進(jìn)進(jìn)行松弛弛操作,更新各各點(diǎn)到集集合的距距離。在在具體實(shí)實(shí)現(xiàn)中,都是利用用一個(gè)數(shù)數(shù)組記錄錄每個(gè)點(diǎn)點(diǎn)到集合合的距離離,點(diǎn)在在集合中中用距離離為零表表示。2.Krruskkal算算法(較差)int fatt
46、herr(innt xx) iff(seetxx!=x) ssetx=fattherr(seetxx); reeturrn ssetx;voidd krruskkal() innt ii,j,staart,endd,vaaluee,coost=0; foor(ii=0;inn;i+) sseti=i; foor(kk=1;knn;k+) vaaluee=MAAXINNT; foor(ii=0;inn;i+) ffor(j=00;jn;jj+) if(i!=j&fattherr(i)!=ffathher(j) iff(daataijvallue) staart=i; endd=j; vallue
47、=dattaiijj; ccostt+=vvaluue; ssetfattherr(sttartt)=fattherr(ennd); pprinntf(%dd ,cosst);當(dāng)規(guī)模MMAX=5000時(shí),運(yùn)運(yùn)行時(shí)間間:35563mms。顯顯然,當(dāng)當(dāng)圖為密集集矩陣時(shí)時(shí),Krruskkal算算法并不不迅速。但當(dāng)圖為為稀疏圖圖時(shí),算算法的優(yōu)優(yōu)勢(shì)便很很明顯了了。3.Krruskkal算算法(優(yōu)優(yōu)化)int finnd(iint x) iff(fx!=x) ffx=fiind(fxx); reeturrn ffx;voidd krruskkal() innt ii,j,a,bb,toot=00,nuum
48、=00; foor(ii=0;inn;i+) ffi=i; foor(ii=0;inn;i+) a=ffindd(si); b=ffindd(ei); if(a!=b) nnum+; ttot+=wi; ffa=b; iif(nnum=maax) breeak; prrinttf(%d ,ttot);主程序:for(i=11;in;ii+) ffi=raand()%mmax; eei=raand()%mmax; wwi=raand(); s=cclocck(); sorrt(00,n-1); kruuskaal(); t=cclocck();此處soort函函數(shù)是快快速排序序函數(shù),采用了了本文
49、上上述“優(yōu)化的的快速排排序算法法”。當(dāng)maxx=10000000時(shí),即共11000000個(gè)個(gè)點(diǎn),共共100000000條邊邊時(shí),平均均運(yùn)行時(shí)時(shí)間為4409.4mss。當(dāng)maax=1100000時(shí),平均運(yùn)行行時(shí)間為為43.7mss。完全全滿足時(shí)時(shí)限1ss的要求求。而若若使用OO(n2)的的Priim算法法,運(yùn)行行時(shí)間將將不可思思議。故故Kruuskaal算法法十分適適合稀疏疏圖的處處理。我們?cè)賮?lái)來(lái)看Krruskkal算算法對(duì)于于密集圖圖的效率率。for(i=00;imaxx;i+) foor(jj=0;jmmax;j+) fii=ii; eii=jj; wii=rrandd(); 當(dāng)maxx=2
50、0000時(shí),平平均運(yùn)行行時(shí)間113944.5mms,比比Priim的447mss慢了約330倍。通過單單獨(dú)測(cè)試試sorrt時(shí)間間可知,當(dāng)數(shù)目目過多時(shí)時(shí),快速速排序占占去很多多的時(shí)間間(平均均12999.33ms),而Krruskkal算算法本身身仍然很很快(不不到1000mss)。綜上所述述,在解解題前,務(wù)必看看清題中中給出的的圖是密密集圖還還是稀疏疏圖,并并選擇合合適的算算法,否否則程序序運(yùn)行速度度會(huì)很慢慢。五、拓?fù)鋼渑判蛩闼惴╥nt tuoopu() innt ii,j,k; foor(ii=0;inn;i+) ffor(j=00;jn;jj+) if(aiijj) dj+; foor(i
51、i=0;inn;i+) forr(j=0;jjn;j+) iff(dj=0) bbreaak; if(j=n) reeturrn 00; djj=-1; anssi=j; forr(k=0;kkn;k+) iff(ajk) ajjkk=00; dkk-; reeturrn 11;取隨機(jī)數(shù)數(shù)據(jù)測(cè)試試:當(dāng)nn=10000時(shí)時(shí),運(yùn)行行時(shí)間:15mms;當(dāng)n=220000時(shí),運(yùn)運(yùn)行時(shí)間間:633ms。當(dāng)n過過大時(shí),數(shù)組將將越界。六、搜索索算法的的比較1.樸素素深度優(yōu)優(yōu)先搜索索程序框架架:(函函數(shù)依具具體題目目而定)voidd opp(innt nnow)voidd reead()voidd prrin
52、tt()voidd prrintterrror()int anss(innt nnow)int s(iint noww) innt ii,fllag; iff(noow=n) if(anss(noow) reeturrn 11; retturnn 0; foor(ii=0;inn;i+) op(i); flaag=ss(noow+11); if(flaag) reeturrn 11; reeturrn 00;mainn() innt fflagg; reead(); fllag=s(00); iff(fllag) pprinnt(); ellse priinteerroor(); reetur
53、rn;以經(jīng)典的的“八皇后后問題”為例。voidd quueenn(innt xx,innt yy) innt ii,a,b; iff(x=n-1) tott+; retturnn; foor(ii=x;inn;i+) uuseiy=1; a=x+11;b=y+11; whhilee(an&bnn) uusea+bb+=1; a=x+11;b=y-11; whhilee(a=0) uusea+bb-=1; foor(ii=0;inn;i+) iif(!useex+1i) queeen(x+11,i); foor(ii=x;inn;i+) uuseiy=0; a=x+11;b=y+11; whhi
54、lee(an&bnn) uusea+bb+=0; a=x+11;b=y-11; whhilee(a=0) uusea+bb-=0; 當(dāng)n=8時(shí),速度無(wú)無(wú)法測(cè)出出。當(dāng)n=99時(shí),用用時(shí)1009mss。當(dāng)nn=100時(shí),用用時(shí)24406mms??煽梢姡瑯銟闼氐幕鼗厮菟惴ǚㄔ诎嘶驶屎髥栴}題中,所所用時(shí)間間隨N的的增大而而迅速增增大,復(fù)復(fù)雜度幾幾乎為NN!。2.位運(yùn)運(yùn)算voidd teest(lonng rrow,lonng lld,llongg rdd) llongg p,poss; iif(rrow!=uppperrlimm) poos=uuppeerliim&(roow|lld|rrd); wh
55、hilee(poos) p=poss&(-poss); poos-=p; teest(roww+p,(ldd+p)1); ellse suum+;主程序: summ=0; uppperllim=(1n)-1; tesst(00,0,0);運(yùn)行時(shí)間間:當(dāng)nn=111時(shí),時(shí)時(shí)間無(wú)法法測(cè)出。當(dāng)n=12時(shí),用時(shí)時(shí)15mms;當(dāng)當(dāng)n=113時(shí),用時(shí)1125mms;當(dāng)當(dāng)n=114時(shí),用時(shí)6672mms;當(dāng)當(dāng)n=115時(shí),用時(shí)339844ms。雖然增增長(zhǎng)速度度也較快快,不屬屬于多項(xiàng)項(xiàng)式算法法,但比比起樸素素算法要要快很多多。原因因主要是是,把棋棋盤的nn*n個(gè)個(gè)格變成一一個(gè)數(shù),免去對(duì)數(shù)數(shù)組的操操作;采采用位
56、運(yùn)運(yùn)算,比比算術(shù)運(yùn)運(yùn)算要快快。最重重要的是是,判重重時(shí)直接用用數(shù)的比比較,速速度很快快。由此可見見,對(duì)搜搜索問題題,優(yōu)化化的空間間還是很很大的。3.廣度度優(yōu)先搜搜索廣度優(yōu)先先搜索的的時(shí)間復(fù)復(fù)雜度從從理論上上說,搜搜索完整整棵樹與與深度優(yōu)優(yōu)先搜索索的相同同,只是是適用范范圍不同同。兩者者的根本本區(qū)別在在于,實(shí)實(shí)現(xiàn)方式式一個(gè)是是棧,先先進(jìn)先出出;一個(gè)個(gè)是隊(duì)列列,先進(jìn)進(jìn)后出。主要的的瓶頸是是空間問問題,數(shù)數(shù)組不能能太大,必要時(shí)時(shí)使用循循環(huán)隊(duì)列列解決。程序框架架:(函函數(shù)依具具體問題題而定)voidd reead()voidd prrintt()/priint lasst aa as thee ann
57、sweerint op()/rretuurn ressultt maade deppenddingg onn laast aint anss()/tesst llastt a iif iit iis tthe ansswerrvoidd s(intt frrom) innt ii,t=numm; foor(ii=frrom;itt;i+) if(anss() reeturrn; annum+=op(); s(t); mainn() reead(); s(0); prrintt();以圖論中中的“種子填填充法”為例:(計(jì)算算某點(diǎn)開開始的連連通圖形形面積)#inccluddeint n,mm,a1
58、000010000=0,x1000010000=0;int filll(iint i,iint j) innt ttot=1; iff(aij=0|xij=1) rretuurn 0; xij=1; toot+=filll(ii-1,j); toot+=filll(ii+1,j); toot+=filll(ii,j-1); toot+=filll(ii,j+1); reeturrn ttot; mainn() innt ii,j,tott=0; sccanff(%d%dd,&n,&m); foor(ii=1;i=n;ii+) ffor(j=11;j=m;j+) scaanf(%dd,&aiij
59、j); foor(ii=1;i=n;ii+) ffor(j=11;j=n;j+) if(xiijj=0&aiijj=1) prrinttf(Bloock %d: att (%d,%d) Sizze %dnn,+toot,ii,j,filll(ii,j); geetchh();當(dāng)n=110000時(shí),隨隨機(jī)數(shù)實(shí)實(shí)驗(yàn)表明明,平均均運(yùn)行時(shí)時(shí)間為114.11ms。(當(dāng)心心系統(tǒng)堆堆棧溢出出!)事事實(shí)上,由于前前面填充充時(shí)已經(jīng)經(jīng)填入大大部分點(diǎn)點(diǎn),則采采用記憶憶化搜索索的辦法法,同在在一個(gè)區(qū)區(qū)域中的的點(diǎn)不必必重新搜搜索,故故算法效效率仍為為O(nn2)。4.線性性搜索(二分法法)int seaarchh(in
60、nt ffromm,innt tto,iint x) iff(a(frrom+to)/2=xx) rretuurn (frrom+to)/2; iff(frrom=too|ffromm+1=too) rretuurn -1; iff(a(frrom+to)/2x) rretuurn seaarchh(ffromm+too)/22,too,x); reeturrn ssearrch(froom,(froom+tto)/2,xx); 主函數(shù):(重復(fù)復(fù)100000000次,便于測(cè)測(cè)量時(shí)間間,此時(shí)時(shí)循環(huán)時(shí)時(shí)間可忽忽略)for(i=00;i1; iff(at=x) rretuurn t; iff(frr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作辦學(xué)項(xiàng)目協(xié)議范本
- 重型吊車租賃合同范本
- 展覽活動(dòng)參展協(xié)議書模板
- 2024裝修大包合同模板
- 2024年離婚協(xié)議書范本簡(jiǎn)易
- 新服裝定制合同樣本
- 2.2 創(chuàng)新永無(wú)止境導(dǎo)學(xué)案 2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)上冊(cè)
- 債券認(rèn)購(gòu)與債權(quán)轉(zhuǎn)讓合同實(shí)務(wù)
- 門店租賃合同協(xié)議書
- 上海市超市洗滌產(chǎn)品流通安全協(xié)議
- 行政服務(wù)中心窗口工作人員手冊(cè)
- 最新患者用藥情況監(jiān)測(cè)
- 試樁施工方案 (完整版)
- ESTIC-AU40使用說明書(中文100版)(共138頁(yè))
- 河北省2012土建定額說明及計(jì)算規(guī)則(含定額總說明)解讀
- 中工商計(jì)算公式匯總.doc
- 深圳市建筑裝飾工程消耗量標(biāo)準(zhǔn)(第三版)2003
- 《初中英語(yǔ)課堂教學(xué)學(xué)困生轉(zhuǎn)化個(gè)案研究》開題報(bào)告
- 鋼筋桁架樓承板施工方案
- 恒溫箱PLC控制系統(tǒng)畢業(yè)設(shè)計(jì)
- 176033山西《裝飾工程預(yù)算定額》定額說明及計(jì)算規(guī)則
評(píng)論
0/150
提交評(píng)論