查詢演算法分為靜態查詢和動態查詢兩種。靜態查詢是指沒有插入和刪除結點操作,只需查詢到按給定關鍵字的結點,而動態查詢是指存在查詢過程中插入和刪除結點的操作。
對於靜態查詢,一般傾向於將資料組織成順序表的形式。無序查詢的複雜度為o(n)。
有序的序列分兩種情況:
當每個結點被查詢的概率相等時可以採用折半查詢的演算法,此時的複雜度為o(n).查詢的過程對應於一棵二分查詢樹。
當各個結點被查詢的概率不等時如果要得到最優查詢效率(期望查詢時間為最小),需要構造一棵最優二叉查詢樹。
無序查詢由於時間複雜度為o(n),複雜度較高,當資料量比較大時效率會很低,可以建立乙個索引表,將記錄按照一定區間劃分,區間之間的大小是有序的,區間內是無序的,這樣可以有效提高查詢效率。這樣的組織結構稱為索引順序結構。
動態查詢時由於有插入和刪除的操作,資料一般組織為鏈式的結構。動態查詢的主要組織結構有二叉排序樹,平衡二叉樹,b樹和b+樹。
二叉排序樹是這樣的一棵二叉樹:
它或者為空樹,或者為一棵滿足這樣要求的二叉樹:
1: 根節點的左子樹的所有節點的值都小於根節點,右子樹中所有節點的值都大於根節點
2:左子樹和右子樹本身也是一棵二叉排序樹
二叉排序樹的平均查詢時間複雜度為o(logn)。但是由於二叉排序樹的構造過程中可能存在每個分支都只有一棵子樹的情況,導致其實際的樹深度接近n,因此二叉排序樹如果構造不恰當,最壞查詢複雜度可能達到o(n)。
由此提出了一種平衡二叉樹的概念:平衡二叉樹本身是一棵足二叉排序樹且滿足其任何乙個節點的左子樹和右子樹的深度值之差的絕對值最大為1,當插入或者刪除二叉平衡樹中的乙個結點導致失去平衡性結構時,會通過旋轉調整演算法重新調整其為一棵二叉平衡樹。
b-樹(又稱b樹)的定義如下:
b-樹是一棵平衡的多路查詢樹。
m階的b-樹上每個非終端結點可能含有n個關鍵字ki(1<=i<=n),nn個指向記錄的指標di
n+1個指向子樹的指標ai(0<=i<=n)
非葉子結點的關鍵字按照從小到大排列k1ai-1所指向的子樹的關鍵字均小於ki,ai所指向的子樹中的關鍵字均大於ki。
樹中所有葉子結點不帶任何資訊,且在同一層次上。
根節點或者為空樹或者至少有兩顆子樹,其餘非葉子結點至少有⌈m/2⌉棵子樹,至多有m棵子樹.
b-樹的描述**如下:
#define m 3
typedef struct btnodebtnode* btree;
b-樹的查詢:
從根節點出發沿指標進行搜尋和在結點內進行順序(或者折半)查詢,兩個過程交替進行.
b-樹的插入:
若插入結點後仍然滿足b-樹的要求,則完成.
否則插入資料可能導致被插入位置所在結點的關鍵字個數大於m-1,此時需要**操作,將當前結點的中間位置關鍵字插入到父親結點中,其左子樹指向該關鍵字左邊的關鍵字**後形成的子樹,右指標指向該關鍵字右側形成的子樹.若此時父節點由於此**導致也不滿足b-樹的結構,則對父節點做同樣**操作.
刪除操作要求刪除b-樹中給定的關鍵字,若刪除後導致不滿足b-樹定義,則需重新調整.
這裡有兩種情況
1:刪除關鍵字後當前結點關鍵字個數小於⌈m/2⌉-1,若其兄弟結點的關鍵字個數大於⌈m/2⌉,則可以通過調整父親結點的關鍵字,兄弟結點的關鍵字和當前結點使得滿足平衡結構.
2:若兄弟結點的關鍵字也小於⌈m/2⌉,則若借用兄弟結點依然不能滿足平衡結構,此時應合併當前結點和父親結點及其兄弟結點.
查詢演算法 資料結構
查詢演算法總體分為靜態查詢,和動態查詢,其中靜態查詢法,不改變查詢表結構,動態查詢表,可以進行插入和刪除操作。一 查詢的基本概念 查詢,也可稱檢索,是在大量的資料元素中找到某個特定的資料元素而進行的工作。查詢是一種操作。二 順序查詢 針對無序序列的一種最簡單的查詢方式。時間複雜度為o n 三 折半查...
演算法(資料結構)
空間不夠儲存 給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 40億個數空間儲存的問題 利用對映 分析 unsigned 範圍是2 32 40億大約大約4g個數不到,常規方法肯定是不行的 我們你可以利用 伴隨陣列 那種思想利用記...
演算法 資料結構
演算法是程式的核心,演算法的好壞直接決定了程式的好壞 基礎的幾種演算法 二分查詢 氣泡排序 插入排序 選擇排序 快速排序 二分查詢 假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功 若x小於當前位置值,則在數列的前半段中查詢 若x大於當前位置值則在數...