資料結構與演算法感想

Posted by     Yuchi on Sunday, March 23, 2025

本篇文章是個人對資料結構與演算法之間關係的一些心得,目的是釐清為什麼在電腦科學領域,我們需要學習這兩個科目,這兩個科目對於電腦有什麼樣的關係。

簡介

演算法是為了解決問題服務

資料結構是為了演算法服務

電腦的功用

簡單來說電腦是為了幫助人類處理繁瑣的計算步驟,把人類從大量且重複的解決問題步驟中解放出來,最早是為了解碼公式的計算,需要大量的人力幫忙做計算,這時候的電腦就派上用場了,我們可以輸入寫好的程式,這個程式就可以理解為一連串的解題步驟,回想數學的解題步驟,無非就是一連串的加減乘除,只是要按照一定的順序才能解出正確答案,並且這個步驟跟輸入資料是什麼值無關,輸入的值不會影響到步驟只會影響到輸出的值,所以我們這個程式可以重複的使用,而且可以輸入不同的值,得到我們想要算出的答案。

舉例來說:

我們現在有砲彈發射所在的位置,以及發射時的火藥量、方位和仰角,這就是我們的輸入資料,我們想要預估這顆炮彈最後的落點會在哪裡,這就是我們想要的輸出的值,就跟高中物理教的一樣,這可以透過一連串的物理公式計算出來,所以這個一連串的物理公式,就可以被我們寫成一個程式,因為本質上一個公式就是一個或多個計算步驟,就看公式有多複雜,但不論多複雜都是加減乘除的組合,電腦就是幫助我們做加減乘除的機器,我們讓電腦依據程式按照順序執行我們要求的加減乘除計算,來得到最後的結果。

到這裡我們可以理解為我們希望達成的目標是給定一組輸入數據,依據一定的計算步驟,得到我們要的結果,至於這個計算過程是由人類計算或是電腦計算並不是那麼重要,只要確保結果是我們要的就可以了。

電腦與演算法

說到這裡電腦跟資料結構跟演算法又是什麼關係呢?

前面說到的一連串的計算步驟就是我們的演算法,這裡我們可以簡單說一下演算法的定義就是有限且明確可行的步驟,並且有明確的輸入與輸出的定義,而且給定一樣的輸入就會得到一樣的輸出,上面還沒有提到明確的輸入輸出是什麼意思,簡單來說呢,就是要把像是方位定義成經度與緯度,實際的數值是-180~180和0-90,這麼精準,這樣我們演算法代表的含義就大功告成,現在我們可以簡單地說演算法就是幫助我們根據輸入資料解決問題得到答案的步驟。

資料結構與演算法

那麼資料結構到現在還沒出現,它到底是什麼呢?資料結構跟我們的輸入資料直接相關,它就是指我們輸入資料的組織方式,因為電腦硬體設備的關係,我們輸入資料時一定是一筆接著一筆輸入的,沒辦法同時多筆一次輸入進電腦,所以輸入資料最基礎的組織方式就是線性的,也就是想像一條直線從左到右依序是我們輸入的第一筆資料、第二筆資料、第三筆資料等等,這就是它們的組織關係,這也是一種間單的資料結構,接著電腦科學家發現如果我們不直接用第一種原始儲存資料的方式,而是在這個基礎上再往上一層,把這個原始資料結構包裝成另一個進階的資料結構,並且告訴使用者現在這個輸入資料的儲存特性,還有操作方式,之所以要這樣是因為這種方式可以提升我們後續演算法的效率。

舉例來說

現在我是圖書館管理員

我的資料就是書本

我的儲存空間就是書櫃

那麼我有什麼什麼擺放新書的方式呢?

第一我可以拿到一本新書就直接往有空位的書櫃塞

第二我可以依據書名的標題字母大小進行排序以後找到對應的位置再塞進去

那哪種比較好呢?

這就要看最後的使用情境了!

假設以後我還要很常去找尋某本書

找書就是我要解決的問題

那我要如何找書

我所使用的方法就可以稱為演算法

現在我找書的方法為從第一個書櫃的第一本的標題開始

從第一本看到最後一本

直到找到我要的那本書

這種演算法就叫做線性搜尋

因為假設我現在實際有10本書,我就要找過10本

假設我書本數量現在有20本了,那我就要找過20本

我找的數量和書本數量是呈現線性成長的

這個演算法可以套用在第一種也可以套用在第二種擺書方式

那現在對於第二種擺書方式

我又有一個新的演算法來找書

因為書彼此之間是有一個順序關係的

也就是說我們應該可以利用這個順序關係來幫助我們找書

利用的方式如下

假設我們現在要找的書名是P開頭

那我們就不要從書櫃的第一本開始找

我們直接從一半開始找

在書櫃中間的那一本書我們發現它的書名是G開頭

這樣我們就知道

喔! 那我們要找的書一定是在這本之後

瞬間,前半書櫃的書我們就知道不會有我們要找的書了

可以想像這個找法是十分的快

想像一下現在有一個人同時和你一起找書

但他是在第一種書櫃找

當他在看第一本的時候

他只能知道

喔這一本不是

但你看完第一本後

你知道

喔這一本之前都不是

這就是資料結構與演算法配合的威力

那這裡的資料結構在哪裡呢?

就是在於我們如何去擺放我們的書

書就是資料

所有書的組織方式就是它的結構

第一種擺法的結構是雜亂無章的

第二種擺法的結構是有順序的

至於誰好誰壞

就要看最後的需求

如果我們只是想擺書

不會有查詢需求

那麼第一種擺書方式比較好

因為只要往空位一直放進去就好了

那如果有查詢的需求

就像上述的那樣

就會是第二種比較好

但這種擺法在放書進去的時候就會比第一種慢

因為你要先找到正確的位置

再來正確的位置中間可能沒有空位

你還要喬一下正確位置後面的書移出一個空間

再把書放進去

所以資料結構也是會需要看之後的使用情境來決定的

假設現在的使用情境都不會查詢

我還是使用第二種擺法

我肯定會被罵到臭頭

怎麼擺書的效率這麼差

以上就是資料結構與演算法的關係

有些演算法是依賴於特定資料結構的

像是特別使用在第二種擺法上的搜尋方法

也有演算法是不依賴於資料結構的

像是線性搜尋法,怎麼擺我都可以找

但通常依賴特定資料結構的特定演算法

在解決某種特定問題的效率上都會比較好

至於這些資料結構與演算法的種種研究

就是前人的智慧結晶。

小結

最後的小結,電腦就是幫我們解決問題的工具,演算法就是解決問題的流程,資料結構就是幫助演算法更有效率的資料組織方式。