當前位置:首頁 » 操作系統 » 學演算法怎麼學

學演算法怎麼學

發布時間: 2022-05-14 16:40:16

A. 大學生如何學習演算法

要學好算數首先得多算,再再者就是多練。
算術是數學中最古老、最基礎和最初等的部分,它研究數的性質及其運算。把數和數的性質、數和數之間的四則運算在應用過程中的經驗累積起來,並加以整理,就形成了最古老的一門數學--算術。在古代全部數學就叫做算術,現代的代數學、數論等最初就是由算術發展起來的。後來,算學、數學的概念出現了,它代替了算術的含義,包括了全部數學,算術就變成了其中的一個分支。

B. 演算法到底應該怎麼學

刷與不刷ACM ICPC的人在演算法能力上會有巨大差距。
如果真想深入掌握各種演算法,還是先刷題吧。刷到一定境界再去看更高級的演算法書。
不得不承認現實生活中,一般碼農工作對演算法能力要求太低了,這一度讓人們(包括我)認為演算法似乎不那麼重要。其實學習演算法所鍛煉出來的對各種問題敏感的反應和融會貫通能力還是非常重要的。
編程嘛,就是操作數據輸出結果
演算法和數據結構是配套的,你應該掌握的主要內容應該是:
這個問題用什麼演算法和數據結構能更快解決
這就要求你對常見的結構和演算法了熟於心,你不一定要敲代碼,用紙手寫流程是更快的方式。
對你不懂的數據結構,你要去搜它主要拿來幹嘛的,使用場景是什麼。
細節出錯是你對編程語言不熟悉才會導致的問題,跟你懂不懂演算法沒關系,這個你應該多寫寫練手小程序,背代碼是很愚蠢的行為。
其實我覺得你這么迷茫不如實現一下stl的函數好了
我的經驗就是去模擬(當然模擬只限於基礎的演算法)。甚至是手動模擬,比如我之前學深搜,學遞歸,代碼很簡單,但是因為涉及到棧,而你的大腦短時間內存儲的棧深度只有幾層(臨時變數越多你大腦能模擬的棧深度就越少),實際上你沒辦法用大腦去想。比如學習圖的深搜,一開始我是不理解的,對遞歸沒辦法理解。後來我就在紙上模擬出來,建立好鄰接表以後,按照代碼步驟一步步紙筆來模擬,慢慢就知道了代碼的工作過程。你學習快排也是,當然你背代碼也能寫出來,但是可能不理解,很快就忘了。《演算法導論》書上就有比較細致的執行過程,你手動模擬下partition和quicksort的過程,一開始就用很簡單的用例,把整個過程都手動執行一遍,慢慢就了解了。很多演算法都有一個循環不變式,你代碼如果邏輯正確並且能夠維持循環不變式,一般寫出來就是正確的。
建議找本《演算法》或者《演算法導論》這些教材,每學習一個演算法就先大致瀏覽下, 然後細致分析每一步代碼的執行過程(紙筆模擬或者代碼單步調試),當確認你真正明白之後,嘗試不看代碼就靠對演算法過程的了解和正確的邏輯去自己實現。
當然,我不認為你寫出很多演算法就是高手了,現在大部分高級語言不需要你重復造輪子,你造出來的質量也遠遜於庫中那些高手的代碼,可以去學習他們代碼的實現,比如看看stl源碼。真正工程用到的代碼與一般演算法實現還是有很多改進的。
最重要的不是你會寫這些演算法了,而是學會了很多思想。比如二分的思想,遞歸的思想,分治的思想,動態規劃,貪心等,以及現實中很多數據結構的抽象等。難的不是學會了演算法,而是如何運用這些演算法思想去解決問題。

C. 演算法到底應該怎麼學

