哈哈哈 Jason【演算法】類別的文章都已經寫好幾篇了,才突然回過頭來寫入門介紹整個感覺就很奇怪>"< 還望大家見怪莫怪啦~ 畢竟也不是在寫書,要照一個chapter 一個chapter 的流程寫這樣。 反正寫一個作者沒多用心在經營、也沒什麼人在看的Blog 就.. 隨邊嘍~ 想到啥就寫啥xD 一、何謂演算法 What's Algorithm?
「演算法」這三個字近幾年可說是相當的火熱啊,感覺很容易就會聽到 youtube、facebook 又改演算法啦~
或者在阿發狗一戰成名之後,就很常聽見人家在討論什麼人工智慧演算法之類的。 在聽了很多人云亦云的概念後,那麼到底什麼是演算法? 如果我們從定義上來看:" 由有限步驟所構成的集合,可以用於解決某一個特定的問題。 " 覺得上面的文字敘述有一點費解嗎? 沒關係,我們來舉一個生活一點的例子: Ok, 假設我們今天要解決的那一個特定問題是「把蘋果做成一杯蘋果汁」, 那我們可以透過以下幾個步驟來實現:
那麼你就可以說,上面那6個步驟就是 " 把蘋果做成一杯蘋果汁 " 的演算法。
而在電腦科學的領域也是如此! 我們透過設計一連串的指令、動作,讓電腦去執行,以便協助我們解決一些特定問題。 聽到這邊,有沒有覺得所謂的演算法,好像就是我們認知裡面的"寫程式" ? well, 如果你要這麼講,其實思路上大致對了! 在CS 領域有這麼一條著名的公式:
今天說穿了,其實演算法就是一種解決問題的邏輯思維!
而這樣的思維邏輯可以像上面那樣用文字,或者透過代碼、流程圖、電子電路、數學等等之類的方式做描述。 二、演算法特性 Algorithm Features
關於這部分,當代CS領域大神-高德納(Donald Ervin Knuth) 在他的曠世巨作-《電腦程式設計藝術》裡已經幫我們整裡、歸納出一個演算法需要俱備的五個特性:
覺得這段太咬文嚼字的話,不理它也沒關係。 在實務上你不需要特別去背這個,因為在寫程式的時候它已經是一種內化的觀念了。 唯一有可能需要去背這五個特性的,大概只有那些準備要考試的人了吧~ 三、演算法的應用 Algorithm Applications
電腦的英文叫做 Computer,中文的意思是"計算機",說穿了電腦只會傻傻的不斷幫你做0跟1的運算。
沒錯,就只是會做 0 跟 1 的運算,除此之外就沒有了、就沒有了! 所以說,電腦很笨、電腦超級笨、電腦TMD 有夠笨! 我想這時候一定會有人說 wait wait wait WHAT? 不對欸 不對 電腦不是很聰明嗎? 我看人家可以用電腦選土豆欸! 還可以自動化的生產、自動駕駛、AI語音助理、還打敗了人類棋王... Jason 真的沒蓋你,電腦真的很笨! BUT ( 讓整個人生變的不同就在這個BUT ), 電腦非常聽話 100% Obey you,你問他108減46等於多少,它不會跟你說 哈哈哈 唉唷我數學不好啦~ 電腦幾乎不會算錯,基本上你已經可以當它完全不會算錯在用了。 電腦算的非常非常的快! 於是電腦科學家們就利用了電腦的這三個特性,發明了一種方法叫做 Programming,把現實世界需要解決的問題變成數學,丟給電腦來幫我們做運算。 因為電腦非常聽話,這時候人就可以透過撰寫代碼來教電腦要怎麼做某一件事,只是你教的方法是很聰明的,就會讓人有一種電腦很強大、很聰明的感覺。 電腦 + 程式設計 ( 資料結構 + 演算法 ) = 無所不能 而所謂的 Computer 可不單單只是你擺在家裡的那台主機,具這樣計算能力最小的單位就是一塊晶片(MCU、MPU、DSP、SOC...),而晶片早就被廣泛的應用在我們生活之中 e.g. 遙控器、平板、手機、電視、穿戴式裝置、汽機車的嵌入式電腦、火警系統、保全系統... 應該不難想像,只要有具備計算能力硬體在的地方,我們就需要演算法! 而現在工程師們也努力的用一個個偉大的算法來幫助建構我們這一個世界。也因為如此,所以其實也蠻容易在坊間看到叫作:無處不在的演算法、演算法統治世界、改變世界的XX演算法、統治世界的XX演算法之類的書。 最後我們再把觀念稍稍的做一個延伸,當今天「無所不能的電腦程式」碰上「無處不在的網際網路」就會變成時下非常夯的「物聯網 Internet of Things」。導讀:【物聯網】入門介紹-什麼是物聯網 What's IoT? 四、時間複雜度與空間複雜度 Time Complexity and Space Complexity這一個演算法到底設計的好不好呢? That is the question. 假設今天你是面試官,來應聘工程師的 A 跟 B 兩個人,你要怎麼決定錄取誰? 當然啦,我們先撇除掉 A是妹子、B是漢子,再怎樣你都錄取 A; 或者 A 是正咩、B 是普妹,再怎樣你還是錄取 A; 還是一些你難以言恥的對於外貌上的癖好,而讓你選擇錄取了誰。 今天就是兩個學經歷相當,堂堂正正的醜肥宅,你要怎麼選? ( 不可以跟我說兩個都不要,不然寫不下去了。) 既然是找工程師,通常你讓他們各寫了一支程式 ( 解決同一個問題 ) 嘛,然後再來比較看看誰寫的好! 那麼問題就來啦~ 如果今天兩支程式都能正常work 的時候,你要怎麼比? 總不能說因為 A 平常考試都考第一名,所以寫出來的程式就比考第十名的 B 好吧.. 還是你認為同一個問題 A 寫了10 行代碼就搞定了, B 卻寫了 30行,這樣就代表 A 寫的比 B 好了嗎? 結果一丟到電腦上去執行發現 A 寫了10行的程式要執行3秒,B 雖然寫了 30行可是只要執行1秒,A 跟 B 寫出來的程式要解決同一個問題,B 的程式只花了1秒解決、A的程式卻花了3秒,這樣看來是不是反而代表說其實 B 寫的程式是比 A 寫的好。 當然代碼也不是寫的多就好,也很有可能 A 寫了500行,B寫了50行,最後丟到電腦上執行 A 的程式執行了3秒,B 的只需要1秒。如果我們把「計算一支程式丟到電腦上需要執行多久」的概念,用比較科學一點的方式來做描述的話,就是所謂的「時間複雜度」。 另外還有一種情況可能是,A 跟 B 寫出來的程式丟在電腦上執行須要花費的時間是一樣的,但 A 的卻需要更多的記憶體資源,這樣一來我們也會認為 B 的程式比 A 好 ( 因為它更省資源 ),所以「一支程式在執行時需要耗費多少的記憶體資源」這樣的概念,就是所謂的「空間複雜度」。 Ok, 那我們就有一點眉目了!當我們需要用比較客觀的方式去評斷一個演算法的效能好不好的時候,我們就會討論它的「時間複雜度」與「空間複雜度」。 至於詳細這兩個東西該怎麼計算,Jason 有專門寫一篇來討論。【傳送門】 新手入門,推薦讀物:
3 評論
楊珀儼
9/28/2020 22:17:21
謝謝jason的講解
回覆
Hi Jason, 對於願意在網路為陌生人答疑解惑的人,我一向都十分敬佩那樣開放的胸襟與知識的分享。
回覆
王宣尹
6/29/2021 19:13:33
一個能有條理排除數字的公式
回覆
發表回覆。 |
Jason Chen人不光是生來就擁有一切,而是靠他從學習中得到的一切來造就自己。- 歌德 文章分類
全部
封存檔
九月 2023
|