演算法想得慢
『壹』 一天弄懂一個演算法很慢嗎
慢。一個演算法也就三四個小時吧,學習演算法不僅只是學習,還要查閱資料,所以我想至少需要3個小時。學習演算法需要多長時間?不得不說,為了高考取得好成績,在中學時代,學校的老師大都灌輸了高考這條狹路的思想。其實除了高考我們還有很多選擇,一次失利不代表人生就沒戲了。
『貳』 我目前在自學演算法,但是我感覺很吃力啊。有時候一個稍微復雜的演算法,想很久都不能明白。希望前輩們給點建
復雜演算法難理解是肯定的
比如波利亞計數定理,就算我寫出程序了也沒有完全理解
其實弗洛伊德最短路演算法也挺難理解的
可以自己先試著解答題目,然後再去看演算法
或者debug,單步調試看看演算法是怎麼工作的
『叄』 編程想不出演算法怎麼辦
首先假設你是計算機專業的大學生,或准備報考計算機專業的高中生。
需要先搞清楚自己是以下哪一類症狀:
1. 對於簡單的數學問題(如樓主提到的找質數、算階乘)想不出思路(想出非最優思路也算合格)。
2. 想得出數學思路,但是不會轉化為代碼(代碼冗長也算合格)。
如果是第1類,那麼考慮轉行比較實在吧;
如果是第2類,而且題主學習編程語言已經超過1個月,那麼也請考慮轉行吧;
如果是第2類,但是題主初學編程語言時間<1個月,那麼請繼續堅持,多讀現成代碼,然後自己編寫。如此1個月仍不樂觀,參考上一條。
對於用程序來解決數學問題,一個比較有效的方式是從對數學問題的定義入手。
再強調一遍,沒有思路的時候,試著從定義入手。
比如尋找質數的簡單(並不高效)演算法,有如下思維過程:
1. 質數的定義:只能被1和自身整除的大於1的正整數。
2. 從定義提煉判斷條件:
2.a. 不能被1或自身之外的任何數整除;
2.b. 大於1的正整數。
3. 用自然語言描述演算法過程:
3.a. 2是質數;
3.b. 對每一個大於2的正整數(N)進行如下驗證:用2到N-1除N(實際上到N的正平方根即可),若出現整除,則此數不是質數,否則是質數。
4. 將上述步驟翻譯為偽代碼或代碼。
5. 優化演算法(如剔除不必要的除法操作)。
熟練之後對於簡單問題可以在腦中進行迅速的問題定義和條件提煉,並在腦中想出模糊的演算法過程,然後直接寫代碼。
『肆』 演算法該怎麼學感覺好難
很多人都會說"學一樣東西難",一開始我也覺得很大程度是因為每個人的智力水平等等不可改變的因素. 但是後來我發現,有一個東西也很能決定一個人是否會覺得一樣東西難學,那就是理解方式.
一件事物通過不同的途徑讓一個人理解效果差異是很大的.就比如說數學裡面教你一個圓,有的人看到一個圓就能很快明白什麼是圓,有的人卻非得看到x^2+y^2 = r^2這種式子才有感覺,甚至有的人需要"到定點距離為定長的點集"這種描述才能理解. 那這個不一定是說誰的智力水平更高,而是因為他們對不同形式事物的敏感程度不同.
回到演算法上來.演算法本質是一種數學.他是抽象的操作集合.(看這么說你可能會覺得不知所雲,但是如果我說他只是一種解決問題的辦法可能就好理解). 所以很多書,論文,或者很多老師教的都是一種數學描述的演算法,這樣子的演算法就我個人而言相當難理解,看了就想到代數高數什麼的.. 但是如果找一個圖文並茂的解釋,或者找個人一步一步把一個演算法給你我比劃一下,我立刻就能理解. 說白了,就是你一定要找很多很多不同的角度來嘗試接受一種東西,你一定可以找到一種你相當敏感的角度,用這個角度學習你就會游刃有餘. 智力因素並沒有太大影響的.
具體點說,你可以試試這幾種不同的角度.
直接看數學形式的演算法.我個人最無法接受的形式,但是有人很喜歡..例子就是演算法導論上面那種描述.
聽一般語言描述,最理想是找一個明白的人,給你用通俗語言講講原理.這個不錯,很多我是這么理解的
圖形理解,叫理解的人給你畫插圖,分布圖,結構圖等等,來分解一個演算法,找到他的思路.說到圖,有一個人的博客這方面做得很好:matrix67.
程序理解.找到一種演算法的實現程序,對著程序理解,可以嘗試分布運行,觀察一下變數的變化,這樣來理解演算法.
實在太難的演算法,可以邊寫邊改來理解.當時我學習插頭dp的時候就是這樣,不論怎麼總是一知半解,最後硬著頭皮寫了一遍,改了很久,但是改過了的時候,也就真的明白了是怎麼回事了.
也許還有別的什麼辦法,因為人對事物的接受角度實在是太多了.多想想你平時學習什麼比較容易,找出你最敏感的理解方式就行了.
有感而發說的一些東西,不一定都是正確的,只供參考,歡迎指正.
『伍』 如何衡量一個演算法的快慢
如何衡量一個演算法的快慢
用具體的操作數來衡量
當我們說衡量一個演算法的快慢時,我們是希望找到一種方便的統一標准,使得對於同一個演算法,我們的衡量標准不會受到一些不重要的因素影響而保持一致;對於不同的演算法,我們能夠比較它們的優劣並在實際的應用中進行選擇。
一個自然的想法是測量這個演算法運行所需要的時間,然後選擇跑得快的演算法。但是不同的機器運行的速度是不一樣的,一個同樣的演算法在不同機器上測出來的時間可能非常不同。而且,每次想要知道一個演算法的快慢如果都要在機器上通過計時來測量的話,是一件非常痛苦的事情,因為有些演算法可能一次要跑上一天,一個月,甚至一個世紀。
一個有效的替代方法是通過計算一個演算法用了多少次操作(或者說運算量)來衡量它運行的快慢,比如用了多少次加減法,乘除法,函數調用和賦值等操作。操作數越多,運行的所需要的時間就越多。這樣的一種想法保證了我們對演算法的衡量不會因為測試環境的變化而變化,也不用通過實際運行來測量,只需通過計算就能得到操作數的數量。
用函數來衡量
僅僅計算操作數的一個問題是:一個固定的演算法,針對不同的輸入規模,它所需要的操作數量是不一樣的。比如一個排序的演算法,排100個數字和排10000個數字相比,排10000個數字所需要的運算量會大很多。也就是,操作數是隨輸入規模變化的一個函數。
所以,我們假如輸入規模是n,那麼操作數就是f(n)。有時候,輸入規模不只有一個,比如關於一個矩陣的演算法需要的操作數,可能和矩陣的長和寬都有關系,這時候,ff就變成了一個關於長和寬的二元函數,比如f(w,h)。這種擴展是合理的,但是為了討論方便,我們先只考慮規模只是一個變數n的情況。
『陸』 我大一學計算機的 感覺c語言那些循環 什麼的演算法很難想出來,我該怎麼辦,求幫助,我覺得自己不夠聰明
我是電子工程師,現在主演搞嵌入式方面,這個我深有體會,在學校都是書本教育,不太理解,容易糊塗,到了實力項目,激汪襪慢慢陵搜摸索就會恍然大明激戶的,現在建議你做些設計項目,電子比賽之類,跟著書本理論慢慢實踐,你很快上手