iT邦幫忙

2021 iThome 鐵人賽

DAY 1
0
自我挑戰組

30天不怕演算法:白話文版系列 第 1

Day 01:什麼是演算法?

演算法這個名字給人一種充滿艱深、繁複計算的感覺,不像我們生活中可以或需要學會的東西。

但其實演算法在生活中無所不在。

廣義的演算法用白話來說,就是完成任務的一套步驟或規則

也就是說它的重點不是問題或答案本身的描述,而是解決問題的方法。從這點來看,一份食譜、修理機器的說明、任何申請流程,也都是演算法,因為它一步一步讓你完成任務。

或者日常生活中可能有類似這樣的情境:我們可能會說,某件事A用了很笨的方法花了一天才完成,B可能換個方式一小時就完成了。雖然很白話,但這種關於做事情方法的描述其實跟演算法的討論很接近。

演算法的確切定義...尚在討論中?!

不過要說演算法聽起來跟數學計算很有關係也沒錯。

很久很久以前,久到西元以前,世界各地都開始出現演算法的紀錄:各種做除法、求出公因數、圓周率等等的規則。後來英文演算法(algorithm)一詞的出現也跟九世紀一位數學家有關。

乃至於現在,如果上維基百科查詢演算法,它的基本定義還是著重在數學或電腦科學上:演算法是一套定義明確、電腦可施行的有限指示。如果再多翻看幾本教科書或科普書籍,會看到演算法的一些特點反覆出現:

輸入(input):可以接收值作為輸入,也就是像完成任務所需要的原料。

輸出(output):可以產出結果,例如一個問題的解法。

精確性:步驟與結果的定義明確,沒有歧義。

有限性:會在一定步驟內結束。

可實現:在生活中具體可行,不是抽象或設想的方法。

有了那麼多定義、正當感覺越來越了解演算法在幹嘛的時候,卻又會看到驚人的事實:維基百科在寫完一堆演算法的歷史、範例、應用之後,最後寫到「目前各方仍在努力把演算法的定義修正得更精確,關於演算法的更多定義請見algorithm characterizations」,而這頁一開頭就說,演算法還沒有一個普遍接受的正式定義,學者們還在努力中...

也就是說,當我們正為演算法的定義頭痛的時候,科學家們也正在煩惱同樣的事。

回到我們眼前的演算法

有人可能會想,姑且不論最最精確的定義是什麼,根據已經講到的這些定義,那我們平常寫的好多程式碼也都是透過一些規則、將輸入轉輸出、一步一步在完成任務,那也可以稱作是演算法嗎?其實是的。

那要研究各種程式碼才能學會演算法嗎?

打開很多書籍或課程,雖然有些陌生的符號和表達,但會發現演算法的研究往往更傾向於想法上的討論而非特定程式語言的執行細節,一方面是不用因瑣碎的細節失焦,另一方面也體現同樣的演算法概念,基本上可以在任何程式語言中實現。

所以作為程式和數學的初級學徒,雖然每天的文章只能思考一兩個問題、離在程式中實踐演算法可能還有一大段距離,但這30天希望能透過不要太深奧的例子,來看看一些因為有效、有趣等等原因,而無所不在的演算法。


下一篇
Day 02:二分搜尋(binary search)
系列文
30天不怕演算法:白話文版30

尚未有邦友留言

立即登入留言