資料結構基本概念和術語

kio鱼發表於2024-08-15

概論

1.1 基本概念和術語

1.1.1 基本概念

計算機處理的的是數值性資料,當計算機處理使用者資訊表中的資料的時候,需要弄清3個問題

1.資料的邏輯結構

資料之間存在怎樣的內在聯絡,資料中,有且只有一個是首節點/尾結點,其他節點有且只有一個相鄰的位於它之前和之後的結點

2.資料的儲存結構

資料在計算機的儲存方式稱為儲存結構。在C語言中,最常見的是用結構陣列來儲存整個使用者的資訊表,每一個結構陣列元素也是一個結構,用於表示資訊使用者的一個結點。使用者資訊表中相鄰的結點,對應結構陣列中的元素也是連續的,在這種儲存方式下,邏輯相鄰的結點就必須是物理相鄰,被稱為順序儲存,還有其他儲存方式。

3.資料的運算合集

對資料的儲存一定會涉及到相關的運算。在使用者的資訊表中,可以進行刪除一個使用者、增加有一個使用者、查詢某個使用者。應該明確指出這些操作的含義。為一批資料定義的所有運算(或稱操作)構成一個運算(操作)集合。

資料結構就是按照一定的邏輯結構組成的一批資料,使用某種儲存方式將資料儲存在計算機中,並在這些資料上定義了一個運算集合

1.1.2資料的邏輯結構(資料結構)

資料的邏輯結構是資料與資料之間存在的邏輯關係,用一個二元組來表示
$$
B=(K,R)\K代表資料(結點的有限集合),R是集合K上關係的有限集合
$$
例如:5個人,a,b,c,d,e,a是b的父親,b是c的父親,c是d的父親,d是e的父親,討論它們之間的父子關係,可以表達為B=(K,R),其中K={a,b,c,d,e},R={r},r={<a,b>,<b,c>,<c,d>,<d,e>}.

也可以用圖形表示

ki∈K,Kj∈K,<ki,kj>∈r,ki是kj的前驅,kj是ki的後繼。

若某個結點沒有前驅,就是開始結點;沒有後繼結點,就是終端結點;既不是開始也不是終端的為內部結點。

線性結構:一個前驅,一個後繼

樹型結構:一個前驅,多個後繼

圖型結構:多個前驅,多個後繼

1.1.3資料的儲存結構

資料的邏輯結構是獨立於計算機的,與在計算機中的儲存是無關的,要對資料進行處理,就必須對資料進行儲存,資料的儲存結構主要有4種儲存方式

(1)順序儲存

通常儲存線性結構的資料,使邏輯相鄰的結點一定是物理位置相鄰

(2)鏈式儲存

給每一個結點附加一個指標段,指的是該結點的後繼儲存地址,一個結點可以有一個後繼,也可以有多個後繼,所以可以有一個指標域,也可以有多個指標,邏輯相鄰的結點在儲存區域中可以不是物理相鄰。

(3)索引儲存

線性結構中,以開始結點為索引號1,其他結點的索引號依次加1,每個結點都有唯一的索引號,根據索引號確定儲存地址。

(4)雜湊儲存

構造一個從集合K到儲存區域M的函式h,定義域為K,值域為M,儲存地址由h(Ki)決定

一個資料結構儲存在計算機中,整個資料所佔的儲存空間不一定小於資料本身所佔的儲存空間,通常把資料本身所佔的儲存空間和整個資料結構所佔的儲存空間的大小的比值叫做儲存密度,顯然,資料結構的儲存密度不大於1,線性結構儲存密度為1,鏈式結構小於1。

1.2 資料型別和抽象資料型別

1.2.1資料型別

資料型別(簡稱型別)反映了資料的取值範圍以及這類資料可以施加的運算。一個資料型別就是同一類資料的全體,是資料的一種屬性,規定了資料的可變化範圍,

1.2.2抽象資料型別

這是一種和表示無關的資料型別,是一個資料模型及定義在該模型的一組運算,定義一個抽象資料型別時,必須給出它的名字及運算子名,及函式名,並規定引數性質。(c++中的類支援抽象資料型別)

簡言說明,就是自定義型別。

1.3演算法和演算法分析

解決某個問題的方法和步驟就叫做演算法

特徵

(1)有窮性:演算法執行要在有限步內進行

(2)確定性:每個步驟是確定的,無二義性

(3)輸入:可以有0個或多個輸入

(4)輸出:一定有輸出結果

(5)可行性:每一個步驟都是可行的

1.3.1時間複雜度和空間複雜度

一個演算法和優劣是從演算法的執行時間和所用的儲存空間兩個方面衡量的。

(1)時間複雜度

由於演算法在不同機器上執行時間不同,資源佔用情況也不一樣。所以時間複雜度使用演算法執行過程中的基本操作次數來衡量的,使用大O漸進表示(O()),在評價演算法的時間複雜度時,只關係演算法的本質區別,不考慮細小區別。

常數階 31 O(1)

線性階 2*n+17 O(n)

平方階 n^2+10 O(n^2)

立方階 2*n^3 O(n^3)

常見的演算法時間複雜度

O(1)<O(log n)<O(n)<O(n*log n)<O(n2)<O(n3)<……<O(2^n)

(2)空間複雜度

除了資料以外附加的儲存空間,度量方法與時間複雜度類似

相關文章