導航:首頁 > 源碼編譯 > 把演算法學好的技巧

把演算法學好的技巧

發布時間:2022-06-12 01:54:08

A. 怎麼學好演算法

演算法是程序員的基石,學好演算法,是每一個程序員的必修課。創新工場董事長兼首席執行官李開復在他的著作《演算法的力量》中如此評價演算法的重要性:「演算法是計算機科學領域最重要的基石之一,但卻受到了國內一些程序員的冷落。許多學生看到一些公司在招聘時要求的編程語言五花八門,就產生了一種誤解,認為學計算機就是學各種編程語言,或者認為,學習最新的語言、技術、標准就是最好的鋪路方法。

B. 程序員如何學好演算法

一.基本演算法:

枚舉. (poj1753,poj2965)

貪心(poj1328,poj2109,poj2586)

遞歸和分治法.

遞推.

構造法.(poj3295)

模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)

二.圖演算法:

圖的深度優先遍歷和廣度優先遍歷.

最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓撲排序 (poj1094)

二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)

最大流的增廣路演算法(KM演算法). (poj1459,poj3436)

三.數據結構.

串 (poj1035,poj3080,poj1936)

排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)

簡單並查集的應用.

哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼樹(poj3253)



trie樹(靜態建樹、動態建樹) (poj2513)

四.簡單搜索

深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)

廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)

簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)

五.動態規劃

背包問題. (poj1837,poj1276)

型如下表的簡單DP(可參考lrj的書 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學

組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.

幾何公式.

叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)

多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)

中級(校賽壓軸及省賽中等難度):
一.基本演算法:

C++的標准模版庫的應用. (poj3096,poj3007)

較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)

二.圖演算法:

差分約束系統的建立和求解. (poj1201,poj2983)

最小費用最大流(poj2516,poj2516,poj2195)

雙連通分量(poj2942)

強連通分支及其縮點.(poj2186)

圖的割邊和割點(poj3352)

最小割模型、網路流規約(poj3308)

三.數據結構.

線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)

靜態二叉檢索樹. (poj2482,poj2352)

樹狀樹組(poj1195,poj3321)

RMQ. (poj3264,poj3368)

並查集的高級應用. (poj1703,2492)

KMP演算法. (poj1961,poj2406)

四.搜索

最優化剪枝和可行性剪枝

搜索的技巧和優化 (poj3411,poj1724)

記憶化搜索(poj3373,poj1691)

五.動態規劃

較為復雜的動態規劃(如動態規劃解特別的旅行商TSP問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)

樹型動態規劃(poj2057,poj1947,poj2486,poj3140)

六.數學

組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.
數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
隨機化演算法(poj3318,poj2454)
雜題(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.

坐標離散化.

掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多邊形的內核(半平面交)(poj3130,poj3335)

幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)

高級(regional中等難度):
一.基本演算法要求:

代碼快速寫成,精簡但不失風格

(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)

保證正確性和高效性. poj3434

二.圖演算法:

度限制最小生成樹和第K最短路. (poj1639)

最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最優比率生成樹. (poj2728)

最小樹形圖(poj3164)

次小生成樹.

無向圖、有向圖的最小環

三.數據結構.

trie圖的建立和應用. (poj2778)

LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法(RMQ+dfs)).(poj1330)
雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移的目的). (poj2823)
左偏樹(可合並堆).

後綴樹(非常有用的數據結構,也是賽區考題的熱點).(poj3415,poj3294)
四.搜索

較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)

廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)

深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)

五.動態規劃

需要用數據結構優化的動態規劃.(poj2754,poj3378,poj3017)
四邊形不等式理論.

較難的狀態DP(poj3133)

六.數學

組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.

半平面求交(poj3384,poj2540)

可視圖的建立(poj2966)

點集最小圓覆蓋.

對踵點(poj2079)

C. 學計算機演算法怎樣才能學好

學計算機的演算法的話,我建議你還是多看看,先看別人是怎麼算得,然後在電腦上進行運用,看看別人的演算法的好處在哪,不足是什麼。計算機的演算法都是在不斷地改造中出來的,只有不斷地上機去練,去想,去做,才能真正的掌握那些演算法。

D. 如何提高演算法

