程序設計的非常規總結

一般思想

1、將問題簡化,從比較簡單的情況開始分析,比如1個元素情況,2個元素情況,3個元素情況,不斷增加,尋找規律,這樣有利於發現規律,從而解決問題,並且也有利於處理邊界情況。比如編程之美1.11、又如送貨站選址問題、1的個數問題等都可一通過逐漸的分析加以解決
2、從比較簡單的例子,模擬程序運行過程,比如二分查找,可以使用4個元素的例子,模擬查找過程,總結判斷條件等。

3、拿到一個問題,首先看看能否依照題意通過循環直接求解,能否分治求解,分治求解關鍵的是兩部和合並後如何求解,例如距離最近的點問題,歸併排序問題,數組和最大問題(編程珠璣上的解法)這和使用遞歸的解法很相似,分治法通常採用遞歸解決問題、如果是組合優化問題,優先考慮動態規劃或貪心求解

4、關於“2”,從中國古代的陰陽,到辯證唯物主義的正反面,“2”在哲學上具有重要的意義。對計算機來說更是如此:計算機中的二進制;分治法通常將問題分成2份;折半查找也有2;很多問題要麼分成兩面來看(二分查找);要麼分成兩個子問題(分治法);要麼扣其兩端,比較中間(鏈表相交使用2個指針、找符合條件的兩個數編程之美2.2、編程之美2.21等問題都很2有關);還有數據結構二叉樹;分析問題時,查其兩端,使用兩個指針,可能會給問題的解決帶來諸多方便,再比如可以用兩個stack來實現一個queue。

關於動態規劃

1、如果一個問題涉及到求最優的解,就可能會試用動態規劃來求解
2、動態規劃關鍵要給出遞歸求解的方程,再看看遞歸過程中是否重複了某些求解過程,將這些求解過程預先從底向上的求解出來並保存好,以後直接使用。

3、如果能畫出保存數據的矩陣或數組,程序基本就清楚了,由於是自底向上求解,在求解i問題時,使用到i-1的結果,也就是訪問數組或矩陣的i-1位置

4、動態規劃常常設計到組合爆炸問題,一般不要考慮如何組合來解決問題,因爲這樣通常不利於思考程序如何設計,而應該考慮如何循環並設置保存計算結果的矩陣,通過i-1到i的迭代來解決問題,組合雖然是問題的直接表達,但不利與程序的設計,因爲程序最終是通過若干個循環來完成的。

5、保存數據的矩陣或數組通常比處理的數據要多一行(列),因爲第0行(列)是初始值,用來計算i=1(0)時,用到i-1數據

*6、如果用到循環求部分和問題,常常會導致增加N倍的複雜度,這時可以利用以前求和的結果+當前元素來減少循環的次數,從而降低複雜度,例如:送貨站選址問題、子數組最大和問題等等,這一點很有價值。

關於遞歸

1、如果遞歸前對全局或引用變量++了,那麼如果遞歸後希望該變量恢復到以前的值,那麼遞歸後--該變量,例如求樹的高度,就採用了這種策略。

2、遞歸使用了函數調用的結果,我們不用關心結果是如何得到的,直接使用就是了,但其實不然,實際的計算過程都是在遞歸後面真正的計算處理過程完成的,而遞歸得到的結果常常有利與後面的計算過程,典型的問題是求最近兩點的距離問題。

3、遞歸常常帶來效率問題,比如求斐波那契數列問題,循環的速度要遠高於遞歸的速度,遞歸的效率和棧的規模都比較限制遞歸問題能夠處理的問題的規模。

常識問題

1、數組中間的位置是(start + end) / 2,分治算法通常處理F(start, (start + end) / 2)和F((start + end) / 2 + 1, end)兩個問題,而折半查找,因爲已經比較了中間的元素,因此start = middle + 1;或end = middle - 1,start = end時處理只有一個元素的情況,需要特別注意

2、數組中元素的個素爲end - start + 1個

3、給定一個數要求各位通過模10來獲得,要取十位以上的數據通過除10來處理,

       例如123,123 % 10 = 3; 123 / 10 = 12


發佈了82 篇原創文章 · 獲贊 3 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章