對程式設計初學者談程式的效率

2021-06-01 09:12:51 字數 1803 閱讀 2680

在學習了迴圈以後,我們可以做程式,解決些大問題了。我想談談關於程式執行效率的問題。

評價乙個程式的標準中,第一是正確;第二是可讀性好,以此使程式易於修改和維護;第三就是效率的問題了,要求程式執行要盡可能快,占用記憶體空間要盡可能小。關注效率,可以使我們的好程式能在「小裝置」上執行,這在移動計算、物聯網時代很要緊。還有些問題,複雜得不得了,也只有借助於設計高效率演算法和程式的能力,才有可能將之解決。

以計算1/2-2/3+3/4-…+19/20的程式為例說明。憑藉以前的數學知識,同學們會將式子視為純粹的加法,待加的通項式為(-1)n×i/(i+1),可以編出如圖1所示的程式:

#includeint main()

cout<<"k="<

圖1  o(n2)級低效率的程式 

圖1的程式沒有錯,但pow求冪運算本身是個複雜運算,應該要避免的。尤其在學習c語言和c++時,效率的觀念一定要有。否則i++和i=i+1、i+=2和i=i+2更沒有必要區別了。

更進一步來些分析(此處引入了一些演算法分析的知識,以後專業課中要學,我講得通俗些)。在while迴圈中,有加法、乘法、除法等運算。乘法需要的執行時間遠高於加法(理解一下,為什麼?m*n是n個m相加嘛。)。除法和乘法一樣複雜。所以演算法分析中找主要矛盾,忽略加法。為簡單起見,除法我們也不說了,就從乘法次數上說事。從表面上看,迴圈1次執行1次乘法,迴圈n次,共執行了n次乘法。但注意到迴圈中pow(-1,i)是需要用乘法實現的,pow(-1,i)需要執行i 次乘法。在n次迴圈中,用於計算pow(-1,i)的乘法次數分別為1、2、3……n,共計1+2+…+n=n(n-1)/2。此程式需要的乘法次數達n(n-1)/2+n=(n2+n)/2,從數量級上講,是n2級別的。(當n足夠大時,式子中的常係數1/2也可以被忽略)。在演算法分析中,稱其時間複雜度為o(n2)。

有沒有好的辦法?圖2給出了通過迭代變換通項符號的程式。不難發現,需要的乘法次數就是n次,時間複雜度為o(n)。

int main()

cout<<"k="<

圖2  o(n)級高效率的程式

圖1的演算法很直觀,有人不想放棄這個演算法。是不是可以改進pow函式的演算法來做呢?

下面的問題是:求x的n次冪,即xn=x*x*…*x(共n個)的值。

直接用迴圈構造程式,程式段如圖3所示。

pow=1;

j=1;

while(j<=n)

圖3 直接用迴圈構造求冪程式 

還有一種快速求冪演算法,如圖4所示。這段程式不分析了,同學們給出x和n值,如求37,走查一遍(一定要自己走查一下),數一數用了幾次迴圈,感嘆吧。設想n很大,如30或更大,接著感嘆吧。

pow=1

while (n > 0)

圖4 快速求冪演算法

由此可見,圖2的演算法比圖1的演算法絕對好。無論在圖1的區域性做多少努力,大局不可改變。

有些同學會拿出平行計算、高效能計算等說理,講不必這麼摳演算法的效率,認為當計算硬體和平台足夠強大時,這樣的思維並不顯得有太大的價值。甚至我親自聆聽過一位著名教授的言論:「我們不需要在演算法方面花那麼大的精力,利用機群,增加並行度,是一種更直接和簡單的方法。」我們不應該忽視了教授此言之中暗含的前提而就此將教授奚落一番了事。此言有點道理,但事情並非如些。

面對一塊巨石,等待一位大力士將之移開是一種辦法。但為什麼不找來一根槓桿,用很小的力量將之撬動呢?這裡需要的是智慧型的力量,體現出的是智慧型的美。當這塊巨石足夠大,以至於任何大力士都無法憾動時,我們依靠的只有智慧型了。

學習計算機,學習用程式設計的方法解決問題,注重效率是一種基本的品質。你將來在演算法科學的領域內,會掌握更多處理問題的典型方法。這是我們要的基本功,是職業素養的表現。

初學者談初學者學html

這是乙個段落。解釋一下就是 html 與 html 之間的文字是描述網頁。head 與 head 之間的文字是文件的元資料。title 與 之間的文字是文件的標題。body 與 body 之間的文字是可見的頁面內容,是文章的主體部分。h1 與 h1 之間的文字被顯示為乙個大標題。p 與 p 之間的文...

初學者談執行緒

隨手記錄一下,方便與我一樣的初學者理解執行緒。執行緒,可以理解為程式的執行渠道。每多乙個執行緒,其實就多了乙個渠道。就像一條河一樣,我挖一條河道就是乙個執行緒,多條河道就是多條執行緒。那麼他的作用其實就是就是為了分擔壓力 應對高併發這種情況存在 就像河道一樣,河道越多,水就疏通的越快,壓力就越小。那...

對測試初學者的建議

對測試初學者的建議 angle duan 測試初學者對軟體測試以及他們在實際工作中將怎樣實現測試有很多問題。作為乙個測試初學者,你需要對軟體測試這個職業有一定了解。下面的這些建議,對於你在軟體測試的發展,肯定會有所幫助。這些測試真理同樣適用於有豐富測試經驗的測試工程師。將下面的測試真理運用到你的測試...