計算的准確性不但在「應試教育」中佔主要地位,在「素質教育」的今天同樣重要。因為式子題的計算是學生解決實際問題的基礎,是每個小學生必須掌握的數學基礎知識和基本技能。只有計算過硬,才能進一步學好應用題和其他學科知識。式子題計算是各年級的重要內容,根據學生的考試和作業看,造成成績不理想的原因是計算能力差,准確率不高。造成這種現象的原因是多方面的:首先是低年級忽略了口算訓練,其次是在各年級中輕視了式子題的教學,誤認為計算式子題只要弄清計算順序,便能算出來,這種想法造成學生計算不細心,准確率低,從而缺乏攻克復雜式子題的興趣和信心。
計算準確,要從低年級抓起,不僅要教學生演算法,更要重視口算的訓練。口算是筆算、估算的基礎,只有讓學生在理解的基礎上掌握了口算的方法,堅持練習,逐步達到熟練的程度,才會在中、高年級中熟練、准確地計算。同樣,中高年級也不能忽視口算的練習。
式子題的訓練,還要從讀題做起,讀題要求學生正確規范,這樣有助於弄清運算順序。有括弧題,如(a+b)c,可讀作a與b的和乘以c,不能把括弧讀出來,嚴格要求學生讀准,從中悟出運算順序,確定自己的演算法。弄清計算順序是計算的前期。不這樣訓練,學生容易忽略和弄錯順序,對「准確」沒有把握,長期這樣,學生會對數學失去信心,失去積極性,教師也會對學生的計算失去信心。
文字題是式子題的讀題與列式計算的訓練,在讀題的基礎上,讓學生列出算式,正反結合訓練,會對學生的計算進行強化。文字題既然是計算題的敘述,那麼解決文字題就是列出綜合算式,它與應用題的解答有別,不能用分步計算,但可以用分步式分析。分析後列出綜合計算是解決文字題的正確做法。
加強運算定律和運算性質的教學,多用於實際計算,讓學生充分理解算理,掌握法則,鼓勵學生運用簡便演算法。除題目要求簡算外,教師要有意識地要求學生能簡算的奧運用簡算,提高學生的簡算興趣,使簡算貫穿於一切計算之中,逐步摸索計算的技巧,做到計算合理,靈活,准確,迅速,有力的提高學生的計算能力。
計算準確性的訓練要常抓不懈,養成檢查、驗算的習慣。對於一般的學生,式子題做完了不願意檢查、驗算,造成准確率低的現象。針對這種現象,要有意識的訓練,培養學生驗算,長此以往,「准確」就有保證了。
在式子題的計算中,採用適當的計算方法也要給與指導和練習。如高年級的分數、小數、百分數的混合運算,要根據題和自己的特長確定具體演算法。讓學生針對題型動腦思考,自做練習,在和他人比較,找到巧妙的演算法,也是准確性的訓練。
對學生經過長期多方面的計算訓練,培養學生嚴格、認真、對計算結果負責的良好習慣以及有毅力、肯動腦、克服困難的意志,學生的計算能力就會明顯提高,為下一步學習打下堅實基礎

E. 如何學好演算法

演算法是一個積累的過程,最現實的方法就是從題目中學演算法。http://acm.h.e.cn/ 這是一個比較牛逼的網站,我想學編程的人都知道,在裡面刷題目,然後看牛人的結題報告,最後做會了題目,演算法自然就掌握了。重在堅持~~

F. C語言裡面的演算法覺得很難,這樣才能學好演算法

學好C語言首先要學好他的語法,就比如說英語和語文,你必須要學好他的語法啊,並且要會用他的」單詞」,然後就是演算法了,這其中要有數學的計算和思想,但是你可以學好的,如果你學好VB那就更好了,因為VB和C語言、很都語法都是共通的.C重要的是思想和演算法..
如果要成為高手的話,那就必須數學基礎扎實,因為要到高級的話會用到很多的函數問題,編程也要邏輯性好,而且C就是一種模式,找到了很容易學的。
說實在的,有些東西當初我拿到書的時候是天天琢磨,月月思考,還真別說,有些當初我以為超級老難的問題就愣是這么給琢磨出來了。不過前提是我的數學和邏輯思維真的不錯。
慢慢來啊,呵呵,就像當初我以為我自己也學不會,結果還是讓我給征服了。其實入門比較困難一些,這都是過程,保持好的心態,如果真的想學就不要放棄,經過時間的積累我想一切都會晴朗的。

