讀書筆記 |《資料結構》 之什麼是資料結構(一)
剛好最近又找出大二修的資料結構的書,就想著把讀書筆記po上來。
資料結構是什麼
資料結構+演算法=程式
過程解析:發現問題,分析問題並抽象出具體的資料模型(待處理的資料以及資料之間的關係,即資料結構);設計演算法,其中包括完成資料表示(將資料以及資料之間的關係儲存到計算機的記憶體中)和資料處理(具體的操作步驟,將問題求解的基本思路行程演算法);編寫程式,將演算法的操作步驟轉換為某種程式設計語言對應的語句(就是用某種程式設計語言描述資料處理的過程)。
資料結構應用在哪裡
栗子1:線性表的資料結構
學籍管理問題:計算機的操作物件是每個學生的學籍資訊,各項之間的關係可以用線性表的資料結構來描述。
栗子2:樹的資料結構
人機對弈問題:人機對弈主要是對弈的策略實現已存入計算機,計算機的操作物件是對弈過程中可能出現的棋盤狀態(格局),而格局之間的關係是由對弈規則決定的,所以格局之間的關係可以用樹的資料結構來描述。
栗子3:圖的資料結構
教學計劃編排問題:有些課程之間要按照規定的先後次序進行,計算機的操作物件是課程,課程之間的次序關係可以用圖的資料結構來描述。從定點Ci到頂線Cj之間存在邊< Ci,Cj >,則表示課程Ci是課程Cj的先修課。
資料結構的基本概念
資料結構
資料是資訊的載體。資料是計算機程式處理的“原料”,eg:學籍管理程式處理的資料就是上圖的學籍登記表
資料元素
資料項是構成資料元素的不可分割的最小單位。eg:檔案中的學號、姓名等。
資料結構是指相互之間存在一定關係的資料元素的集合。資料元素是討論資料結構時涉及的最小資料單位。資料結構分為邏輯結構和儲存結構。
資料的邏輯結構是指資料元素之間邏輯關係的整體。資料結構在形式上可定義為一個二元組:
Data_Structure={D,R}
D:資料元素的有限集合
R:R是D上的關係集合
根據資料元素之間邏輯關係的不同,資料結構分為以下四類:
(a)集合:資料元素之間就是“屬於同一個集合”,除此之外,沒有任何關係。
(b)線性結構:資料元素之間存在著一對一
(c)樹結構:資料元素之間存在著一對多的層次關係。
(d)圖結構:資料元素之間存在著多對多的任意關係。
資料的儲存結構又稱物理結構,是資料及其邏輯結構在計算機中的表示,也就是說,儲存結構除了儲存資料元素之外,必須隱式或顯式地儲存資料元素之間的邏輯關係。通常有兩種儲存結構:順序儲存結構和鏈式儲存結構。
順序儲存:元素之間的邏輯關係由元素的儲存位置來表示。
鏈式儲存:元素之間的邏輯關係用指標來表示。
為了區別,通常將資料的邏輯結構稱為資料結構。
資料的邏輯結構和儲存結構密切相關。一種資料的邏輯結構可以用多種儲存結構來儲存,而採用不同的儲存結構,其資料處理的效率往往是不同的。
抽象資料型別
資料型別是一組值的集合以及定義於這個值集上的一組操作的總稱,規定了該型別資料的取值範圍和對這些資料採取的操作。
抽象:抽出問題本質的特徵而忽略非本質的細節。eg:程式語言將能完成某種功能並可重複執行的一段程式抽象為函式,在需要執行這種功能時呼叫這個函式,將“做什麼”和“怎麼做”分離開,實現了演算法細節和資料內部結構的隱藏。
抽象資料型別(ADT)是一個數據結構以及定義在該結構上的一組操作的總稱,可理解為對資料型別的進一步抽象。
資料型別 | ADT |
---|---|
高階程式設計語言支援的基本資料型別 | 自定義的資料型別 |
在設計ADT時,把ADT的定義和實現分開來。定義部分包含資料的邏輯結構和允許的操作集合。ADT的使用者依據這些定義來使用ADT,ADT的實現者依據這些定義來完成該ADT各種操作的具體實現。
ADT提供了定義和實現的不同檢視,實現了封裝和資訊隱藏。eg:整數的數學概念和施加到整數的運算構成一個ADT,C++的語音int型是對這個ADT的物理實現,各個程式設計語言都提供了整數型別,儘管它們在不同的編譯器上實現的方法,但由於其ADT相同,在使用者看來都是相同的。
ADT的定義包含以下內容:
ADT 抽象資料型別名
Data
資料元素之間邏輯關係的定義
Operation
操作1
前置條件:執行此操作前資料所必需的狀態
輸入:執行此操作所需要的輸入
功能:該操作將完成的功能
輸出:執行該操作後產生的輸出
後置條件:執行該操作後資料的狀態
操作2
······
······
操作n
······
endADT
演算法是什麼
演算法及其描述方法
演算法是對特定問題求解步驟的一種描述,是指令的有限序列。演算法滿足的五特性:>=0個輸入,>=1個輸出,有窮性,確定性,可行性。“好”演算法除了滿足以上五特性還滿足以下五特性:正確性,魯棒性,簡單性,抽象分級,高效性。
演算法的描述方法:自然語言,流程圖,程式設計語言,虛擬碼。
演算法分析
演算法的時間複雜度:為了客觀地反應一個演算法的執行時間,可以用演算法中的基本語句的執行次數來度量演算法的工作量。這種衡量效率的方法得出的不是時間量,而是一種增長趨勢的度量,只考察當問題規模充分大時,演算法中基本語句的執行次數在漸進意義下的階,稱為演算法的漸進時間複雜度,是一個估算值,通常用大O表示。
定義:若存在兩個正的常數c和n0,對於任意n>=n0,都有T(n)<=c*f(n),擇稱T(n)=O(f(n))。
栗子1:++x;
解:++x;是基本語句,執行次數為1,時間複雜度為O(1)
栗子2:for( i= 1;i<=n;++i)++x;
++x;是基本語句,執行次數為n,時間複雜度為O(n)
演算法的空間複雜度:在演算法的執行過程中,需要的輔助空間數量。
記作:S(n)=O(f(n))
n為問題規模
參考文獻:
〔1〕王紅梅,胡明,王濤 . 資料結構(C++版)(第2版)[M] . 清華大學出版社 . 2011