今天開始寒假的寫寫寫(記筆記)生活。
本弱渣在經歷了期末的洗禮之后開始繼續計算機專業課的學習,由于即將參加春招,所以先從最基礎最重要的數據結構開始復習。之前刷筆試算法題的時候覺得還算順手,但是總是覺得有些地方基礎不夠牢固,所以選擇使用王道考研的數據機構來夯實基礎,希望能夠在面試中能夠有更好的表現吧,之后可能還會再把《劍指offer》中的一些不太熟練的題目寫到簡書上面來。
廢話不多說,先是第一章的基本概念1。
數據結構的基本概念
基本概念和術語
- 數據
數據是信息的載體,是描述客觀事物屬性的數,字符以及所有能輸入到計算機中并被計算機程序識別和處理的符號的集合。 - 數據元素
數據元素是數據的基本單位,通常作為一個整體進行考慮和處理。一個數據元素可由若干個數據項組成。數據項是構成數據元素的不可分割的最小單元。例如,學生記錄就是一個數據元素,它由學號,姓名,性別等數據項組成。 - 數據對象
數據對象是具有相同性質的數據元素的集合,是數據的一個子集。例如整數數據對象是集合 {0,+-1,+-2...} - 數據類型
數據類型是一個值的集合和定義在此集合上一組操作的總稱
- 原子類型: 其值不可再分
- 結構類型: 其值可以再分成若干成分
- 抽象數據類型: 抽象數據組織和與之相關的操作
抽象數據類型(ADT)
ADT是指一個數學模型以及定義在該模型上的一組操作。抽象數據類型的定義僅取決于它的一組邏輯特性,而與其在計算機內部如何實現和表示無關,不論其內部結構如何變化,只要它的數學特性不變,都不影響其外部的使用。通常用(數據對象,數據關系,基本 操作集)這樣的三元組來表示抽象數據類型數據結構
在任何問題中,數據元素都不是獨立存在的,它們之間存在著某種關系,這種數據元素之間的關系成為結構。數據結構是相互之間存在一種或多種特定關系的數據元素的集合。
數據結構包括三方面的內容,邏輯結構,存儲結構,數據的運算。數據邏輯結構和存儲結構是密不可分的兩個方面。算法的設計取決于選定的邏輯結構,算法的實現依賴于所采用的存儲結構。
數據結構的三要素
數據的邏輯結構
邏輯結構是元素之間的邏輯關系,即從邏輯關系上描述數據。它與數據的存儲無關,是獨立于計算機的。數據的邏輯結構分為線性結構和非線性結構,線性表是典型的線性結構。集合,樹,圖是典型的非線性結構。
集合:結構中的元素除了同屬于一個集合的關系外,沒有其他關系
線性結構:結構中的數據之間僅存在一對一的關系
非線性結構:結構中的數據之間存在一對多的關系
圖狀結構&&網狀結構:結構中的元素之間存在多對多的關系
數據的存儲結構
存儲結構是指數據結構在計算機中的表示,也稱物理結構。它包括數據元素的表示和關系的表示。數據的存儲結構是邏輯結構用計算機語言的實現,它依賴于計算機語言。數據的存儲結構主要有:順序存儲,鏈式存儲,索引存儲和散列存儲。
順序存儲:把邏輯上相鄰的元素存儲在物理位置上也相鄰的存儲單元里,元素之間的關系由存儲單元的鄰接關系來體現。優點:可以隨機存取,每個元素占用最少的存儲空間。缺點:只是使用相鄰的一整塊存儲單元,可能產生較多的外部碎片。
鏈接存儲:不要求邏輯上相鄰的單元在物理上也相鄰。借助指示元素存儲地址的指針表示元素之間的邏輯關系。優點:不會出現碎片現象,充分利用所有存儲單元。缺點:每個元素因存儲指針而占用額外的存儲空間,并且只能實現順序存取。
索引存儲:在存儲信息的同時,還建立其附加的索引表。索引表的每一項成為索引項,索引項的一般形式是:(關鍵詞,地址)。其優點是檢索速度快,缺點是增加了附加的索引表,占用較多的存儲空間。在刪除和增加數據時要修改索引表,會花費較多的時間。
散列存儲:根據元素的關鍵字直接計算出該元素的存儲地址,也稱HASH。優點是檢索,增加,刪除節點的速度都很快。缺點:如果散列函數不好可能會出現元素存儲單元的沖突,解決沖突需要增加時間和空間開銷。
數據的運算
施加在數據上的運算包括運算的定義和實現。定義針對邏輯結構:指出具體的功能,實現針對存儲結構:指出運算的具體步驟。
基本概念1 完!!!
(之前沒有系統的復習過這些東西,在有了一定代碼量之后看這些概念真有醍醐灌頂之感)
接下來是第一部分的習題的一些知識點提煉
- 在存儲數據時,不僅要存儲各個數據元素的值,還要存儲數據元素之間的關系。
- 鏈式存儲設計時,接點內的存儲單元地址一定連續。
- 可以用抽象數據類型去定義一個完整的數據結構。
問答題:
- 對于兩種不同的數據結構,邏輯結構和物理結構一定不相同嗎?
A:數據的運算也是數據結構的重要方面。比如二叉排序樹和二叉樹它們的邏輯和物理結構完全相同。兩者的運算定義不同。二叉樹一般表示層次關系,二叉排序樹通常用于排序和查找。 - 試舉一例,說明對相同的邏輯結構,同一種運算在不同的存儲方式下實現,運算效率不同。
A:線性表可用順序存儲,也可用鏈式存儲。就插入刪除而言,順序存儲O(n),鏈式存儲O(1),存取反之。
接下來總結基礎知識第二部分
算法和算法評價
算法的基本概念
算法是對特定問題求解步驟的一種描述。它是指令的優先序列,其中每一條指令表示一個或多個操作。
算法具有以下五個特性
- 有窮性:一個算法必須總是(對任何合法的輸入值) 在執行有窮步之后結束,且每一步都在有窮的時間內完成。
- 確定性:算法中每一條指令必須有確切的含義,讀者理解時不會產生二義性。對于相同的輸入只能產生相同的輸出。
- 可行性:一個算法是可行的。算法中描述的操作都是可以通過已經實現的基本運算執行有限次實現。
- 輸入: 一個算法有零個或多個輸入。輸入取自于某個特定的對象的集合。
- 輸出: 一個算法有多個或一個輸出。輸出是同輸入有著某種特定關系的量。
好的算法應該考慮如下目標
- 正確性
- 可讀性
- 健壯性:對輸入非法數據,也要能做出適當反應或進行處理。
- 效率于低存儲量需求
算法效率的度量
算法效率的度量是通過時間復雜度和空間復雜度來描述的。
時間復雜度
最壞時間復雜度:在最壞情況下的時間復雜度
平均時間復雜度:所有輸入實例在等概率出現的情況下,算法的期望運行時間
最好時間復雜度
分析時間復雜度的兩條guize
- 加法規則:T(n) = T1(n)+T2(n) = O(f(n)) + O(g(n)) = O(max(f(n), g(n)))
- 乘法規則:T() = T1(n) * T2(n) = O(f(n)) * O(g(n))= O(f(n) * g(n))
常見的漸進時間復雜度有
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
空間復雜度
定義為該算法所耗費的存儲空間,他是問題規模n的函數。漸進空間復雜度也常簡稱為空間復雜度。
S(n) = O(g(n))
程序中需要一些對數據進行操作的工作單元和存儲一些為實現計算所需信息的輔助空間。若輸入數據所占空間只取決于問題本身,于算法無關,則只需分析除輸入和程序之外的額外空間。
算法原地工作是指算法所需輔助空間是常量,即O(1)
第二部分的知識點羅列完畢,下面是習題中提取的盲點
分析如下代碼的執行次數
int m = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= 2 * i; j++) m++;
}
執行次數為n(n+1)
斐波那契數列:遞歸算法時間復雜度O(2^n)(具體計算略復雜),非遞歸時間復雜度O(n)
嘛,這就是寒假第一次的筆記了,希望不要爛尾,不要爛尾!!