相信很多人都應該上個《資料結構與演算法》這門課吧,而這兩個概念也如孿生兄弟一樣經常被拿出來一起討論。那它們究竟是一個什麼樣子的關係呢?
聽到資料結構與演算法我第一反應是想到了Pascal 語言之父尼古拉斯·沃斯在他的《Algorithms + Data Structures = Programs》著作中提出了電腦科學中著名的觀點[程式 = 演算法 + 資料結構]。
從這一點來看,資料結構和演算法應該是兩門完全獨立的學科,但是我們平時接觸的大多是兩者同時說起,感覺兩者就是一體的,要想搞清楚兩者之間具體是什麼關係,我們要先搞明白它們各自是什麼。
下面是我摘取的某科上關於兩者的定義:
資料結構是一種資料組織、管理和儲存的格式。資料結構研究的物件是資料的邏輯結構、物理結構以及兩者之間的關係。
演算法是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。
單從定義可能很難直接看出兩者關係,我們把兩者一起說起一個重要的依據也恰恰來源於著名的觀點[程式 = 演算法 + 資料結構],因為我們平時更多關注的是程式,是解決實際問題。此時也就必須要演算法與資料結構相輔相成共同來解決問題。
演算法是解決問題的方法,是一系列指令,那麼就意味著其必須要有輸入,只有有了輸入才能知道要解決的問題,才能去操作指令,輸入是什麼?就是資料。
資料結構是管理資料的組織與儲存的,是研究資料的。
因此我們要把資料結構與演算法聯絡起來,就必須要建立一個橋樑,而這個資料就是最佳的選擇,或者稱作:資料型別。
而資料型別於演算法而言就是基石,是為演算法服務的,演算法就是建立在特定的資料型別之上的。
而資料型別於資料結構而言就是靈魂,資料的定義、組織、儲存最後就是為了應用,資料型別就是最後一步的昇華,使得這靜態的資料有了意義。
其次資料結構關注三個要素:邏輯結構、物理結構、資料運算。邏輯結構是指資料之間的邏輯關係和資料最終儲存在計算機中的實際位置沒有關係,而物理結構就是指資料最終存在計算機上的位置,最後資料運算是針對邏輯結構進行的運算。
而上面的說的資料型別就相當於資料結構中邏輯結構+資料運算,大多數高階語言程式設計師是不太關注資料最終的儲存位置的,因為高階語言已經幫我們做完了,這也導致我們很多時候預設資料結構就是資料型別,提到資料結構就是這個類怎麼定義,提到這個問題解決方案就是需要什麼演算法,演算法需要什麼資料型別支撐,時間久了,大家也就習慣把資料型別當作資料結構了,也就習慣把資料結構與演算法繫結在一起了。
資料結構與演算法既是緊密相連互相成就又是各有關注,因此我們還是要搞清楚它們之間的關係。也為我們後面深入學習資料結構與演算法提供一個直觀感受。
注:測試方法程式碼以及示例原始碼都已經上傳至程式碼庫,有興趣的可以看看。https://gitee.com/hugogoos/Planner