演算法怎麼想
A. 演算法思想可以簡單說一下嗎
業界公認的常用演算法思想有8種,分別是枚舉、遞推、遞歸、分治、貪心、試探法、動態迭代和模擬。當然8種只是一個大概的劃分,是一個「仁者見仁、智者見智」的問題。
枚舉演算法思想
枚舉演算法思想的最大特點是,在面對任何問題時它會去嘗試每一種解決方法。在進行歸納推理時,如果逐個考察了某類事件的所有可能情況,因而得出一般結論,那麼這個結論是可靠的,這種歸納方法叫作枚舉法。
枚舉演算法基礎
枚舉演算法的思想是:將問題的所有可能的答案一一列舉,然後根據條件判斷此答案是否合適,保留合適的,丟棄不合適的。在C語言中,枚舉演算法一般使用while循環實現。使用枚舉演算法解題的基本思路如下。
① 確定枚舉對象、枚舉范圍和判定條件。
② 逐一列舉可能的解,驗證每個解是否是問題的解。
枚舉演算法一般按照如下3個步驟進行。
① 題解的可能范圍,不能遺漏任何一個真正解,也要避免有重復。
② 判斷是否是真正解的方法。
③ 使可能解的范圍降至最小,以便提高解決問題的效率。
B. 演算法怎麼學
貪心演算法的定義:
貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的局部最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
解題的一般步驟是:
1.建立數學模型來描述問題;
2.把求解的問題分成若干個子問題;
3.對每一子問題求解,得到子問題的局部最優解;
4.把子問題的局部最優解合成原來問題的一個解。
如果大家比較了解動態規劃,就會發現它們之間的相似之處。最優解問題大部分都可以拆分成一個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,大部分情況下這是不可行的。貪心演算法和動態規劃本質上是對子問題樹的一種修剪,兩種演算法要求問題都具有的一個性質就是子問題最優性(組成最優解的每一個子問題的解,對於這個子問題本身肯定也是最優的)。動態規劃方法代表了這一類問題的一般解法,我們自底向上構造子問題的解,對每一個子樹的根,求出下面每一個葉子的值,並且以其中的最優值作為自身的值,其它的值舍棄。而貪心演算法是動態規劃方法的一個特例,可以證明每一個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。換句話說,不需要知道一個節點所有子樹的情況,就可以求出這個節點的值。由於貪心演算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。
話不多說,我們來看幾個具體的例子慢慢理解它:
1.活動選擇問題
這是《演算法導論》上的例子,也是一個非常經典的問題。有n個需要在同一天使用同一個教室的活動a1,a2,…,an,教室同一時刻只能由一個活動使用。每個活動ai都有一個開始時間si和結束時間fi 。一旦被選擇後,活動ai就占據半開時間區間[si,fi)。如果[si,fi]和[sj,fj]互不重疊,ai和aj兩個活動就可以被安排在這一天。該問題就是要安排這些活動使得盡量多的活動能不沖突的舉行。例如下圖所示的活動集合S,其中各項活動按照結束時間單調遞增排序。
關於貪心演算法的基礎知識就簡要介紹到這里,希望能作為大家繼續深入學習的基礎。
C. 演算法到底應該怎麼學
刷與不刷ACM ICPC的人在演算法能力上會有巨大差距。
如果真想深入掌握各種演算法,還是先刷題吧。刷到一定境界再去看更高級的演算法書。
不得不承認現實生活中,一般碼農工作對演算法能力要求太低了,這一度讓人們(包括我)認為演算法似乎不那麼重要。其實學習演算法所鍛煉出來的對各種問題敏感的反應和融會貫通能力還是非常重要的。
編程嘛,就是操作數據輸出結果
演算法和數據結構是配套的,你應該掌握的主要內容應該是:
這個問題用什麼演算法和數據結構能更快解決
這就要求你對常見的結構和演算法了熟於心,你不一定要敲代碼,用紙手寫流程是更快的方式。
對你不懂的數據結構,你要去搜它主要拿來幹嘛的,使用場景是什麼。
細節出錯是你對編程語言不熟悉才會導致的問題,跟你懂不懂演算法沒關系,這個你應該多寫寫練手小程序,背代碼是很愚蠢的行為。
其實我覺得你這么迷茫不如實現一下stl的函數好了
我的經驗就是去模擬(當然模擬只限於基礎的演算法)。甚至是手動模擬,比如我之前學深搜,學遞歸,代碼很簡單,但是因為涉及到棧,而你的大腦短時間內存儲的棧深度只有幾層(臨時變數越多你大腦能模擬的棧深度就越少),實際上你沒辦法用大腦去想。比如學習圖的深搜,一開始我是不理解的,對遞歸沒辦法理解。後來我就在紙上模擬出來,建立好鄰接表以後,按照代碼步驟一步步紙筆來模擬,慢慢就知道了代碼的工作過程。你學習快排也是,當然你背代碼也能寫出來,但是可能不理解,很快就忘了。《演算法導論》書上就有比較細致的執行過程,你手動模擬下partition和quicksort的過程,一開始就用很簡單的用例,把整個過程都手動執行一遍,慢慢就了解了。很多演算法都有一個循環不變式,你代碼如果邏輯正確並且能夠維持循環不變式,一般寫出來就是正確的。
建議找本《演算法》或者《演算法導論》這些教材,每學習一個演算法就先大致瀏覽下, 然後細致分析每一步代碼的執行過程(紙筆模擬或者代碼單步調試),當確認你真正明白之後,嘗試不看代碼就靠對演算法過程的了解和正確的邏輯去自己實現。
當然,我不認為你寫出很多演算法就是高手了,現在大部分高級語言不需要你重復造輪子,你造出來的質量也遠遜於庫中那些高手的代碼,可以去學習他們代碼的實現,比如看看stl源碼。真正工程用到的代碼與一般演算法實現還是有很多改進的。
最重要的不是你會寫這些演算法了,而是學會了很多思想。比如二分的思想,遞歸的思想,分治的思想,動態規劃,貪心等,以及現實中很多數據結構的抽象等。難的不是學會了演算法,而是如何運用這些演算法思想去解決問題。
D. 演算法該怎麼學感覺好難
很多人都會說"學一樣東西難",一開始我也覺得很大程度是因為每個人的智力水平等等不可改變的因素. 但是後來我發現,有一個東西也很能決定一個人是否會覺得一樣東西難學,那就是理解方式.
一件事物通過不同的途徑讓一個人理解效果差異是很大的.就比如說數學裡面教你一個圓,有的人看到一個圓就能很快明白什麼是圓,有的人卻非得看到x^2+y^2 = r^2這種式子才有感覺,甚至有的人需要"到定點距離為定長的點集"這種描述才能理解. 那這個不一定是說誰的智力水平更高,而是因為他們對不同形式事物的敏感程度不同.
回到演算法上來.演算法本質是一種數學.他是抽象的操作集合.(看這么說你可能會覺得不知所雲,但是如果我說他只是一種解決問題的辦法可能就好理解). 所以很多書,論文,或者很多老師教的都是一種數學描述的演算法,這樣子的演算法就我個人而言相當難理解,看了就想到代數高數什麼的.. 但是如果找一個圖文並茂的解釋,或者找個人一步一步把一個演算法給你我比劃一下,我立刻就能理解. 說白了,就是你一定要找很多很多不同的角度來嘗試接受一種東西,你一定可以找到一種你相當敏感的角度,用這個角度學習你就會游刃有餘. 智力因素並沒有太大影響的.
具體點說,你可以試試這幾種不同的角度.
直接看數學形式的演算法.我個人最無法接受的形式,但是有人很喜歡..例子就是演算法導論上面那種描述.
聽一般語言描述,最理想是找一個明白的人,給你用通俗語言講講原理.這個不錯,很多我是這么理解的
圖形理解,叫理解的人給你畫插圖,分布圖,結構圖等等,來分解一個演算法,找到他的思路.說到圖,有一個人的博客這方面做得很好:matrix67.
程序理解.找到一種演算法的實現程序,對著程序理解,可以嘗試分布運行,觀察一下變數的變化,這樣來理解演算法.
實在太難的演算法,可以邊寫邊改來理解.當時我學習插頭dp的時候就是這樣,不論怎麼總是一知半解,最後硬著頭皮寫了一遍,改了很久,但是改過了的時候,也就真的明白了是怎麼回事了.
也許還有別的什麼辦法,因為人對事物的接受角度實在是太多了.多想想你平時學習什麼比較容易,找出你最敏感的理解方式就行了.
有感而發說的一些東西,不一定都是正確的,只供參考,歡迎指正.
E. Java一些經典演算法自己想不出來怎麼辦比如,斐波那契,冒泡,一直都看別人寫,然後理解。
認真讀完演算法(Algorithm)第4版這本書,你會有很大收獲。
F. 編程想不出演算法怎麼辦
首先假設你是計算機專業的大學生,或准備報考計算機專業的高中生。
需要先搞清楚自己是以下哪一類症狀:
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. 優化演算法(如剔除不必要的除法操作)。
熟練之後對於簡單問題可以在腦中進行迅速的問題定義和條件提煉,並在腦中想出模糊的演算法過程,然後直接寫代碼。
G. 如何做演算法研究
一、DSP與TI
為什麼提到電機控制很多人首先會聯想到DSP?而談到DSP控制總繞不過TI,首先DSP晶元是一種具有特殊結構的微處理器。該晶元的內部採用程序和數據分開的哈佛結構,具有專門的硬體乘法器,提供特殊的指令,可以用來快速地實現各種數字信號處理演算法。基於DSP晶元構成的控制系統事實上是一個單片系統,因此整個控制所需的各種功能都可由DSP晶元來實現。因此,可以減小目標系統的體積,減少外部元件的個數,增加系統的可靠性。優點是穩定性好、精度高、處理速度快,目前在變頻器、伺服行業有大量使用。主流的DSP廠家有美國德州儀器(Texas Instruments,TI)、ADI、motorola、傑爾等其他廠商,其中TI的TMS320系列以數字控制和運動控制為主,以價格低廉、簡單易用、功能強大很是受歡迎。
二、常見的電機控制演算法及研究方法
1、電機控制按工作電源種類劃分:可分為直流電機和交流電機。按結構和工作原理可劃分:可分為直流電動機、非同步電動機、同步電動機。不同的電機所採用的驅動方式也是不相同的,這次主要介紹伺服電機,伺服主要靠脈沖來定位,伺服電機接收到1個脈沖,就會旋轉1個脈沖對應的角度,從而實現位移,因此,伺服電機本身具備發出脈沖的功能,所以伺服電機每旋轉一個角度,都會發出對應數量的脈沖,同時又與伺服電機接受的脈沖形成了呼應,或者叫閉環,進而很精確的控制電機的轉動,從而實現精確的定位,可以達到0.001mm。伺服電機相比較普通電機優勢在於控制精度、低頻扭矩,過載能力,響應速度等方面,所以被廣泛使用於機器人,數控機床,注塑,紡織等行業
三、PWM控制及測試結果
脈沖寬度調制是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中,脈沖寬度調制是一種模擬控制方式,其根據相應載荷的變化來調制晶體管基極或MOS管柵極的偏置,來實現晶體管或MOS管導通時間的改變,從而實現開關穩壓電源輸出的改變
H. 談談你對演算法的理解
演算法可以幫助我們解決生活中很多很多的小問題,可以說演算法在我們平時生活中都存在。
I. 想學習演算法,如何入門
入門的話推薦兩本書:《演算法圖解》和《大話數據結構》,
另外推薦一門視頻課程《300分鍾搞定數據結構與演算法》,不想花時間看書的同學,建議看這個視頻課程,是關於數據結構和演算法很好的一個課程。