資料結構學習筆記(一)
現實中,我們更多的不是解決數值計算的問題,而是需要一些更科學有效的手段(比如表、樹和圖等資料結構)的幫助,才能更好地處理問題。所以資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們志建關係和操作等相關問題的學科。
程式設計 = 資料結構 + 演算法
1 基本概念與術語
1.1 資料
資料:是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。資料不僅僅包括整型、實型等數值型別,還包括字元、聲音、影象和視訊等非數值型別。
這裡討論的資料,其實就是符號,而且這些符號必須具備兩個基本前提:
- 可以輸入到計算機中
- 能被計算機程式處理
對於整型、實型等數值型別,可以進行數值計算。
對於字元資料型別,就需要進行非數值的處理。而聲音、影象、視訊等其實是可以通過編碼的手段變成字元資料來處理的。
1.2 資料元素
資料元素:是組成資料的、有一定意義的基本單位,在計算機中通常作為整體處理。也被稱為記錄。
例如:牛、馬、羊、豬等是畜類的資料元素;雞、鴨、鵝等是禽類的資料元素。
1.3 資料項
資料項:一個數據元素可以由若干個資料項組成。
資料項是資料不可分割的最小單位。
比如人這樣的資料元素,可以有眼、耳、鼻、嘴、手、腳這些資料項,也可以有姓名、年齡、性別、出生日期、居住地址、聯絡電話等資料項,具體有那些資料項要視實際情況而定。
1.4 資料物件
資料物件:是性質相同的資料元素的集合,是資料的子集。
性質相同,指的是資料元素具有相同數量和型別的資料項,比如上面的例子,人都有姓名、生日、性別等相同的資料項。
1.5 資料結構
資料結構:是相互之間存在一種或多種特定關係的資料元素的集合。
在計算機中,資料元素並不是孤立、雜亂無序的,而是具有內在聯絡的資料集合。資料元素之間存在一種或多種特定關係,也就是資料的組織形式。
1.5.1 邏輯結構與物理結構
根據視點的不同,可將資料結構分為邏輯結構與物理結構。
1.5.1.1 邏輯結構
邏輯結構:指資料物件中資料元素之間的相互關係
邏輯結構分為以下四種:
1. 集合(鬆散)結構
集合結構:集合結構中的資料元素除了同屬於一個集合外,它們之間沒有其他關係。
2. 線性結構
線性結構:線性結構中的資料元素之間一對一的關係。
3. 樹形結構
樹形結構:樹形結構中的資料元素之間存在一種一對多的層次關係。
4. 圖形結構
圖形結構:圖形結構的資料元素是多對多的關係。
四種結構圖示如下:
在用示意圖表示資料的邏輯結構時,需要注意:
- 將每一個數據元素看做一個結點,用圓圈表示。
- 元素之間的邏輯關係用結點之間的連線表示,如果這個關係是有方向的,則用帶箭頭的連線表示。
1.5.1.2 儲存結構(物理結構)
儲存結構:指資料的邏輯結構在計算機中的儲存形式。
儲存結構分為四類:順序儲存結構、鏈式(連結)儲存結構、索引儲存結構和雜湊儲存結構。
其中,順序結構和鏈式結構適用於記憶體結構,而索引結構和雜湊結構則適用於外存與記憶體互動結構。
1. 順序儲存結構
順序儲存結構:在計算機中用一組地址連續的儲存單元依次儲存線性表的資料元素,其資料間的邏輯關係與物理關係是一致的。
特點:
- 儲存密度大,空間利用率高,相比鏈式儲存節約空間。
- 儲存操作方便,支援隨機存取,查詢容易。
- 插入或刪除元素時不方便(需要移動其它元素),花費時間更多。
2. 鏈式儲存結構
鏈式(連結)儲存結構:在計算機中用一組任意的儲存單元儲存線性表的資料元素(這組儲存單元可以是連續的,也可以是不連續的)。它不要求邏輯上相鄰的元素在物理位置上也相鄰.因此它沒有順序儲存結構所具有的弱點,但也同時失去了順序表可隨機存取的優點。
特點:
- 比順序儲存結構的儲存密度小,空間利用率低(每個節點都由資料域和指標域組成,所以相同空間內假設全存滿的話順序比鏈式儲存更多)。
- 邏輯上相鄰的結點物理上不必相鄰。
- 插入與刪除靈活 (不必移動節點,只需要改變結點中的指標)。
- 查詢結點時鏈式儲存要比順序儲存慢。
3. 索引儲存結構
索引儲存結構:除建立儲存結點資訊外,還建立附加的索引表來標識結點的地址(索引表由若干索引項組成)。
特點:
- 用結點的索引號來確定結點儲存地址,是對順序結構的一種改進,其優點是檢索速度快。
- 缺點是增加了附加的索引表,會佔用較多的儲存空間。
4. 雜湊儲存結構
雜湊儲存結構:雜湊儲存,又稱Hash儲存,是一種力圖將資料元素的儲存位置與關鍵碼之間建立確定關係的查詢技術。其基本是想是:由結點的關鍵碼值決定結點的儲存地址。
特點:
- 查詢操作基於資料本身進行,所以查詢與存取的效率高。
- 存取隨機,不便於順序查詢。
1.5.2 抽象資料型別
1.5.2.1 資料型別
資料型別:是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。
C語言中,按照取值的不同,資料型別可以分為兩類:
- 原子型別:是不可以再分解的基本型別,包括整型、實型、字元型等。
- 結構型別:由若干個型別組合而成,是可以再分解的。例如,整型陣列是由若干整型資料組成的。
1.5.2.2 抽象資料型別
抽象資料型別(Abstract Data Type,ADT):是指一個數學模型及定義在該模型上的一組操作。抽象資料型別的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關。