資料結構9 查詢

2021-10-01 15:21:04 字數 3351 閱讀 8376

查詢

靜態查詢:不涉及插入和刪除操作的查詢

適用於查詢集合一經生成,便只對其進行查詢,而不進行插入和刪除操作;或經過一段時間的查詢之後,集中的進行插入和刪除等修改操作;

動態查詢:設計插入和刪除操作的查詢

適用於查詢與刪除操作在同乙個階段進行,;例如當查詢成功時,要刪除查詢到的記錄,當查詢不成功時,要插入被查詢的記錄。

查詢的結構:

面向查詢操作的資料結構,即查詢基於的資料結構

1、線性表:適用於靜態查詢,主要採用順序查詢技術、折半查詢技術

2、樹表:適用於動態查詢,主要採取二叉排序樹的查詢技術

3、雜湊表:靜態查詢和動態查詢均適用,主要採用雜湊技術

查詢演算法的效能:通過關鍵碼的比較次數來衡量

關鍵碼的比較次數與哪些因素有關?

1)演算法;2)問題規模;3)待查關鍵碼在查詢集合中的位置;4)查詢頻率;

線性表的查詢技術:

一、順序查詢

普通的順序查詢

int linesearch :: seqsearch(int k)

帶監視哨的順序查詢方法(免去了查詢過程中每一次比較後都要判斷查詢位置是否越界從而提高查詢的速度)

int linesearch :: seqsearch(int k)

優點:對儲存結構沒有任何的要求;有序性也沒有要求。

缺點:平均查詢長度較大時,特別是當代查詢結合中的元素較多時,查詢效率低

二、折半查詢(線性表中的記錄必須按關鍵碼有序;必須採用順序儲存)

int linesearch :: binsearch2(int low, int high, int k)

}

折半查詢的判定樹(描述折半查詢過程的二叉樹)

樹表的查詢技術:

二叉排序樹:

插入演算法:

binode *bisorttree::insertbst(binode *bt, int x)

else if (bt->data > x)

bt->lchild = insertbst(bt->lchild, x);

else

bt->rchild = insertbst(bt->rchild, x);

}

構造演算法:(基於插入演算法實現)

bisorttree::bisorttree(int a[ ], int n)

刪除結點:

被刪除的結點是葉子;

操作:將雙親結點中相應指標域的值改為空

被刪除的結點只有左子樹或者只有右子樹;

操作:將雙親結點的相應指標域的值指向被刪除節點的左子樹(或右子樹)

被刪除的結點既有左子樹又有右子樹;

操作:以其後繼(右子樹中的最小值)替代之,然後再刪除該前驅結點。

void bisorttree::deletebst(binode*p, binode*f ) 

else if (!p->rchild)

else if (!p->lchild)

else

p->data=s->data;

if (par==p) p->rchild=s->rchild; //處理特殊情況

else par->lchild=s->rchild; //一般情況

delete s;

} //左右子樹均不空的情況處理完畢

}

查詢演算法:

binode *bisorttree::searchbst(binode*root, int k)

ps:二叉排序樹的查詢效能取決於二叉排序樹的形狀,在o(log2n)和o(n)之間

平衡二叉樹:

特點:根結點的左子樹和右子樹的深度最多相差1;根結點的左子樹和右子樹也是平衡二叉樹。

平衡因子:結點的平衡因子是改結點的左子樹的深度與右子樹的深度之差。

最小不平衡子樹:在平衡二叉樹的構造過程中,以距離插入結點最近、且平衡因子的絕對值大於1的結點為根的子樹

平衡調整歸納的四種情況:ll型、rr型、lr型、rl型

三、雜湊表的查詢技術

雜湊函式的構造:

直接定址法、除留餘數法、數字分析法、平方取中法、摺疊法(分段疊加法)

衝突處理方法:

開放定址法、鏈位址法、建立公共溢位區

ps:雜湊既是一種查詢技術,也是一種儲存技術;

雜湊只是通過記錄的關鍵碼定位該記錄,沒有完整表達記錄之間的邏輯關係,所以雜湊主要是面向查詢的儲存結構;

雜湊技術一般不適用於允許多個記錄有同樣關鍵碼的情況(有衝突,降低了查詢效率,體現不出計算式查詢的優點)

雜湊方法也不適用於範圍查詢(不能查詢最大值、最小值,也不可能找到在某一範圍內的記錄)

雜湊技術的關鍵問題:雜湊函式設計和衝突處理問題

雜湊函式:

1、直接定址法(事先知道關鍵碼,關鍵碼集合不是很大而且連續性較好)

h(key)=a*k+b(a,b為常數)

2、除留餘數法(是一種最簡單也是最常用的構造雜湊函式的方法,並且不要事先知道關鍵碼的分布。一般情況下,選p為小於或等於表長(最好接近表長)的最小素數)

h(key)=key mod p

3、數字分析法(事先知道關鍵碼的分布,關鍵碼的分布均勻)

4、平方取中法(事先不知道關鍵碼的分布且關鍵碼的位數不是很大)

5、摺疊法(關鍵碼的位數很多,事先不知道關鍵碼的分布)

衝突處理:

1、開雜湊方法(拉鍊法,鏈位址法)

node*hashsearch2(node*ht[ ], int m, int k)

}

1)線性探測法:hi=(h(key)+di)%m  (di=1,2,….,m-1)

int hashsearch1(int ht[ ], int m, int k) 

if (i==j) throw "溢位";

else ht[i]=k; //查詢不成功時插入

}

2)二次探測法:hi=(h(key)+di)%m  (di=1^2,-1^2,2^2,-2^2,….,q^2,-q^2且q<=m/2)

3)隨機探測法:hi=(h(key)+di)%m  (di是乙個隨機數列,i=1,2,…,m-1)

3、建立公共溢位區 (將發生衝突的記錄儲存在溢位表裡)

雜湊查詢的效能分析

1)影響衝突產生的因素有;

2)雜湊函式是否均勻;

3)處理衝突的方法;

4)雜湊表的裝填因子(α=表中填入的記錄數/表的長度)

資料結構實驗9

題目 根據哈夫曼 huffman 編碼的原理,編寫乙個程式,在使用者輸入節點權重的基礎上建立它的哈夫曼編碼。test.h include include define max 20 define maxvalue 1000typedef struct huffnode huffman void in...

查詢 資料結構

分類 資料結構與演算法 c c 2012 07 24 16 17 614人閱讀收藏 舉報幾種查詢演算法 順序查詢,折半查詢,分塊查詢,雜湊表 一 順序查詢的基本思想 從表的一端開始,向另一端逐個按給定值kx 與關鍵碼進行比較,若找到,查詢成功,並給出資料元素在表中的位置 若整個表檢測完,仍未找到與k...

資料結構 查詢

查詢 searching 也稱 檢索,查表,就是在大量的資訊集中尋找乙個特定的資訊元素。查詢就是根據 給定的關鍵字值,在 查詢表中確定乙個關鍵字等於給定的 記錄或資料元素。若存在這樣的資料元素,則稱查詢成功的,否則查詢不成功。查詢是許多重要的電腦程式中 最耗費時間的部分,查詢演算法的優劣密切關係著查...