G. 如何學好演算法

摘要:演算法是程序員的基石,學好演算法,是每一個程序員的必修課。創新工場董事長兼首席執行官李開復在他的著作《演算法的力量》中如此評價演算法的重要性:「演算法是計算機科學領域最重要的基石之一,但卻受到了國內一些程序員的冷落。許多學生看到一些公司在招聘時要求的編程語言五花八門,就產生了一種誤解,認為學計算機就是學各種編程語言,或者認為,學習最新的語言、技術、標准就是最好的鋪路方法。

H. 怎樣學好演算法

演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。演算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化演算法在內的一些演算法,包含了一些隨機輸入。形式化演算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其後嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化演算法的情況。同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程序的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間復雜度和空間復雜度來考慮。

I. 怎樣學好數據結構與演算法

1、 有良好的學習興趣
(1)課前預習,對所學知識產生疑問,產生好奇心。
(2)聽課中要配合老師講課,滿足感官的興奮性。聽課中重點解決預習中疑問,把老師課堂的提問、停頓、教具和模型的演示都視為欣賞音樂,及時回答老師課堂提問,培養思考與老師同步性,提高精神,把老師對你的提問的評價,變為鞭策學習的動力。
(3)思考問題注意歸納,挖掘你學習的潛力。
(4)聽課中注意老師講解時的數學思想,多問為什麼要這樣思考,這樣的方法怎樣是產生的。
(5)把概念回歸自然。所有學科都是從實際問題中產生歸納的,數學概念也回歸於現實生活,如角的概念、至交坐標系的產生、極坐標系的產生都是從實際生活中抽象出來的。只有回歸現實才能使對概念的理解切實可靠,在應用概念判斷、推理時會准確。
2、 建立良好的學習數學習慣。
習慣是經過重復練習而鞏固下來的穩重持久的條件反射和自然需要。建立良好的學習數學習慣,會使自己學習感到有序而輕松。高中數學的良好習慣應是:多質疑、勤思考、好動手、重歸納、注意應用。學生在學習數學的過程中,要把教師所傳授的知識翻譯成為自己的特殊語言,並永久記憶在自己的腦海中。另外還要保證每天有一定的自學時間,以便加寬知識面和培養自己再學習能力。
3、 有意識培養自己的各方面能力
數學能力包括:邏輯推理能力、抽象思維能力、計算能力、空間想像能力和分析解決問題能力共五大能力。這些能力是在不同的數學學習環境中得到培養的。在平時學習中要注意開發不同的學習場所,參與一切有益的學習實踐活動,如數學第二課堂、數學競賽、智力競賽等活動。平時注意觀察,比如,空間想像能力是通過實例凈化思維,把空間中的實體高度抽象在大腦中,並在大腦中進行分析推理。其它能力的培養都必須學習、理解、訓練、應用中得到發展。特別是,教師為了培養這些能力,會精心設計「智力課」和「智力問題」比如對習題的解答時的一題多解、舉一反三的訓練歸類,應用模型、電腦等多媒體教學等,都是為數學能力的培養開設的好課型,在這些課型中,學生務必要用全身心投入、全方位智力參與,最終達到自己各方面能力的全面發展。
其它注意事項
1、注意化歸轉化思想學習。
人們學習過程就是用掌握的知識去理解、解決未知知識。數學學習過程都是用舊知識引出和解決新問題,當新的知識掌握後再利用它去解決更新知識。初中知識是基礎,如果能把新知識用舊知識解答,你就有了化歸轉化思想了。可見,學習就是不斷地化歸轉化,不斷地繼承和發展更新舊知識。
2、學會數學教材的數學思想方法。
數學教材是採用蘊含披露的方式將數學思想溶於數學知識體系中,因此,適時對數學思想作出歸納、概括是十分必要的。概括數學思想一般可分為兩步進行:一是揭示數學思想內容規律,即將數學對象其具有的屬性或關系抽取出來,二是明確數學思想方法知識的聯系,抽取解決全體的框架。實施這兩步的措施可在課堂的聽講和課外的自學中進行。
學數學的幾個建議
1、記數學筆記,特別是對概念理解的不同側面和數學規律,教師為備戰高考而加的課外知識。
2、建立數學糾錯本。把平時容易出現錯誤的知識或推理記載下來,以防再犯。爭取做到:找錯、析錯、改錯、防錯。達到:能從反面入手深入理解正確東西;能由果朔因把錯誤原因弄個水落石出、以便對症下葯;解答問題完整、推理嚴密。
3、記憶數學規律和數學小結論。
4、與同學建立好關系,爭做「小老師」,形成數學學習「互助組」。
5、爭做數學課外題,加大自學力度。
6、反復鞏固,消滅前學後忘。
7、學會總結歸類。可:①從數學思想分類②從解題方法歸類③從知識應用上分類
學習上占第一,每個同學都可以做到。之所以你占不了第一,主要有兩個原因:第一、生活方式、學習方法不正確,第二、沒有堅強的毅力。在這裡面毅力是第一重要的,學習方法是第二重要的。

