第七章學習小結

2022-08-23 08:30:13 字數 3318 閱讀 4970

查詢的基本概念:

查詢表:同一型別的資料元素(記錄)構成的集合。

靜態查詢表:對查詢表只進行查詢操作。動態查詢表:不僅進行查詢操作,而且在查詢過程中還伴隨著插入(查詢的資料元素不在表中時)、刪除某個資料元素的操作。

關鍵字(key):是資料元素(或記錄)的某個資料項的值,用它可標識(識別)乙個資料元素(或記錄)。

平均查詢長度(asl):需和給定值進行比較的關鍵字個數的期望。

asl=∑i=1npici

asl=∑i=1npici

n:表中記錄個數 

pipi:查詢第i個記錄的概率 

cici:找到第i個記錄需要進行的對比次數。

以下這張圖是一位大佬部落格(的知識框圖:

書上也總結了順序查詢、折半查詢和分塊查詢的比較:

折半查詢和二叉樹查詢的比較:

b樹

即二叉搜尋樹:

1.所有非葉子結點至多擁有兩個兒子(left和right);

2.所有結點儲存乙個關鍵字;

3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹;

b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中;否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入右兒子;如果左兒子或右兒子的指標為空,則報告找不到相應的關鍵字;

如果b樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那麼b樹的搜尋效能逼近二分查詢;但它比連續記憶體空間的二分查詢的優點是,改變b樹結構(插入與刪除結點)不需要移動大段的記憶體資料,甚至通常是常數開銷;

b-樹

b-tree,即b樹,而不要讀成b減樹,它是一種多路搜尋樹(並不是二叉的):

1.定義任意非葉子結點最多只有m個兒子;且m>2;

2.根結點的兒子數為[2, m];

3.除根結點以外的非葉子結點的兒子數為[m/2, m];

4.每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)

5.非葉子結點的關鍵字個數=指向兒子的指標個數-1;

6.非葉子結點的關鍵字:k[1], k[2], …, k[m-1];且k[i] < k[i+1];

7.非葉子結點的指標:p[1], p[2], …, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;

8.所有葉子結點位於同一層;

b-樹的特性:

1.關鍵字集合分布在整顆樹中;

2.任何乙個關鍵字出現且只出現在乙個結點中;

3.搜尋有可能在非葉子結點結束;

4.其搜尋效能等價於在關鍵字全集內做一次二分查詢;

5.自動層次控制;

b+樹

b+樹是b-樹的變體,也是一種多路搜尋樹:

1.其定義基本與b-樹同,除了:

2.非葉子結點的子樹指標與關鍵字個數相同;

3.非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間);

5.為所有葉子結點增加乙個鏈指標;

6.所有關鍵字都在葉子結點出現;

b+的特性:

1.所有關鍵字都出現在葉子結點的鍊錶中(稠密索引),且鍊錶中的關鍵字恰好是有序的;

2.不可能在非葉子結點命中;

3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層;

4.更適合檔案索引系統;

原因: (2)增刪檔案(節點)時,效率更高,因為b+樹的葉子節點包含所有關鍵字,並以有序的鍊錶結構儲存,這樣可很好提高增刪效率。

而雜湊表的查詢主要是如何構造雜湊函式和如何處理衝突。

如何構造雜湊函式:

1、數字分析法

2、平方取中法

3、摺疊法

處理衝突的方法

1、開放位址法

2、鏈位址法

以下為開放位址和鏈位址之間的比較

二叉排序樹

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;

(2)若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;

(3)左、右子樹也分別為二叉排序樹;

(4)沒有鍵值相等的節點。

二叉排序樹的插入演算法:

struct bitree ;

//在二叉排序樹中插入查詢關鍵字key

bitree* insertbst(bitree *t,int key)

if (key < t->data)

t->lchild = insertbst(t->lchild, key);

else

t->rchild = insertbst(t->rchild, key);

return t;}

//n個資料在陣列d中,tree為二叉排序樹根

bitree* createbitree(bitree *tree, int d, int n)

二叉排序樹的刪除演算法:

#define status bool

status delete(bitree*);//必須先宣告

status deletebst(bitree &tparent,bitree &t, keytype key)//若二叉排序樹t中存在關鍵字等於key的資料元素時,則刪除該資料

//元素,並返回true;否則返回false

return true;

}status delete(bitree& fp , bitree&p)//從二叉排序樹中刪除結點p,並重接它的左或右子樹

else if(!p->lchild)//左子樹空只需重接它的右子樹

else//左右子樹均不空

//此時q是s的父結點

s->rchild=p->rchild; //將s的左子樹作為q的右子樹

delete(p);

}return true;

}

第七章學習小結

第七章的內容是查詢。查詢可以分為3種。分別是線性表查詢 樹表查詢 雜湊表查詢。1 線性表查詢 線性表查詢主要介紹了順序查詢和折半查詢這兩種方法。1 順序查詢區別於上學期學的方法,設定了哨兵,採用從後往前開始查詢的方法,將時間複雜度縮短了一倍。asl n 1 2 2 折半查詢,其實也叫二分查詢,原理是...

第七章小結

第七章我們主要是學習了查詢,是在前面的基礎上對查詢進行優化。一 基本概念 查詢表 由同一型別的資料元素或記錄構成的集合。完全鬆散 關鍵字 根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的記錄或資料元素。動態查詢表和靜態查詢表 若在查詢的同時對錶做修改操作 如插入或刪除 則相應的表稱為動態查詢...

第七章 查詢 學習小結

一 本章思維導圖 線性表 樹表 雜湊表 二 pta實踐及作業 二分查詢變形 hashing 2 二分查詢變形 面試 變形方向 1 算大於key的最小值 小於key的最大值 2 形成分割線,一邊全部大於key值,一邊全部小於key值 3 hashing i 重要 1 判斷是否為素數 質數 若不是,則要...