數據結構與算法分析學習思維總結第一章

第一章引論

引論中心思想

1、在合理的時間內能夠處理較大的數據量,纔是一個切合實際的算法。

2、寫出一個可以工作的程序並不夠,如果在巨大數據集上運行,那麼運行時間也成了重要問題。


所以學習算法的目之一:對於大量的輸入,估計程序的運行時間,在尚未 具體編碼的情況下比較兩個程序的運行時間。並且改進程序的速度,確定程序瓶頸的方法

補:後面還會看到,如果輸入量不大,而過多設計也是得不償失的,不過不在算法討論範圍內,那可能叫做過度設計


引論中提出的數學概念

幾何級數:幾何級數是一個數學上的概念,可以表示成

  
,即x的y次方的形式增長,又叫等比級數。

算術級數:又稱等差級數

斐波那契數:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 可證明F(K+1)< (5/3)^(K+1)

數學歸納法:......

如果N整除A-B,那麼我們就說A與B模同餘。無論A還是B被N去除,所得餘數都是相同的。


遞歸簡論

遞歸的定義:當一個函數用它自己來定義時就稱爲是遞歸的。


C提供的僅僅是遵循遞歸思想的一種企圖,不是所有的數學遞歸函數都能有效的由C的遞歸模擬來實現。

對於數值計算使用遞歸通常不是好主意。


遞歸的基本法則:

1.基準情況

2.不斷推進

3.設計法則

4.合成效益法則:在求解一個問題的同一實例,切勿在不同的遞歸調用中做重複性的工作。

mod操作花消很大:

N%10 = N - [N/10] * 10



引論中心思想原由:

設有一組N個數而要確定其中第K個最大者(選擇問題)。


解法一:冒泡法

就是用冒泡法,把N個數排列起來,取第K個。

該算法就是:想象共有N個氣泡,大的氣泡要往上浮動,由於氣泡是連續的,相臨氣泡做對比,大的氣泡最終到達上面。

然後對剩下的氣泡繼續排序,最終完成了排序。

所以運行時間爲n + (n-1) + (n-2) + .... + 1 = n*(n-1)/2

即時間複雜度O(N^2)

今天仔細寫了一下這個程序,發現一些問題。


根據程序細節,發現一個爲N次的for循環,實際執行次數是2N,判斷N次,加上自增N-1,加上初始值共2N次,每個for循環,係數應該乘以2。

每次冒泡從N個泡,以等差數列遞減,但是遞減過程中是執行了交換操作,每次交換是要執行3次的,所以係數應該乘以3。

綜上,實際計算出來的n*(n-1)/2實際是for循環直接取其執行的次數,而沒有乘以實際的係數。


http://blog.csdn.net/yuzhihui_no1/article/details/44339711#t5有冒泡法詳細說明,我是按照自己理解說明的,以前好象看過一個算法動態圖,但是沒找到。

解法二:

將前K個元素讀入數組,並以遞減的順序排序。接着將剩下的元素讀入,如果有比第K個元素小的,那麼把該元素放在正確的位置上,並擠走第K個元素。

a)先把K個元素排序,假設排序時間爲T1,也可以用冒泡法k*(k-1)/2

b)讀入剩下一個元素,假設正確位置是第一個,則調整數組時間最長,即後面N-1個數整體後移一位,時間爲K

c)繼續插入剩餘的元素,則數組整體調整最長時間爲(N-K )*K

所以運行時間爲 k*(k-1)/2 + (N-K )*K = NK-K^2/2-K/2

至於兩個算法的好壞就應該看K/N的比值了。

實際上相對來說,如果K是有限值,而N是無限值,即K/N 約等於0

那麼第二種算法時間常數接近N



解法三:

第七章有一種方法可以在1S左右給出問題的解。

待補充


雖然前兩個算法能算出結果,但是對於大量數據下,如K=500000下,需要計算若干天才能解決,所以前兩種算法是不切實際的。

這就證明了

對於大量的輸入,估計程序的運行時間,在尚未 具體編碼的情況下比較兩個程序的運行時間。並且改進程序的速度,確定程序瓶頸是算法的考量。


問題2:方格字謎

解法:

可以從(行、列、方向)上逐一組合,並且與單詞表相比較。

如果只給出迷板,單詞表是一本英文字典,則上面的解決方法消耗的時間是可觀的。不過,這樣的問題有可能在數秒內解決的,即使單詞表很大。

待補充(引論挖的坑還真多)


引論數學公式證明:

待補充


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章