從學校開始到現在學習資料結構也有好久了,現在感覺需要總結一下
先總結一下
排序:
氣泡排序:
時間複雜度
平均情況:o(n^2) 最好情況:o(n) 最壞情況:o(n^2)
空間複雜度:o(1)
穩定性:穩定
簡單選擇排序:
時間複雜度
平均情況:o(n^2) 最好情況:o(n^2) 最壞情況:o(n^2)
空間複雜度:o(1)
穩定性:穩定
直接插入排序:
時間複雜度
平均情況:o(n^2) 最好情況:o(n) 最壞情況:o(n^2)
空間複雜度:o(1)
穩定性:穩定
希爾排序:
時間複雜度
平均情況:o(nlogn)~o(n^2) 最好情況:o(n^1.3) 最壞情況:o(n^2)
空間複雜度:o(1)
穩定性:不穩定
堆排序:
時間複雜度
平均情況:o(nlogn) 最好情況:o(nlogn) 最壞情況:o(nlogn)
空間複雜度:o(1)
穩定性:不穩定
歸併排序:
時間複雜度
平均情況:o(nlogn) 最好情況:o(nlogn) 最壞情況:o(nlogn)
空間複雜度:o(n)
穩定性:穩定
快速排序:
時間複雜度
平均情況:o(nlogn) 最好情況:o(nlogn) 最壞情況:o(n^2)
空間複雜度:o(logn) ~ o(n)
穩定性:不穩定
其中,冒泡 簡單選擇 直接插入屬於簡單演算法,希爾 堆 歸併 快速屬於改進演算法。希爾排序相當於直接插入排序的公升級,它們同屬於插入排序類,堆排序相當於簡單選擇排序的公升級,他們同屬於選擇排序類。而快速排序其實就是氣泡排序的公升級,它們都屬於交換排序類。
順序表查詢:很簡單就是從開頭找到最後就行了。一般表都是無序的,所以時間複雜度就是o(1) ~ o(n)
有序表查詢:
折半查詢:mid = (low + high)/2
插值查詢: mid = low + (high - low)*(key - a[low])/(a[high] - a[low])
斐波那契查詢:mid = low + f[k - 1] - 1 (利用了斐波那契陣列的**分割原理來實現的。)
三種有序表的查詢本質上是分隔點的選擇不同,各有各自的應用場合,在實際開發中要根據實際情況而定,但他們的平均時間複雜度均為o(logn)。
線性索引查詢
稠密索引
分塊索引(塊內無序,塊間有序)
倒排索引(根據關鍵字索引)
平衡二叉樹:
平衡二叉樹是一種二叉排序樹,其中每乙個節點的左子樹和右子樹的高度差至多等於1.
二叉排序樹:
二叉排序樹,又稱為二叉查詢樹。它或者是一顆空樹,或者是具有下列性質的二叉樹:
若它的左子樹不空,則左子樹上所有結點的值均小於它的根節點的值;
若它的右子樹不空,則右子樹上所有結點的值均大於它的根節點的值;
它的左右子樹也分別為二叉排序樹。
平衡二叉樹的查詢 插入 刪除的時間複雜度均為o(logn)
b樹用於記憶體和外存之間的訪問而專門設計的。
哈係表的方法實質上就是根據一定的方法去最有可能的地方去找人。比如找學生一定去學校啊,找警察要去警局。常用方法是:
直接定址法
數字分析法
平方取中法
摺疊法除留餘數法
隨機數法
處理哈系衝突的方法:
再哈繫法:需要多準備幾個哈系函式。
公共溢位區法:將衝突的都放在乙個公共的地方。
單鏈表 迴圈鍊錶 雙向鍊錶
棧 佇列 迴圈佇列
常用資料結構
文章參考 資料結構 c語言版 嚴蔚敏 線性表 有頭有尾,中間節點有前驅有後繼 定義 一組連續的儲存單元依次儲存線性表的資料元素。定長順序表 typedef struct sqlist psqlist 不定長順序表 typedef struct dsqlist dsqlist,pdsqlist 單鏈表...
常用資料結構
function delete array element arr,pos for i pos 1 i length 1 i array pop arr return arr pos 3 echo 除第位置上的元素後 echo implode delete array element arr,pos...
常用資料結構
基本資料結構 邏輯 集合,線性結構,樹形結構,圖形結構 基本資料結構 物理 順序,鏈式,索引,雜湊。陣列,棧,鍊錶,圖,雜湊表,對列,樹,堆 陣列 在記憶體中連續儲存多個元素的結構,在記憶體中的分配是連續,通過陣列下標運算元組元素 建立陣列 int a int a new int 3 int a n...