《演算法圖鑑》

Jason Z
jason-read
Published in
Mar 28, 2021

演算法乍聽之下,就是電腦科學的東西,似乎非常難,離一般市井小民的生活非常遠。但是實際上,演算法就和麥香一樣:原來我們這麼近。

演算法最初為的就是解決我們生活上周遭遇到的問題。演算法最基本的概念就是你必須輸入某樣東西,然後經過演算法的中間過程後,得到你想要的東西。

例如怎麼樣把橘子變成橘子汁,有很多種辦法,像是把橘子放入榨汁機,榨出橘子汁;也可以用湯匙重重壓著橘子的果肉,一點一滴榨出汁。能將橘子變成橘子汁的方法,就稱為演算法。

舉例來說,從小我們就學過各種演算法了,例如給你長和寬,請你求出長方形面積的方法;或是給你底和高,請你給出三角形面積的方法。只不過這些都有固定的公式了,可能沒有別的更好的方法。

但是還有一個更生活化的例子,像是給你一組數字,如何從小排到大。這個做法就有很多種了

6 3 8 5 2 7 4 1

第一種:由左邊開始,和下一個數字比大小,如果比較大的話,則兩者交換,如此一直重複下去,直到由小排到大為止。

第二種:將數字切為兩組,裡面各自排去完,再合併一起排序。

以上是舉例其中兩種排序的方法,實際上排序的方法有無數種。而要如何評量一個演算法的好壞,就有兩個參考的指標:

時間複雜度

同樣是將橘子打成橘子汁,當然是越快的方法越好,所以演算法評量好壞的一個標準,就是在同樣的條件下,誰能最快達成目的

空間複雜度

空間複雜度指的是,如何用最少的資源達到目的,像是如果人工榨汁需要一個人,機器榨汁不需要人。那麼機器榨汁不需要人就勝過需要一個人榨果汁了。

而在評量演算法的空間法雜度的標準是,如何用最少的資源,達到一樣的目的

生活中遇到的演算法

生活中遇到最經典的演算法莫過於在圖書館找書了。圖書館有成千上萬的書籍,我們要如何找到想要的一本書呢?首先圖書館會將書本分類,例如,文史哲類、經濟類、外文類等等,所以我們會先去找我們的書本的分類,可以大大縮小目標範圍。

假設找「荀子」這本書,我們就會先到文史哲類的地方,再找到中國哲學史累,再找到先秦哲學,這樣不斷有技巧地縮小搜尋範圍的過程,也就是一種演算法。

資料結構

但是我們要這樣分門別類地找到我們要的書籍之前,首先圖書館也要先很有技巧的分類書籍。這樣有技巧分類書籍的方法,我們稱為資料結構。如果以最有效率的方法,儲存資料

在這裡介紹日常生活中,常常遇到的兩種資料結構

佇列(queue)

First In, First Out(FIFO)先進先出

佇列就像排隊在買東西一樣,先排的會先買到,後排的會後來才買到

優先級佇列 Priority Queue

就像登機時商務艙的旅客一樣,就算比經濟艙的旅客還要晚到,仍然有比經濟艙旅客優先登機的

問題

有想到生活中有什麼主列的例子嗎?

例如:買飲料

堆疊(stack)

Last In, First Out(LIFO)後進先出

堆疊就像是由下往上疊的迴轉壽司的盤子,只能從最後吃完的盤子開始拿。如果有吃完最新的盤子,也只能放在最上面

拿盤子(pop)

放盤子(push)

可口圖片來源

以上這些可口的圖片來源取自Hannah Lin的鐵人賽文章前端工程師用 javaScript 學演算法

有興趣可以點進去看看最專業的演算法介紹與使用

演算法與網路安全

現在是網路的時代,日常生活中大至商業訂單的確認、小至你我之間日常的喇賽聊天,都是透過網際網路傳輸。因此網際網路的傳輸雃權,是我們這個時代不可以忽視的重要議題。

當我們使用電腦透過網際網路傳送訊息給另外一個人的時候,就想像是我們把訊息寫在紙上,寫上地址,請郵差幫我們送給我們要傳達的對象。

可以想像在現實生活中,會遇到什麼困難,在網際網路的世界同樣也會遇到一樣的困難。

竊聽

如果將訊息直接寫在紙條上,郵差可以直接看到你要給對方的訊息是什麼。同理,如果直接將訊息發送給別人,中間經手的每一個節點都可以看到你傳輸的訊息

最有名的實例莫過於電影海角七號裡面的主角,郵差阿嘉,他私自拆開了信件,閱讀裡面的內容。幸好他不是拿來做壞事,最後還是送到阿嬤的手中,但是如果那裡面是國家機密或合約,後果可不堪設想。

解決辦法

如果不想要信件被人偷看最好的辦法就是將信件放到信封中,並且將信封黏緊緊,避免被人偷看。同樣的道理,避免被別人偷看訊息最好的辦法就是加密,將你的訊息使用演算法加密。等送到別人手中的時候再解密。讓別人即使攔截到你的訊息時,也只是看到一堆沒有意義的密文。

竄改

如果原本紙條上面寫的是:嗨!你好啊,有可能會被篡改成:嗨!你去死,雖然正確傳到收件者的手中,可是會引起糾紛的。

解決辦法

重要的公文都會彌封或蓋騎縫章,如果遭到破壞就會有明顯的痕跡,就可以知道裡面的內容可能遭到竄改。而網路世界會在訊息裡面加入一個訊息識別碼。然後告訴收件人,我傳送的訊息識別碼是這個,如果不是這個是別法代表這不是我傳的訊息喔

抵賴

訊息的內容正確經由郵差的手中送達收件人的手中,但是收件人卻抵賴說並沒有收到訊息。或是說購買網拍的時候,明明貨物已經寄到收件人手中,但是收件人主張沒有收到貨,要求賣家再寄一次,這樣損失就慘重了。

解決辦法

如果重要的商品寄到的時候,郵差都會請收件者簽收,證明郵差確實有送達而收件者也確實有收到。而在網路世界的解決辦法是發行一個數位簽章的收件人。只會把訊息傳送給發行者認可的數位簽章的人,而且同時,只有擁有那個數位簽章的人,才能解開訊息的內容。

欺騙

假設我今天要將訊息傳給住在台北的金庸先生,卻有一個「全庸」先生騙郵差說:對!沒錯,我就是收件人,訊息就被不明的人士收走了,而真正該收到訊息的人反而沒有收到訊息

解決辦法

數位簽章同樣能解決遭到欺騙的問題,就算訊息被人冒名簽收了,他沒有數位簽章,解不開加密的訊息,就算收到了也沒有用

--

--

Jason Z
jason-read

哲學系畢業的前端工程師,大部分時間都在搞鐵路系統,喜歡寫程式外,更喜歡鐵道,欣賞路上每個平凡的風景