很多人都會說"學一樣東西難",一開始我也覺得很大程度是因為每個人的智力水平等等不可改變的因素. 但是後來我發現,有一個東西也很能決定一個人是否會覺得一樣東西難學,那就是理解方式.
一件事物通過不同的途徑讓一個人理解效果差異是很大的.就比如說數學裡面教你一個圓,有的人看到一個圓就能很快明白什麼是圓,有的人卻非得看到x^2+y^2 = r^2這種式子才有感覺,甚至有的人需要"到定點距離為定長的點集"這種描述才能理解. 那這個不一定是說誰的智力水平更高,而是因為他們對不同形式事物的敏感程度不同.

回到演算法上來.演算法本質是一種數學.他是抽象的操作集合.(看這么說你可能會覺得不知所雲,但是如果我說他只是一種解決問題的辦法可能就好理解). 所以很多書,論文,或者很多老師教的都是一種數學描述的演算法,這樣子的演算法就我個人而言相當難理解,看了就想到代數高數什麼的.. 但是如果找一個圖文並茂的解釋,或者找個人一步一步把一個演算法給你我比劃一下,我立刻就能理解. 說白了,就是你一定要找很多很多不同的角度來嘗試接受一種東西,你一定可以找到一種你相當敏感的角度,用這個角度學習你就會游刃有餘. 智力因素並沒有太大影響的.

具體點說,你可以試試這幾種不同的角度.
直接看數學形式的演算法.我個人最無法接受的形式,但是有人很喜歡..例子就是演算法導論上面那種描述.
聽一般語言描述,最理想是找一個明白的人,給你用通俗語言講講原理.這個不錯,很多我是這么理解的
圖形理解,叫理解的人給你畫插圖,分布圖,結構圖等等,來分解一個演算法,找到他的思路.說到圖,有一個人的博客這方面做得很好:matrix67.
程序理解.找到一種演算法的實現程序,對著程序理解,可以嘗試分布運行,觀察一下變數的變化,這樣來理解演算法.
實在太難的演算法,可以邊寫邊改來理解.當時我學習插頭dp的時候就是這樣,不論怎麼總是一知半解,最後硬著頭皮寫了一遍,改了很久,但是改過了的時候,也就真的明白了是怎麼回事了.

也許還有別的什麼辦法,因為人對事物的接受角度實在是太多了.多想想你平時學習什麼比較容易,找出你最敏感的理解方式就行了.

有感而發說的一些東西,不一定都是正確的,只供參考,歡迎指正.

D. 演算法該如何學習

我的研究生生涯絕對是一個反面典型——翹課,實習,寫水論文,做水研究,但有一點我頗為自得——從頭到尾認真聽了韓軍教授的演算法設計與分析課程。

韓軍給我印象最深的有兩點:課堂休息時跑到外面和幾個學生借火抽煙;講解演算法時的犀利和毫不含糊。
盡管韓軍從來沒有主動提及,但我敢肯定演算法設計與分析基礎就是他演算法課程事實上的(de-facto)教材,因為他的課程結構幾乎和這本書的組織結構一模一樣。

如果數據結構與演算法分析——C語言描述是我的數據結構啟蒙,那麼韓軍的課程和演算法設計與分析基礎就是我的演算法啟蒙,結合課程和書籍,我一一理解並掌握了復雜度分析、分治、減治、變治、動態規劃和回溯這些簡單但強大的演算法工具。

E. 怎麼學習演算法

1、先學好一種熱門的編程語言基礎,一定要精通;
2、學好數學,由淺入深,高等數學、線性代數、離散數學、概率論、數理統計、計算方法等等;
3、主要培養邏輯能力,可以去網上下載或參考經典演算法題目的解法和思路,因為算數的部分計算機能搞定~
4、不要束縛自己的思維,頭腦風暴一般,隨意思考,演算法想怎麼寫就怎麼寫,你會發現突然就寫對了,但不知道為什麼會對=_=

希望對你有幫助

F. 做為一個初學者,如何才能學好演算法呢,感覺自己很菜

