誤區
中國式教育總是告訴學生什么是什么,以至于我總是習慣于去記憶一些名詞的概念,只知道死記硬背,因此我學到的只是一些名詞解釋,而不是方法論。很難發現事物的規律和本質。上學的時候,有一門課程叫《數據結構》,里面講授的是數組、棧、隊列、樹、圖等概念和算法實現,于是我就把數據結構和這些概念和算法在腦海中對應起來,一提到數據結構,我認為就是棧、是隊列等等的算法。實則不然,數據結構是一門科學,是一種思維方式,而不是一些死記硬背的算法。
定義
1.什么是結構
結構實際上就是一種關系,談結構必須要結合某種具體的對象談。談某對象的結構,實際上是在談組成該對象的各個要素是以什么方式構建或組織起來的,也就是研究各個要素之間的關系。
例如,有人問你家的房子的建筑結構是怎樣的?你可能會回答鋼筋混凝土結構。這就有兩層含義,一是組成房子的要素是鋼筋和混凝土,而是鋼筋混凝土通過一定的組合關系搭建而成的。
2.什么是數據結構
數據結構是針對計算機領域而言的專有名詞。因為計算機程序關注的核心概念是數據,因此如何組織這些數據,就叫數據結構。
對計算機底層而言,數據就是二進制位數。結構也就是數據之間的關系,無非是兩種基本關系,順序存放的關系和隨機存放的關系。從字面意思上理解數據結構,就是如此。根據我們大學學的數據結構課程可知,我們學的東西遠不止此這么簡單。那么我們學習的數據結構究竟是個什么鬼呢? 不是棧、隊列、樹又是什么呢?
實際上棧、隊列、樹等等只是一種抽象數據類型,我們的課程學習的是這些抽象數據類型,是如何在計算機中實現的。單獨講數據結構并無太大意義,怎么在程序設計過程中,抽象出抽象數據類型,又怎么通過基本數據結構和算法實現這些抽象數據類型,才是學習數據結構這么課程的意義。
用最精簡的一句話說就是Cliffor A.Shaffer在《數據結構與算法分析》一書中的定義:“數據結構就是抽象數據類型的物理實現”。
Robert L.Kruse在《數據結構與程序設計》書中, 將數據結構的設計過程分為抽象層,數據結構層和實現層。抽象層就是抽象數據類型層,它討論數據的邏輯結構及其運算,數據結構層和實現層討論一個數據結構的表示和在計算機內的存儲細節以及運算的實現。
具體來說就是指同一類型數據元素中,各元素之間的相互關系,涉及三個部分,數據的邏輯結構、數據的物理結構以及數據的操作。
研究對象
1.數據的邏輯結構
數據元素之間的邏輯關系,無外乎就是以下四種。
- 互相之間沒有關系(集合結構)
- 一對一關系(線性結構)
- 一對多關系(樹形結構)
- 多對多關系(圖形結構)
2.數據的物理結構
數據的物理結構是數據結構在計算機內的表示,包括數據元素的機內表示和關系的機內表示
數據元素的機內表示:二進制位的位串,通常稱為節點
關系的機內表示:
順序存儲:通過相對位置表示邏輯關系,借助程序設計語言的數組來實現。
非順序存儲:
鏈接存儲,通過指針來表示元素間的邏輯關系,借助程序設計語言的指針來實現。
索引存儲,除了建立存儲節點信息外,還建立附加的索引表來表示節點的地址。
散列存儲,通過節點的關鍵字直接計算出節點的存儲地址。
3.數據的操作
由于計算機內存儲方式的不同,可知同一個邏輯結構可以有多種存儲結構,不同存儲結構影響的是數據處理的效率。因此討論數據結構也要同時討論在該類數據上執行的運算,針對不同的運算要選擇適合的存儲結構。
研究意義
計算機程序設計中,構造系統的關鍵因素在于數據結構而非算法,許多大型系統的構造經驗表明,系統實現的困難程度和質量都嚴重依賴于是否選擇了最優的數據結構。很多時候,確定了數據結構,算法也就容易獲得。有時候,有了特定的算法也要選擇與之適應的數據結構。
研究內容
在計算機科學中,數據結構是一門研究非數值計算的程序設計問題中計算機的操作對象(數據元素)以及它們之間的關系和運算的學科,而且確保經過這些運算后所得到的新結構仍然是原來的結構類型。
數據結構在計算機科學中是一門綜合性的專業基礎課,是介于數學、計算機硬件和計算機軟件三者之間的一門核心課程。
計算機科學是一門研究運用計算機進行信息表示和處理的科學。計算機解決一個具體問題時,大致需要經過下列幾個步驟:首先要從具體問題中抽象出一個適當的數學模型,然后設計一個解此數學模型的算法(Algorithm),最后編出程序、進行測試、調整直至得到最終解答。
尋求數學模型的實質是分析問題,從中提取操作的對象,并找出這些操作對象之間含有的關系,然后用數學的語言加以描述。當人們用計算機處理數值計算問題是,所用的數學模型是用數學方程描述。所涉及的運算對象一般是簡單的整形、實型和邏輯型數據,因此程序設計者的主要精力集中于程序設計技巧上,而不是數據的存儲和組織上。然而,計算機應用的更多領域是“非數值型計算問題”,它們的數學模型無法用數學方程描述,而是用數據結構描述,解決此類問題的關鍵是設計出合適的數據結構,描述非數值型問題的數學模型是用線性表、樹、圖等結構來描述的。
計算機算法與數據的結構密切相關,算法無不依附于具體的數據結構,數據結構直接關系到算法的選擇和效率。運算是由計算機來完成,這就要設計相應的插入、刪除和修改的算法 。也就是說,數據結構還需要給出每種結構類型所定義的各種運算的算法。
計算機算法與數據的結構密切相關,算法無不依附于具體的數據結構,數據結構直接關系到算法的選擇和效率。運算是由計算機來完成,這就要設計相應的插入、刪除和修改的算法 。也就是說,數據結構還需要給出每種結構類型所定義的各種運算的算法。
結構算法
不同的數據結構其操作集不同,但下列操作必不可缺:
- 生成
- 銷毀
- 檢索
- 插入
- 刪除
- 遍歷
抽象數據類型:一個數學模型以及定義在該模型上的一組操作。抽象數據類型實際上就是對該數據結構的定義。因為它定義了一個數據的邏輯結構以及在此結構上的一組算法。抽象數據類型可用以下三元組表示:(D,S,P)。D是數據對象,S是D上的關系集,P是對D的基本操作集。
ADT的定義為:ADT 抽象數據類型名:{數據對象:(數據元素集合),數據關系:(數據關系二元組結合),基本操作:(操作函數的羅列)}
抽象數據類型有兩個重要特性:
數據抽象,用ADT描述程序處理的實體時,強調的是其本質特征、所能完成的功能以及它和外部用戶的接口。
數據封裝,將實體的外部特性和內部實現細節分離,對外部用戶隱藏內部實現細節。
研究成果
常用結構:
數組
棧
隊列
鏈表
樹
圖
堆
散列表
(待續)
參考文獻:百度百科