資料結構淺析(一):資料結構基本概念
轉載自https://m.meiwen.com.cn/subject/kzgvhttx.html
首先會有個疑問,什麼是資料結構呢?
資料結構(data structure),可以概括為是互相之間存在一種或多種特定關係的資料元素的集合。
開篇配圖來自網路... 那開始吧 :)
一、資料結構起源
1968年,美國 Donald E. Knuth 教授在《計算機程式設計藝術》第一卷《基本演算法》中系統闡述了資料的邏輯結構和儲存結構及其操作,開創了資料結構課程體系。
70年代初,大型程式相繼出現,軟體也開始相對獨立,結構程式設計成為程式設計方法學主要內容,人們開始認為程式設計的實質是對確定的問題選擇一種好的結構,加上設計一種好的演算法。也就是 程式設計 = 資料結構 + 演算法
現實生活中,更多的不是解決一些數值計算問題,我們需要通過表、樹、圖等資料結構的幫助來更好地處理問題。
所以資料結構也是一門研究非數字計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。(引用自《大話資料結構》)
二、基本概念和術語
1、資料
- 資料指的是能輸入到計算機中,並能被計算機程式處理的物件。
- 對於數值型別(整型、實型等),可以進行數值計算;
對於字元資料型別(聲音、影象、視訊等可通過編碼轉化為字元資料),可以進行非數值處理。
2、資料元素
- 資料元素指組成資料的、有意義的基本單位,也被稱為記錄。
- 如:一部電影裡面的女主就是資料元素
3、資料項
- 資料項是資料不可分割的最小單位,一個數據元素可以由若干資料項組成。
- 如:一部電影裡面女主的姓名、性別等都是資料項,恩,女主性別一般是女...
4、資料物件
- 資料物件指性質相同的資料元素的集合,是資料的子集;
- 資料物件簡稱資料
什麼是性質相同呢?
性質相同指資料元素具有相同數量和型別的資料項;
如一部電影中每個角色(資料元素)都有姓名、性別(資料項),這些角色(資料元素)構成了一部電影,那麼這部電影所有人物的集合我們可以想象成是一個數據物件。
5、資料結構
- 資料結構指互相之間存在一種或多種特定關係的資料元素的集合;
- 資料結構 = 資料元素 + 關係;
還得用上面的例子,一部電影可以想象成是一個數據結構,是由一個個人物(資料元素)和一個個串聯的人物情節(關係)構成,例子有點勉強,大概意思都應該理解的...
三、邏輯結構和物理結構
1、邏輯結構
- 邏輯結構指資料物件中資料元素之間的相互關係;
-
邏輯結構分為 集合結構、線性結構、樹形結構 和 圖形結構;
1).集合結構:其中的資料元素除同屬於一個集合外,之間沒有其他關係;
集合結構2).線性結構:其中的資料元素之間是一對一的關係;
線性結構
3).樹形結構:其中的資料元素之間存在一對多的層次關係;
樹形結構
4).圖形結構:其中的資料元素之間存在多對多的關係。
圖形結構
2、物理結構
-
物理結構指資料的邏輯結構在計算機中的儲存形式;
-
實際就是如何將資料元素儲存到計算機儲存器中。這裡的儲存器主要針對記憶體而言,像硬碟等外部儲存器的資料組織通常使用檔案結構來描述;
-
資料元素的儲存結構形式有 順序儲存 和 鏈式儲存 兩種;
1).順序儲存結構
順序儲存結構:把資料元素存放在地址連續的的儲存單元裡,其資料間的邏輯關係和物理關係一致;
順序儲存結構2).鏈式儲存結構
鏈式儲存結構:把資料元素存放在任意的儲存單元裡,這組儲存單元可以是連續的也可以是不連續的。資料元素的儲存關係不反映其邏輯關係,用指標存放資料元素的地址,我們通過地址可以找到相關聯資料元素的位置。
鏈式儲存結構 -
兩種物理結構對比來看,鏈式儲存更為靈活
邏輯結構面向問題,物理結構面向計算機,其基本目標是將資料及其邏輯關係儲存到計算機的記憶體中。
四、抽象資料型別
1、資料型別是什麼?
資料型別指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。
看起來有點模糊,接著往下看。
資料型別按照值的不同進行劃分。在高階語言中,每個變數、常量、表示式都有各自取值範圍。型別就用來說明變數或表示式的取值範圍和所進行的操作。
計算機的記憶體是有限的,如果只是單純計算 1+1 =2這樣的整型數字運算,我們不需要開闢很大的記憶體空間,只要滿足相應需求的記憶體空間就可以了。於是計算機領域的前輩們對資料進行分類,不同的資料型別擁有各自的取值範圍。這樣就可以更好利用有限的記憶體空間。
例如 C 語言中,資料型別可以分兩類:
- 原子型別:不可再分割的基本型別。如整型、實型、字元型等基本資料型別;
- 結構型別:由若干型別組成,可再分解。如整型陣列就是由若干整型資料組成的。
2、抽象資料型別
1). 上面解釋了什麼是資料型別,那麼為什麼要把資料型別抽象出來呢?
不同的計算機有不同的硬體系統,所以需要程式語言最終通過編譯器或直譯器轉化成計算機能夠識別的底層語言。然而在我們使用高階語言開發時,如計算 1+1 ,不管最終程式執行在什麼計算機上,我們的目的只是為了實現 2 個整型數字的運算,不需要詳細知道 CPU 為了實現 1+1 進行了幾次開關操作。但無論什麼計算機、什麼計算機語言都會面臨如整數運算這樣的操作,那麼可以考慮把它們抽象出來,只保留實現目標所必需的資訊。
2). 什麼是抽象資料型別?
抽象資料型別(Abstract Data Type, ADT):指一個數學模型及定義在該模型上的一組操作。抽象資料型別的定義僅取決於他的一組邏輯特性,與其在計算機內部如何表示和實現無關。
3). 抽象資料型別有什麼意義?
"抽象"的意義在於資料型別的數學抽象特性。一個抽象資料型別定義了一個數據物件、資料物件中各資料元素之間的關係及對資料元素的操作。
理論的東西說起來總是那麼模糊,看一個例子就會發現清晰明瞭了。
還是之前整數計算的例子。計算機分很多種,大型機、小型機、PC、智慧手機等等,但是任何一種都有“整型資料”,也都需要進行“整型資料”運算。那麼這裡的整型其實就是一個抽象資料型別,它在不同計算機內的實現方法可能不同,但定義的數學特性相同,所以在我們看來是相同的。
抽象資料型別理論的東西提的比較多,概括下也就是為什麼會有各種不同的資料型別,同時解釋這些資料型別存在的意義是什麼...
總結
直接上圖吧,一圖勝千言...
資料結構層次
邏輯結構與物理結構
本文參考: