第二章 資料結構與演算法基礎(佔比較高)
2.1 基本概念和三要素
資料結構在學什麼?
如何用程式程式碼把現實世界的問題資訊化
如何用計算機高效地處理這些資訊從而創造價值,
資料:資料是資訊的載體,是描述客觀事物屬性的數、字元及所有能輸入到計算機中並被計算機程式識別和處理的符號的集合。
資料元素、資料頂:資料元素是資料的基本單位,通常作為一個整體進行考慮和處理。一個資料元素可由若干資料項組成,資料項是構成資料元素的不可分割的最小單位
資料結構是相互之間存在一種或多種特定關係的資料元素的集合。
資料結構的三要素:邏輯結構、物理結構(儲存結構)、資料的運算
邏輯結構:集合、線性結構、樹形結構、圖狀結構(網狀結構)
- 集合:各個元素同屬一個集合,別無其他關係
- 線性結構:資料元素之間是一對一的關係。除了第一個元素,所有元素都有唯一前驅;除了最後一個元素,所有元素都有唯一後繼
- 樹形結構:資料元素之間是一對多的關係
- 圖結構:資料元素之間是多對多的關係
物理結構:
- 順序儲存:把邏輯上相鄰的元素儲存在物理位置上也相鄰的儲存單元中
- 鏈式儲存:邏輯上相鄰的元素在物理位置上可以不相鄰
- 索引儲存:在儲存元素資訊的同時,還建立附加的索引表
- 雜湊儲存:根據元素的關鍵字直接計算出該元素的儲存地址,又稱雜湊(Hash)儲存
2.2 演算法
程式=資料結構+演算法
資料結構表示如何把現實世界的問題資訊化,將資訊存進金算計,同時還要實現對資料結構的基本操作
演算法表示如何處理這些資訊以解決實際問題
演算法的五個特性:
- 有窮性:一個演算法必須總在執行有窮步之後結束,且每一步都可在有窮時間內完成。
- 確定性:演算法中每條指令必須有確切的含義,對於相同的輸入只能得出相同的輸出。
- 可行性:演算法中描述的操作都可以透過已經實現的基本運算執行有限次來實現。
- 輸入:一個演算法有零個或多個輸入,這些輸入取自於某個特定的物件的集合!
- 輸出:一個演算法有一個或多個輸出,這些輸出是與輸入有著某種特定關係的量。
演算法效率的度量(衡量演算法好壞的指標):
- 時間複雜度:時間開銷與問題規模n之間的關係
- 空間複雜度:空間開銷(記憶體開銷)與問題規模n之間的關係
函式遞迴呼叫帶來的記憶體開銷:空間複雜度 = 遞迴呼叫的深度
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
2.3 線性表
- 邏輯結構
- 物理結構
- 順序表:順序儲存
- 連結串列:鏈式儲存
- 雙向連結串列
- 迴圈連結串列
- 靜態連結串列
- 插入刪除操作
線性表是具有相同資料型別的n(n≥0)個資料元素的有限序列,其中n為表長,當n=0時線性表是一個空表。
若用L命名線性表,則其一般表示為
ai是線性表中的“第i個”元素線性表中的位序;a1是表頭元素;an是表尾元素。除第一個元素外,每個元素有且僅有一個直接前驅;除最後一個元素外每個元素有且僅有一個直接後繼。
線性表儲存結構:
效能類別 | 具體專案 | 順序儲存 | 鏈式儲存 |
---|---|---|---|
空間效能 | 儲存密度 | =1,更優 | <1 |
容量分配 | 事先確定 | 動態改變,更優 | |
時間效能 | 查詢運算 | O(n/2) | O(n/2) |
讀運算 | O(1),更優 | O([n+1]/2),最好情況為O(1),最壞情況為O(n) | |
插入運算 | O(n/2),最好情況為0,最壞情況為O(n) | O(1),更優 | |
刪除運算 | O([n-1]/2) | O(1),更優 |
插入刪除操作:
- 順序儲存:插入元素前要移動元素以挪出空的儲存單元,然後再插入元素。刪除元素時同樣需要移動元素,以填充被刪除元素的儲存單元。
- 鏈式儲存:(例如刪除a2)
- 單連結串列刪除節點:a1的指標指向a3
- 單連結串列插入節點:S指標指向新元素a4,先用a4的指標指向a2,然後a1的指標指向a4(順序顛倒後就沒有a2後面的資料了)
- 雙向連結串列刪除節點:P指標指向a2(要刪除的節點),a1指向a3,然後a3指向a1
- 雙向連結串列插入節點:先引入q指標指向x(要插入的節點),然後x的next指標指向a2,然後a2節點的前指標指向x,然後再連前面,a1的後指標指向x
2.4 棧和佇列
棧(Stack)是隻允許在一端進行插入或刪除操作的線性表。棧頂是允許插入和刪除的一端,棧底是不允許插入和刪除的一端,可以進行括號匹配
佇列是一種先進先出(FIFO)的線性表,它只允許在表的一端插入元素,而在表的另一端刪除元素。允許插入元素的一端稱為隊尾(Rear),允許刪除元素的一端稱為隊頭(Front)。
迴圈佇列:
隊空條件:head = tail
隊滿條件:(tail+1)%size = head
2.5 串、陣列、矩陣和廣義表
2.5.1 串
串是僅由字元構成的有限序列,是取值範圍受限的線性表。
一般記為S = 'a1 a2 ~~~ an'
,其中S是串名,a1 a2 an是串值。
- 空串:長度為零的串,空串不包含任何字元,
- 空格串:由一個或多個空格組成的串。
- 子串:由串中任意長度的連續字元構成的序列。含有子串的串稱為主串。子串在主串中的位置指子串首次出現時,該子串的第個字元在主串中的位置。空串是任意串的子串。
- 串相等:指兩個串長度相等且對應位置上的字元也相同,
- 串比較:兩個串比較大小時以字元的ASCII碼值作為依據。比較操作從兩個串的第一個字元開始進行,字元的ASCI碼值大者所在的串為大;若其中一個串先結束,則以串長較大者為大。
對串進行的基本操作有以下幾種:
- 賦值操作
StrAssign(s,)
:將串t的值賦給串s - 連線操作
Concat(s,t)
:將串t接續在串s的尾部,形成一個新串 - 求串長
StrLength(s)
:返回串s的長度 - 串比較
StrCompare(s,t)
:比較兩個串的大小。 - 求子串
SubString(start,len)
:返回串s中從start開始的、長度為len的字元序列。
串的儲存結構:
- 串的順序儲存:定長儲存結構
- 串的鏈式儲存:塊鏈
子串的定位操作通常稱為串的模式匹配,它是各種串處理系統中最重要的運算之一。子串也稱為模式串。