凡事都講究動機,你學習演算法的目的是什麼呢?目的不同,學法不同側重不同。
如果你是准備跳槽,以面試為目的,可以先從cracking the coding interview入手,題目是按照鏈表,樹圖,遞歸這種章節安排的,每章都有題目,難度適中,第一遍自己寫不出來很正常,畫圖分析,然後再做第二遍,第二遍就快很多,理解也深刻了,實在理解不了的演算法,沒辦法,背吧,說不定到後面不知什麼時候就理解了,所謂讀書百遍,其意自現,演算法也一樣。
如果你是半路出家的程序員,看書覺得看不下去,可以試著看看視頻,現在網路這么發達,網上有很多免費的精品視頻,比如潭州教育老師的數據結構以及清華鄧俊輝老師的數據結構都是特別好的課程。
最後一種就是你對演算法理論和精髓確實感興趣,且有一定的數學功底,你可以嘗試研究下《演算法導論》,甚至《計算機程序設計藝術》(反正我是看不下去)。
其實,無論出於哪種目學習演算法,其實最重要的一點就是:多編程實踐,多思考,這是廢話,但這也是真理。

G. 如何學習數據結構與演算法

1、記住數據結構,記住演算法思想(是什麼)

記住數據結構最直觀的東西;記憶該數據結構的定義、性質、特點等。很多東西的理解和創新都是以記憶為前提的。


2、進行大量相關編程練習,用編程語言去實現某一數據結構上的演算法(怎麼辦)


很多時候,理解一個演算法很容易,很容易在紙上去模擬一個演算法的實現過程。但具體實現,則是另一回事。一定得先自己思考,然後再去看書中給的編程語言實現。


3、“記住”特定情景下,利用某一特定的數據結構,去解決問題 (為什麼+怎麼辦)


每介紹一種數據結構,浙大數據結構與演算法的MOOC課程都會有一個實際問題來作為“引子”,回答了“這種數據結構為什麼會出現”。有的是為了實現特定的操作,有的是為了時間和空間上(大部分考慮的是時間復雜性)效率的更高(所以,沒事的時候,分析一下演算法的時間復雜性)。這些東西,我們也須理解記憶。每一數據結構都有其特性,去解決某一類問題,我們需要去記憶,去感悟。


4、形成一個屬於自己的知識體系


如何去“記住”(記好筆記,多多復習);在學習過程中,遇到挫折,產生挫敗感該如何處理(這個是必然會發生的,總有難以理解不會的地方);如何進行心態方面的調整(欲速則不達,不過也有”敏捷學習“的概念)。

H. 演算法怎麼學

貪心演算法的定義:

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

解題的一般步驟是:

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

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

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

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

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

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

1.活動選擇問題

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

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

I. 想學習演算法,如何入門

入門的話推薦兩本書:《演算法圖解》和《大話數據結構》,

另外推薦一門視頻課程《300分鍾搞定數據結構與演算法》,不想花時間看書的同學,建議看這個視頻課程,是關於數據結構和演算法很好的一個課程。

熱點內容
使命召喚生化武器怎麼配置 發布:2024-10-10 13:13:15 瀏覽:490
磁碟陣列怎麼配置管理口 發布:2024-10-10 13:10:05 瀏覽:187
如何撤銷自己的配置 發布:2024-10-10 12:41:47 瀏覽:687
win7無法復制文件夾 發布:2024-10-10 12:40:11 瀏覽:147
文章存儲結構 發布:2024-10-10 12:40:11 瀏覽:881
添加多個FTP網站的方法有哪些 發布:2024-10-10 12:03:03 瀏覽:842
表格怎麼調用網頁資料庫資料庫數據 發布:2024-10-10 11:37:33 瀏覽:657
海力壓縮機 發布:2024-10-10 11:32:26 瀏覽:526
洗過的海帶存儲方法 發布:2024-10-10 11:19:00 瀏覽:242
64H的源碼 發布:2024-10-10 11:06:01 瀏覽:154