數據結構那些事
如果你現在在上大學,恰好又是計算機相關專業
那麼你肯定知道有一個非常枯燥的必修課《數據結構導論》
當然,你現在沒上大學或者不是計算機專業,那你現在應該知道了,他們有個必修課叫《數據結構導論》
從今天開始夢想橡皮擦要寫一套非常有趣的課程了
這套課程目的很簡單
目的:如何通過數據結構期末考試,有趣!
適合人羣:
- 大學計算機相關專業,有這門課程,然鵝你沒學,或者因爲一些莫名奇妙的原因,你曠課了
- 你想通過自考,注意自考,然後獲取計算機的一個本科學歷,這門課也是必修。
一門課程開始前,我們要先關注這門課的重點
大綱如下
按照國內比較權威的教材,一般情況下,自考採用的是《全國高等教育自學考試指導委員會》給推薦的書籍
本套課程參考的是自考書籍《數據結構導論 2012 主編:鄭誠》 外語教學研究出版社出版
知識點大綱如下
- 第一章 概論
- 第二章 線性表
- 第三章 棧、隊列和數組
- 第四章 樹和二叉樹
- 第五章 圖
- 第六章 查找
- 第七章 排序
不同教材,側重點不同,但是考點是覆蓋的。包括你們的期末考試
來吧,今天開始第一章,概論
概論
重點考點
咱直接些,直接來重要考點就行了,搞定這些就OK啦
基本概念
數據、數據元素、數據項
這個要記住,牢牢的記住
先說概念
所有被計算機存儲、處理的對象都是數據,你看計算機能處理圖像、處理音頻、處理文本,這些都是對象
數據的基本單位就是數據元素,一般叫做元素
然後元素是由數據項組成的,數據項還叫 字段或者域 ,並且數據項是數據的不可分割的最小標識單位
用圖來表示,就下圖即可理解
你看,好總結了
數據由若干數據元素組成,數據元素由若干數據項組成
數據的邏輯結構
數據的邏輯結構是指數據元素之間的邏輯關係。邏輯關係是指數據元素之間的關聯方式或“鄰接關係”
說人話:每條數據元素之間的邏輯關係叫數據的邏輯結構
你看自然界,人羣的組成,有一個個獨自站着的,有拍着隊站着的,有互相拉着手站着的…
這些反應到數據上,也是一樣的
四種邏輯結構分別爲
- 集合
- 線性結構
- 樹形結構
- 圖結構
數據的存儲結構
存儲結構包括兩部分:
- 存儲的數據元素
- 數據元素之間的關聯方式
表示數據元素之間的關聯方式主要有 順序存儲方式 和 鏈式存儲方式
其實需要記住四種
- 順序存儲方式
- 鏈式存儲方式
- 索引存儲方式
- 散列存儲方式
算法分析
評價算法的好壞有四個方面的因素
- 正確性
- 易讀性
- 健壯性
- 時空性 – 包含時間效率(時間性能)和空間效率(空間性能)
重要知識點
時間複雜度
分析例子
編寫函數求 1!+2!+…+n!
通過C語言編寫代碼實現如下
int fact1(int n){
int i,j,temp,s;
s = 0;
for (i=1;i<=n;i++){
temp = 1;
for(j=1;j<=i;j++){
temp = temp * j;
}
s = s + temp;
}
return s;
}
推導時間複雜度
如何估算算法的計算量,可以在算法中合理的選擇一種或幾種操作作爲“基本操作”
例如,上述代碼,我們分別去 乘法、加法和賦值爲基本操作,然後推導計算量
例如,當n = 5 時候,上述代碼的計算量如下
乘法:也就是 temp = temp * j;
執行的次數
1 + 2 + 3 + 4 + 5 = 15次
加法:也就是s = s + temp;
執行的次數
1+1+1+1+1 = 5次
賦值語句:s = 0;
temp = 1;
temp = temp * j;
s = s + temp;
執行的總次數
s=0
執行 1次temp=1
執行 1+1+1+1+1 = 5 次temp = temp * j;
執行 1+2+3+4+5 = 15次s = s + temp;
執行 1+1+1+1+1 = 5次
合計
1+5+15+5 = 26次
上述是當n等於5的時候的計算量,如果當n就是n的時候
那麼我們在計算一下計算量是多少
乘法:1+2+3+…+n = n(n+1)/2
加法:n
賦值語句:1+n+n(n+1)/2+n
在計算合計:也就是乘法+加法+賦值語句
n(n+1)/2 + n + 1+n+n(n+1)/2+n = 2(n2+n)/2+3n+1 = n2+4n+1
這時候,用T(n)表示這個計算量
T(n) = n2+4n+1
下面重點來了,當n無限大的時候,n2+4n+1 約等於 n2
可以用大O表示法 T(n) = O(n2)
看到了吧,這就是時間複雜度的表示方法,全稱叫做 算法的漸進時間複雜度
上面例子的第二種代碼編寫方式
int fact2(int n){
int i,j,temp,s;
s = 0;
temp = 1;
for(i=1;i<=n;i++){
temp = temp * i;
s = s + temp;
}
return s;
}
用和編碼1的方式推導之後
T(n) = 2n+2 ≈ O(n)
當n無限大時,算法的執行時間與n成正比
所以當你明白時間複雜度是怎麼計算出來之後,需要記住一些常見的時間複雜度階數
- 常數階O(1)
- 對數階O(log2n)
- 線性階O(n)
- 多項式階O(nc) 常見O(22) O(23)
- 指數階O(Cn) 常見的 O(2n)
最後的知識點是空間複雜度,這個一般在考試中不常見
一般需要考慮三部分
- 程序代碼所佔用的空間
- 輸入數據所佔用的空間
- 輔助變量所佔用的空間
在估算算法空間複雜度,一般只需要分析輔助變量所佔用的空間即可
寫在後面
對於考試來說,一些基本概念要掌握,算法時間複雜度的大小排序要掌握(後續博客中還會涉及),根據一個算法,分析時間算法的複雜度要會
想要 參加自考,想要通過《數據結構導論》,可以@夢想橡皮擦啦