freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

鄂教版信息技術(shù)九下第9課程序調(diào)試優(yōu)化算法-展示頁(yè)

2024-12-01 21:01本頁(yè)面
  

【正文】 用于有特殊要求的題目,如不滿足交換律的表達(dá)式處理。 快速排序運(yùn)行時(shí)間(單位: ms) 數(shù)據(jù)規(guī)模 10000 100000 1000000 10000000 原始快速排序 優(yōu)化快速排序 歸并排序是一種穩(wěn)定的排序方法,且時(shí)間效率與快速排序相同,都是 O(nlogn)。} 僅 就區(qū)間長(zhǎng)度為 2 的情況進(jìn)行判斷優(yōu)化,減少一次遞歸調(diào)用,就能使運(yùn)行時(shí)間縮短為2699ms,降低了 200ms以上。a[i]=a[j]。amp。其原因是遞歸調(diào)用、插入排序內(nèi)部循環(huán)所用時(shí)間過(guò)長(zhǎng)。這個(gè)想法是好的,但運(yùn)行效果并不如人意。這些方法可能使程序的可讀性降低,不利于調(diào)試,但有利于提高時(shí)效,正如匯編語(yǔ)言程序比高級(jí)語(yǔ)言快一樣。故函數(shù)中的運(yùn)算比主程序中要慢,尤其是反復(fù)調(diào)用函數(shù),會(huì)增加不必要的時(shí)間開(kāi)銷。} 凈運(yùn)行時(shí)間 84ms int test() 凈運(yùn)行時(shí)間 10ms 由此可見(jiàn),調(diào)用函數(shù)本身并不浪費(fèi)時(shí)間,僅相當(dāng)于循環(huán)本身時(shí)間 400ms 的 1/40,相當(dāng)于加法 80ms的 1/8,是很快的運(yùn)算。 n++。 t=clock()。i100000000。 s=clock()。 } } 若程序改為以 上形式,則運(yùn)行時(shí)間為 2917ms,稍快了一些,是因?yàn)闇p少了函數(shù)調(diào)用次數(shù)。 } p(l,j)。a[j]=t。 if(ij) { t=a[i]。 do{++i。 if(lr){ while(1) { do{j。另外,快速排序不是穩(wěn)定 的排序,需要保持原順序的不能用此法。注意:不要以為三種平方級(jí)排序方法的速度與快速排序可比擬,因?yàn)槠椒郊?jí)的數(shù)據(jù)范圍是 10000,而快速排序的范圍是 10000000。 q(n+1,r)。 if(lr) { n=p(l,r)。 } else return j。a[i]=a[j]。 }while(a[i]x)。 }while(a[j]x)。 int p(int l,int r) { int x=a[l],i=l1,j=r+1,t。故第一章的程序運(yùn)行時(shí)間此處應(yīng)乘 2。編譯環(huán)境 Devc++,以下稱為 2號(hào)機(jī)。冒泡排序是不穩(wěn)定的,涉及必須保持?jǐn)?shù)據(jù)原順序的題目時(shí)不能選擇冒泡排序,而必須選擇穩(wěn)定的排序方式。從算法的穩(wěn)定性上,插入排序是穩(wěn)定的,即排序后關(guān)鍵字相同的記錄順序不改變,特別適用于表達(dá)式處理等問(wèn)題。 運(yùn)行時(shí)間 : 984ms 以上三種都是 O(n^2)的排序,其中插入排序最快,且可以用指針加以優(yōu)化。 a[j+1]=t。lj+1。j) if(a[j]t) break。 for(j=i1。in。 s=clock()。i20200。 } t=clock()。 b[i]=a[max]。jn。i++) { max=0。 for(i=0。i++) a[i]=rand()。 運(yùn)行時(shí)間: 1407ms for(i=0。 a[j]=t。j++) if(a[i]a[j]) { t=a[i]。i++) for(j=0。 for(i=0。i++) a[i]=rand()。 第二章 各種算法的速度 一、排序算法的速度 for(i=0。所以盡量減少循環(huán)次數(shù) ,是優(yōu)化算法的關(guān)鍵。概括起來(lái)說(shuō),除、模最慢,二維數(shù)組較慢,加減乘、邏輯位運(yùn)算、比較大小較快,左右移位、一維數(shù)組、賦值幾乎不需要時(shí)間。若一組變量中既有超出 int 的,又有不超過(guò) int 的,則要分類處理,不要直接都定義成 int64,尤其在乘除模較多的高精度過(guò)程中。 四、實(shí)數(shù)運(yùn)算的速度 測(cè)試方法與“基本運(yùn)算”類似。所以,對(duì)于已知數(shù)目不多的同樣大小的數(shù)組,可用幾個(gè)變量名不同的一維數(shù)組表示,如 x、 y方向,兩種不同參 數(shù),而不要濫用二維數(shù)組。但相較加、減等簡(jiǎn)單操作,速度仍為 3倍,尤其與幾乎不需時(shí)間的一維數(shù)組相比差距巨大。 實(shí)際運(yùn)行時(shí)間為 ,若規(guī)模擴(kuò)至 10000則 10s內(nèi)無(wú)法出解,由于頻繁訪問(wèn)虛擬內(nèi)存。k5000。i5000。同時(shí)我們發(fā)現(xiàn),循環(huán)耗時(shí)在各種運(yùn)算中是很大的,僅次于乘除,故我們要盡量減少循環(huán)次數(shù),能在一個(gè)循環(huán)中解決的問(wèn)題不放在兩個(gè)循環(huán)中,減少循環(huán)變量次數(shù)。 則凈運(yùn)行時(shí)間為 ,很快,與 ,可以忽略。i100000000。這里計(jì)算了內(nèi)層循環(huán)的時(shí)間。k++) t=q[k]。i++) for(k=0。 三、數(shù)組運(yùn)算的速度 ( 1)直接應(yīng)用數(shù)組 for(i=0。 凈運(yùn)行時(shí)間約 30ms,比加法運(yùn)算(約 40ms)快較多,是因?yàn)槿前炊M(jìn)制位計(jì)算。 t=xamp。 ( 2)邏輯運(yùn)算 t=x|y。 凈運(yùn)行時(shí)間無(wú)法測(cè)出,證明位運(yùn)算速度極快。 二、位運(yùn)算的速度 ( 1)左移、 右移 x1。 凈運(yùn)行時(shí)間 ,與加法運(yùn)算速度相當(dāng)。故盡量減少除法、取模運(yùn)算的次數(shù),是從常數(shù)級(jí)別降低時(shí)間復(fù)雜度的方法。 } } 以上函數(shù)運(yùn)行后,平均用時(shí) 。j++) { c[i+j+1]+=(c[i+j]+a[i]*b[j])/10。i++) for(j=0。 for(i=0。 以下是邊運(yùn)算邊整理的程序。 c[i]%=10。i9999。j++) c[i+j]+=a[i]*b[j]。i++) for(j=0。 for(i=0。 int a[10000]={0},b[10000]={0},c[10000]={0}。應(yīng)該利用 int的數(shù)據(jù)范圍,先將計(jì)算結(jié)果保存至當(dāng)前位,在各位的運(yùn)算結(jié)束后再統(tǒng)一整理??衫糜?jì)數(shù)足夠一定次數(shù)后再統(tǒng)一 MOD,循環(huán)完后再 MOD,使用中間變量記錄 MOD結(jié)果等方法減少次數(shù)。在大數(shù)運(yùn)算而只要求求得 MOD N的值的題目中,應(yīng)盡量利用數(shù)據(jù)類型的最大允許范圍,在保證不超過(guò) MAXINT 的前提 下,盡量少執(zhí)行 MOD 運(yùn)算。 ( 6)取模運(yùn)算 凈運(yùn)行時(shí)間 ,與除法運(yùn)算速度幾乎相當(dāng),都非常慢。 ( 5)除法運(yùn)算 凈運(yùn)行時(shí)間 ,是四種常規(guī)運(yùn)算中最慢的一種,耗時(shí)是加法的 28倍,是乘法的, 確實(shí)如常人所說(shuō)“慢幾十倍”,一秒的時(shí)限內(nèi)只能運(yùn)行 *10^7次,不足一億次,遠(yuǎn)大于循環(huán)時(shí)間。不必“談乘色變”,實(shí)際乘法作為 CPU的一種基本運(yùn)算,速度還是很快的。 ( 4)乘法運(yùn)算 凈 運(yùn)行時(shí)間 ,明顯比加減法要慢,但不像某些人想象的那樣慢,至少速度大于加減法的 1/2。當(dāng)然,這個(gè)“速控步”的運(yùn)行速度受計(jì)算機(jī)本身制約,我們無(wú)法優(yōu)化。 ( 3)減法運(yùn)算 凈運(yùn)行時(shí)間 ,與加法運(yùn)算基本相同。 而應(yīng)用 +=運(yùn)算,與普通加法時(shí)間幾乎 相同,所以 +=只是一種方便書(shū)寫(xiě)的方法,沒(méi)有實(shí)質(zhì)效果。 下面的各種簡(jiǎn)單運(yùn)算只是更改運(yùn)算符即可,不再寫(xiě)出代碼。 y=rand()。 ( 1)賦值運(yùn)算 凈運(yùn)行時(shí)間 ,與基本運(yùn)行時(shí)間 ,可忽略不計(jì),故以后將賦值運(yùn)算作為基本運(yùn)行時(shí)間的一部分,不予考慮。 getch()。 sum+=ba。//此處添加運(yùn)算 b=clock()。i100000000。j++) { //此處添加隨機(jī)數(shù)產(chǎn)生 a=clock()。 for(j=0。 include main() { int i,j。 基本運(yùn)行時(shí)間,是指在準(zhǔn)備計(jì)算的運(yùn)算復(fù)雜度之外,只包括循環(huán)控制變量的加減與比較所消耗的時(shí)間。 第一 章 各種運(yùn)算的速度 一、基本運(yùn)算的速度 為了增強(qiáng)算法效率的計(jì)算準(zhǔn)確性,我們采用重復(fù)試驗(yàn) 20次取平均值的做法。以下稱為 1號(hào)機(jī)。 本試驗(yàn)所采用的環(huán)境是: CPU Celeron ,內(nèi)存 248M,操作系統(tǒng) Windows XP SP2,程序語(yǔ)言 C。當(dāng)遇到所需時(shí)間較長(zhǎng)的問(wèn)題時(shí),一個(gè)常數(shù)級(jí)優(yōu)化可能是 AC 的關(guān)鍵所在。 算法效率與程序優(yōu)化 石家莊二中 李博杰 Website: 在信息學(xué)競(jìng)賽中,常遇到程序運(yùn)行超時(shí)的情況。然而,同一個(gè)程序設(shè)計(jì)思想,用不同算法,會(huì)有不同的運(yùn)行效率;而即使是同樣的算法,由于在代碼的細(xì)節(jié)方面設(shè)計(jì)有所不同,執(zhí)行起來(lái)效率也會(huì)有所不同。下面,我們就從代碼細(xì)節(jié)與算法設(shè)計(jì)兩方面,比較不同程序執(zhí)行時(shí)間的異同,從而選擇其中較優(yōu)的算法,提高程序運(yùn)行效率。編譯環(huán)境 Devc++。配置略好于 NOIP 標(biāo)準(zhǔn)測(cè)試機(jī) CPU 。每次試驗(yàn)運(yùn)行 100000000次。要從實(shí)際運(yùn)行時(shí)間中減去基本運(yùn)行時(shí)間,才是這種運(yùn)算真正的運(yùn)行時(shí)間,稱為凈運(yùn)行時(shí)間。 double a,b,sum=0。j20。 for(i=0。i++)。 printf(%lf\n,ba)。 } printf(ans = %lf,sum/)。 } 運(yùn)行平均時(shí)間是: 。 ( 2)加法運(yùn)算 產(chǎn)生隨機(jī)數(shù): x=rand()。 循環(huán)內(nèi)加法: t=x+y。 凈運(yùn)行時(shí)間 ,即:在 1s的時(shí)限中,共可進(jìn)行 ()/ *10^8=*10^9次加法運(yùn)算,即:只通過(guò)循環(huán)、加法和賦值的運(yùn)算次數(shù)不超過(guò) *10^9.。同樣的,各種自運(yùn)算并不能提高效率??梢?jiàn),在計(jì)算機(jī)內(nèi)部實(shí)現(xiàn)中,把減法變成加法的求補(bǔ)碼過(guò)程是較快的,而按位相加的過(guò)程占據(jù)了較多的時(shí)間,借用化學(xué)中的一句術(shù)語(yǔ),可以稱為整個(gè)運(yùn)算的“速控步”。在下面的算法設(shè)計(jì)中,還會(huì)遇到整個(gè)算法的“速控步”,針對(duì)這類情況,我們要對(duì)占用時(shí)間最多的步驟進(jìn)行細(xì)心優(yōu)化,減少常數(shù)級(jí)運(yùn)算次數(shù)。所以在實(shí)際編程時(shí),沒(méi)有必要把兩個(gè)或三個(gè)加法變成乘法,其實(shí)不如元素乘常數(shù)來(lái)得快。 以上四種運(yùn)算速度都很快,比循環(huán)所需時(shí)間少很多,在普通的算法中,每個(gè)最內(nèi)層循環(huán)約含有 45個(gè)加、減、乘運(yùn)算,故整個(gè)算法的運(yùn)行時(shí)間約為循環(huán)本身所需時(shí)間的 2倍。所以,在計(jì)算時(shí)應(yīng)盡量避免除法,尤其是在對(duì)時(shí)間要求較高的內(nèi)層循環(huán),盡量不安排除法,如果整個(gè)循環(huán)中值不變,可以使用在循環(huán)外預(yù)處理并用一個(gè)變量記錄,循環(huán)內(nèi)再調(diào)用該變量的方法,可以大大提高程序運(yùn)行效率。所以,取模運(yùn)算也要盡量減少。例如在循環(huán)數(shù)組、循環(huán)隊(duì)列的應(yīng)用中,取模運(yùn)算必不可少,這時(shí)優(yōu)化運(yùn)算便十分重要。 在高精度計(jì)算中,許多人喜歡邊運(yùn)算邊整理移位,從而在內(nèi)層循環(huán)中有除、模運(yùn)算各一次,效率極低。 以下是用統(tǒng)一整理法編寫(xiě)的高精度乘法函數(shù),規(guī)模為 10000位。 void mul() { int i,j,t。i10000。j10000i。 for(i=0。i++) { c[i+1]+=c[i]/10。 } } 以上函數(shù)運(yùn)行后,平均用時(shí) 。 void mul() { int i,j,t。i10000。j10000i。 c[i+j]=(c[i+j]+a[i]*b[j])%10。統(tǒng)一整理與邊整理邊移位相比,快了 ,有明顯優(yōu)勢(shì)。 ( 7)大小比較 if(xy) x=y。故比較運(yùn)算也屬于較快的基本運(yùn)算。 x1。而使用自乘計(jì)算需要 ,自除運(yùn)算需要 ,所以盡可能使用位運(yùn)算代替乘除。 t=x^y。y。但加減與位運(yùn)算關(guān)系并不大,所以利用位運(yùn)算主要是利用左右移位的高速度。i10000。k10000。 凈運(yùn)行時(shí)間 。若改為 for(i=0。i++) t=q[0]。故應(yīng)用數(shù)組,速度很快,不必?fù)?dān)心數(shù)組尋址耗時(shí)。 ( 2)二維數(shù)組 for(i=0。i++) for(k=0。k++) t=z[i][k]??梢栽囅?,若物理內(nèi)存足夠大,則運(yùn)行時(shí)間約為 320ms,僅為 的 3/2,差距似乎并不是很大;由此推得其凈運(yùn)行時(shí)間約為 120ms。尤其是在計(jì)算中,二維數(shù)組元素經(jīng)常調(diào)用,時(shí)間效率不可忽視。在滾動(dòng)數(shù)組中,可用兩個(gè)數(shù)組交替計(jì)算的方式,用二維數(shù)組同樣較慢。(次數(shù): 100000000,單位: ms) 運(yùn)算符 = + * / % long int int64 double 由上表可見(jiàn),涉及乘除、取模時(shí) int64很慢,要慎用; int顯然最快,但對(duì)大數(shù)據(jù)要小心越界。 以上討論了主要基本運(yùn)算的速度問(wèn)題。而循環(huán)for 或 while 語(yǔ)句十分特殊,它的運(yùn)算速度大于判斷大小、自加控制變量所用時(shí)間之和,無(wú)論采用內(nèi)部 if 判斷退出,還是在入口處判斷,都回用去約 200ms 的時(shí)間。對(duì)于雙層或多層的循環(huán),應(yīng)把循環(huán)次數(shù)少的放在最外層,最大的循環(huán)位居最內(nèi)部,以減少內(nèi)層循環(huán)的執(zhí)行次數(shù)。i20200。 s=clock()。in。ji。 a[i]=a[j]。 } b=clock()。i20200。 s=clock()。in。 for(j=0。j++) if(a[j]a[max]) max=j。 a[max]=1000000。 運(yùn)行時(shí)間: 1220ms for(i=0。i++) a[i]=rand()。 for(i=0。i++) { t=a[i]。j=0。 for(l=i。l) a[l]=a[l1]。 } t=clock()。從編程復(fù)雜度上,冒泡排序最簡(jiǎn)單 。一般的選擇排序是不穩(wěn)定的,但這里給出的程序由于使用了人類最原始
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1