Ⅰ 綆楁硶鐨勬湰璐ㄦ槸浠涔
鐩稿悓鐐癸細鏃犺轟綍縐嶈В棰樻柟寮,鍦ㄨВ鍐蟲煇涓瀹為檯闂棰樻椂,閮藉簲璇ユg『鐨勭悊瑙i棶棰樼殑棰樻剰,浠庣湅浼煎嶆潅鐨勯棶棰樹腑鏁寸悊鍑轟竴涓澶寸華,鐒跺悗閫氳繃綆楁硶錛堝嵆瑙e喅闂棰樼殑涓涓涓涓姝ラわ級鎻忚堪鍑烘煇涓闂棰樼殑瑙e喅榪囩▼,榪涜屼竴瀹氶噺鐨勮$畻,鏈鍚庨兘蹇呴』楠岃瘉璁$畻緇撴灉.
銆銆涓嶅悓鐐癸細褰撹$畻閲忚緝澶ф椂,浜哄伐瑙i樺氨鏈夌偣鍔涗笉浠庡績浜,鑰岃$畻鏈烘瘡縐掍笂浜挎$殑璁$畻閫熷害鍗翠笉鍦ㄨ瘽涓,騫朵笖鍙瑕佺畻娉曟g『,緙栫▼璇鍙ユ棤璇鐨勮瘽,浣跨敤璁$畻鏈虹紪鍐欑殑瑙i樼▼搴忓彲浠ュ弽澶嶄嬌鐢.渚嬪傦細sum=1+2+3+4+5鈥︹+錛坣-1錛+n榪欐牱鐨勯棶棰.
Ⅱ 什麼叫演算法
演算法,對應的英文單詞是algorithm,這是一個很古老的概念,最早來自數學領域,是用於解決某一類問題的公式和思想。
計算機科學領域的演算法,本質是一系列程序指令,用於解答特定的運算和邏輯問題。一般運用時間復雜度和空間復雜度來衡量演算法好壞。
演算法的應用領域多種多樣:
運算,例如計算兩個數的最大公約數。
查找,例如使用谷歌、網路搜索某一關鍵詞得出數據和信息。
排序:例如瀏覽電商網站時,商品按價格從低到高進行排序。
最優決策:例如游戲中讓AI角色找到迷宮的最佳路線。
參考資料:魏夢舒(@程序員小灰),《漫畫演算法:小灰的演算法之旅》:電子工業出版社,2019-05
Ⅲ 迪傑斯特拉演算法的本質是貪心還是動態規劃
貪心是一種特殊的動態規劃,動態規劃的本質是獨立的子問題,而貪心則是每次可以找到最優的獨立子問題。
貪心和動歸不是互斥的,而是包含的,貪心更快,但約束更強,適應范圍更小。
動歸和bfs的關系也是一樣的。
展開一點講,在求解最優化問題時,有多個解。而求解的過程類似一個樹,我們稱之為求解樹。
一般的求解樹真的是一棵樹,所以我們只能用bfs來搜索,頂多剪枝。
有些特殊的求解樹,中間很多結點是重合的,結點個數比所有搜索分支的個數少很多個數量級。這類問題較特殊,我們可以保存中間的搜索過程。而記憶化搜索和動態規劃本質上就是一個東西,快就快在可以不用重復計算很多中間結果(所謂的最優子問題)。
還有一些特殊的求解樹,更特殊,它們不止有很多重復結點,而且每次選擇分支的時候,我們可以證明只要選擇一個分支,這個分支的解就一定比其他選擇更優。這類問題就是貪心了,
所以bfs,dp,貪心三個方法都是解決最優化問題的方法,根據問題的不同,約束越大的問題可以用越快的方法,越慢的方法可以解決的問題越普適。
動態規劃的狀態轉移函數,可以抽象成這樣一種函數:
f(x)=g(f(x1), f(x2), f(x3), ... f(xn))
其中f就是我們說的獨立問題,每個f都有一個唯一值,也就是沒有後效性。
貪心也是這個函數,但可以證明:
f(xi) >= f(x1|x2|...|xn)
那麼我們就不用再去計算除了f(xi)以外的任何子狀態了,所以就更快
而標準的bfs,雖然也有
f(x)=g(f(x1), f(x2), f(x3), ... f(xn))
但是因為對於任意的f(x),它的子問題f(xi)的輸入狀態xi都不同(換一種思路也可以說f(xi)在不同的路徑下值都不同,本質上是我們怎麼定義xi,到底是狹義的參數還是廣義的狀態),所以無法使用內存去換取時間,就只能去遍歷所有狀態了。
Ⅳ 貪心演算法的本質
1. 貪心法(Greedy Algorithm)定義
求解最優化問題的演算法通常需要經過一系列的步驟,在每個步驟都面臨多種選擇;
貪心法就是這樣的演算法:它在每個決策點作出在當時看來最佳的選擇,即總是遵循某種規則,做出局部最優的選擇,以推導出全局最優解(局部最優解->全局最優解)
2. 對貪心法的深入理解
(1)原理:一種啟發式策略,在每個決策點作出在當時看來最佳的選擇
(2)求解最優化問題的兩個關鍵要素:貪心選擇性質+最優子結構
①貪心選擇性質:進行選擇時,直接做出在當前問題中看來最優的選擇,而不必考慮子問題的解;
②最優子結構:如果一個問題的最優解包含其子問題的最優解,則稱此問題具有最優子結構性質
(3)解題關鍵:貪心策略的選擇
貪心演算法不是對所有問題都能得到整體最優解的,因此選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
(4)一般步驟:
①建立數學模型來描述最優化問題;
②把求解的最優化問題轉化為這樣的形式:對其做出一次選擇後,只剩下一個子問題需要求解;
③證明做出貪心選擇後:
1°原問題總是存在全局最優解,即貪心選擇始終安全;
2°剩餘子問題的局部最優解與貪心選擇組合,即可得到原問題的全局最優解。
並完成2°
3. 貪心法與動態規劃
最優解問題大部分都可以拆分成一個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,大部分情況下這是不可行的。貪心演算法和動態規劃本質上是對子問題樹的一種修剪,兩種演算法要求問題都具有的一個性質就是子問題最優性(組成最優解的每一個子問題的解,對於這個子問題本身肯定也是最優的)。動態規劃方法代表了這一類問題的一般解法,我們自底向上構造子問題的解,對每一個子樹的根,求出下面每一個葉子的值,並且以其中的最優值作為自身的值,其它的值舍棄。而貪心演算法是動態規劃方法的一個特例,可以證明每一個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。換句話說,不需要知道一個節點所有子樹的情況,就可以求出這個節點的值。由於貪心演算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。
Ⅳ 機器學習的演算法和普通《演算法導論》里的演算法有什麼本質上的異同
作者:董可人
鏈接:http://www.hu.com/question/24976006/answer/29682806
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
演算法導論里的演算法本質上是對有精確解的問題,如何更有效率地求得這個解。這個效率可以是計算時間更短,也可以是計算過程所需要的空間更少。
一個簡單的例子是,給定一個亂序數組,如何快速的將其按從小到大的順序重新排列,或者找到其中的中位數。這些問題都有確定且唯一的答案,一般都會有一個笨方法(窮舉或遍歷),只要一步一步來就可以解,所謂演算法只是如何精簡步驟,更快更省事地找到這個解。這些演算法處理的數據也都是結構簡潔且干凈的類型,比如數組,二叉樹,圖之類的數據結構。數據規模對於這些演算法而言,影響的是計算所需的時間和空間,不會因為規模改變而影響演算法本身的邏輯以及計算的結果。
機器學習要解決的問題一般沒有精確解,也不能用窮舉或遍歷這種步驟明確的方法找到解,而且需要強調的是「學習」這個屬性,即希望演算法本身能夠根據給定的數據或計算環境的改變而動態的發現新的規律,甚至改變演算法程序的邏輯和行為。
舉例來說,可以是把一千份文檔歸類到不同的幾個類別里。最簡單的可以是給定幾個類別,比如新聞,小說,詩歌等,演算法來根據文章內容自動劃分到對應的類別里。這里可以看出這個問題即使讓人做,也有很多模糊不能確定的地方,比如一篇法制晚報上的犯罪紀實是應該劃到新聞,還是小說呢?或者說一篇長詩比如荷馬史詩是應該歸在小說還是詩歌呢?機器學習演算法想要解決的,就是根據從文章內容里找到的規律,來自動的給出一個劃分。而不同演算法可以給出不同的解,這些解都可以是「正確」的,所以一般還需要人為設計一個評判標准來決定孰優孰劣。
也可以不事先給定類別,而是讓演算法自己去發現文章中的規律,把相似度高的文章劃分到一起。這樣不同的演算法可能給出不同數量的類別劃分,可能是三個,四個,或者五個,也都可以是「正確」的劃分。甚至什麼是「相似度」,不同演算法也可以給出不同解釋,可以是名詞動詞形容詞的詞頻及比例,也可以是句子的語法結構等。
更進一步的,你可能還希望這個演算法能夠用來判斷一份新的文檔的類別。而輸入的新文檔越多,也會進一步擴大初始數據集的規模,規模變大以後,原來數據中不明顯的規律可能就變明顯了。比如說原來一千份文檔中只有一篇議論文,可能大多演算法都無法把它單獨劃出一個類別,但當你持續輸入一百份議論文後,數據中議論文的比例就變成了101/1100,差不多10%,這時候演算法就應該劃分出單獨的議論文類別。在這個意義上,數據本身也對演算法有很大的影響,這也是和演算法導論中的演算法的一個本質區別。
技術上說,演算法導論中的演算法關注點在數據結構和計算復雜度,屬於離散數學的一個分支,不涉及微積分等高等數學概念。機器學習的演算法本身是基於概率,統計和優化(optimization)等理論和技術,從這個角度上說給人感覺更「數學」一點。
在具體的實現細節上,機器學習的演算法會大量應用演算法導論中的技術來改進計算效率。但需要強調這僅僅是對底層實現來說,在演算法本身的邏輯上,二者沒有太多聯系。換句話說,演算法導論中的技術可以幫助你寫出更快的程序來運行機器學習演算法,但是這對機器學習要解決的問題本身是沒有什麼幫助的。熟練使用二叉樹散列表,准確估算一個圖演算法的復雜度,都沒有任何可能幫助你猜到在女朋友過生日時送什麼禮物最好(使用了機器學習演算法的淘寶君卻很可能知道!)。因此不要把它們看成是搭積木拼構件的關系。
最後,如果以上解釋仍然讓你費解,那麼還有一個更通俗的解釋:演算法導論是教你如何數數,而機器學習基本上相當於星座算命。一個很機械,一個靠忽悠,差不多就是這樣吧。
具體分析見鏈接:http://www.hu.com/question/24976006
Ⅵ 演算法的本質是什麼
演算法的本質是解決問題的方法,是思想
在早期的時候,人們遇到新問題,必須要去解決它,經過「冥思苦想」,「反復探索嘗試」, 最後總結歸納。這才形成了今天我們學習的各種演算法。如果無法領會到解決問題的思想,無法總結歸納,此衫就會有:「學演算法有什麼用?」。不知道為什麼學,自然會認為學了沒意義,沒有用處。
2.一個演算法應該具有以下五個重要的特徵:
①有窮性: 演算法的有窮性是指演算法必須能在執行有限個步驟之後終止,換句話說就是一個演算法必須總是在執行有窮步之後結束,且每一步都可在有窮時間內完成。
②確定性:演算法中的每條指令必須有確切的定義,不會產生二義性,並且對於相同的輸入只能得出相同的輸出。
③可行性:演算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性)。
④輸入: 一個算森畝腔法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定出了初始條件,這些輸入取自於某個特定的對象集合。
⑤輸出:一個演算法有一個或多個的輸出,這些輸出是同輸入有著特定關系的量,沒有輸出的演算法是毫無意義的。
演算法總是要解決特定的問題,問題來源就是演算法的輸入,期望的結果就是演算法的輸出,沒有輸入輸出的演算法是無意義的。
3.演算法設計的5個要求:
①正確性:最基本要求,演算法必須能解決某個問題的需求。
②可讀性:演算法的可讀性有助於人的閱讀與交流,容易調試和修改。
③健壯性:當輸入的數據非法時,演算法能適當做出反應或進行處理,而不會產生莫名其妙的輸出結果。
④效率性:演算法是為了解決大規模問題,因此需要運行效率足夠快。
⑤存儲性:演算法在執行過程中,所需要的最大存儲空間,應該盡可能的佔用小。
效率性與存儲性都與問題規模有關,求100人的耐攜平均分與求1000人的平均分,同一個演算法的所花費的執行時間與存儲空間顯然是不一樣的。
正確性,可讀性,健壯性不僅僅是演算法設計的要求,而是貫穿整個軟體設計層次。單對於演算法本身來說,我們最關注的層面是效率性。千萬不能死板的認為,演算法就是計算機程序。演算法是一切解決問題的思想,語言描述,偽代碼,流程圖,各種符號或者控製表格同樣是演算法。