1. 程式人生 > >資料結構和演算法的關係和區別

資料結構和演算法的關係和區別

由於大量資料結構教程中都將資料結構的知識和演算法摻雜起來講,使很多初學者認為資料結構就是在講演算法,這樣理解是不準確的。

資料結構和演算法之間完全是兩個相互獨立的學科,如果非說它們有關係,那也只是互利共贏、“1+1>2”的關係。

最明顯的例子,如果你認為資料結構是在講演算法,那麼大學我們還學《演算法導論》,後者幾乎囊括了前者使用的全部演算法,有什麼必要同時開設這兩門課程呢?

我們還可以從分析問題的角度去理清資料結構和演算法之間的關係。通常,每個問題的解決都經過以下兩個步驟:
  1. 分析問題,從問題中提取出有價值的資料,將其儲存;
  2. 對儲存的資料進行處理,最終得出問題的答案;

資料結構負責解決第一個問題,即資料的儲存問題。通過前面的學習我們知道,針對資料不同的邏輯結構和物理結構,可以選出最優的資料儲存結構來儲存資料。

而剩下的第二個問題,屬於演算法的職責範圍。演算法,從表面意思來理解,即解決問題的方法。我們知道,評價一個演算法的好壞,取決於在解決相同問題的前提下,哪種演算法的效率最高,而這裡的效率指的就是處理資料、分析資料的能力。

因此我們得出這樣的結論,資料結構用於解決資料儲存問題,而演算法用於處理和分析資料,它們是完全不同的兩類學科。


也正因為如此,你可以認為資料結構和演算法存在“互利共贏、1+1>2”的關係。在解決問題的過程中,資料結構要配合演算法選擇最優的儲存結構來儲存資料,而演算法也要結合資料儲存的特點,用最優的策略來分析並處理資料,由此可以最高效地解決問題。
順序表儲存資料示意圖
圖 1 順序表儲存資料示意圖
例如,有這樣一個問題,計算“1+2+3+4+5”的值。這個問題我們可以這樣來分析:
  • 計算 1、2、3、4 和 5 的和,首先要選擇一種資料儲存方式將它們儲存起來,通過前面的學習我們知道,資料之間具有“一對一”的邏輯關係,最適合用線性表來儲存。結合演算法的實現,我們選擇順序表來儲存資料(而不是連結串列),如圖 1 所示;
  • 接下來,我們選擇演算法。由於資料集中存放,因此我們可以設計這樣一個演算法,使用一個初始值為 0 的變數 num 依次同儲存的資料做“加”運算,最後得到的新 num 值就是最終結果。

選擇順序表而不是連結串列的原因,是順序表遍歷資料比連結串列更高效。後續講順序表時會做詳細介紹。