J. 演算法怎麼學

貪心演算法的定義:

貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的局部最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。

解題的一般步驟是:

1.建立數學模型來描述問題;

2.把求解的問題分成若干個子問題;

3.對每一子問題求解,得到子問題的局部最優解;

4.把子問題的局部最優解合成原來問題的一個解。

如果大家比較了解動態規劃,就會發現它們之間的相似之處。最優解問題大部分都可以拆分成一個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,大部分情況下這是不可行的。貪心演算法和動態規劃本質上是對子問題樹的一種修剪,兩種演算法要求問題都具有的一個性質就是子問題最優性(組成最優解的每一個子問題的解,對於這個子問題本身肯定也是最優的)。動態規劃方法代表了這一類問題的一般解法,我們自底向上構造子問題的解,對每一個子樹的根,求出下面每一個葉子的值,並且以其中的最優值作為自身的值,其它的值舍棄。而貪心演算法是動態規劃方法的一個特例,可以證明每一個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。換句話說,不需要知道一個節點所有子樹的情況,就可以求出這個節點的值。由於貪心演算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。

話不多說,我們來看幾個具體的例子慢慢理解它:

1.活動選擇問題

這是《演算法導論》上的例子,也是一個非常經典的問題。有n個需要在同一天使用同一個教室的活動a1,a2,…,an,教室同一時刻只能由一個活動使用。每個活動ai都有一個開始時間si和結束時間fi 。一旦被選擇後,活動ai就占據半開時間區間[si,fi)。如果[si,fi]和[sj,fj]互不重疊,ai和aj兩個活動就可以被安排在這一天。該問題就是要安排這些活動使得盡量多的活動能不沖突的舉行。例如下圖所示的活動集合S,其中各項活動按照結束時間單調遞增排序。

關於貪心演算法的基礎知識就簡要介紹到這里,希望能作為大家繼續深入學習的基礎。

閱讀全文

與把演算法學好的技巧相關的資料

熱點內容
捷豹小型空氣壓縮機 瀏覽:553
綠盾文檔加密系統哪裡有賣 瀏覽:635
我的世界怎麼開掛在伺服器裡面 瀏覽:787
西門子自鎖正反轉編程圖 瀏覽:747
出國英語pdf 瀏覽:918
演算法線性匹配 瀏覽:672
山東省dns伺服器雲主機 瀏覽:552
安卓5g軟體怎麼隱藏 瀏覽:837
編譯內核空間不足開不了機 瀏覽:885
漢紀pdf 瀏覽:471
在哪裡下載國家醫保app 瀏覽:654
沒有與文件擴展關聯的編譯工具 瀏覽:426
我的世界反編譯mcp下載 瀏覽:19
安卓手柄下載什麼軟體 瀏覽:67
pushrelabel演算法 瀏覽:848
硬碟資料部分文件夾空白 瀏覽:615
cssloader的編譯方式 瀏覽:938
java面板大小 瀏覽:502
怎麼用命令方塊打出字體 瀏覽:499
台灣加密貨幣研究小組 瀏覽:296