關於查詢的總結

2021-07-04 04:09:22 字數 2682 閱讀 5202

【出處】

下列五種查詢演算法,除順序查詢外,其他演算法的思路基本相同:

先對資料按某種方法進行排序,然後使用相應的規則查詢。

因此,搞清排序演算法才是關鍵。

條件:無序或有序佇列。

原理:按順序比較每個元素,直到找到關鍵字為止。

時間複雜度:o(n)

條件:有序陣列

原理:查詢過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;

如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。

如果在某一步驟陣列為空,則代表找不到。

這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

時間複雜度:o(logn)

條件:先建立二叉排序樹:

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

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

3. 它的左、右子樹也分別為二叉排序樹。

原理:在二叉查詢樹b中查詢x的過程為:

1. 若b是空樹,則搜尋失敗,否則:

2. 若x等於b的根節點的資料域之值,則查詢成功;否則:

3. 若x小於b的根節點的資料域之值,則搜尋左子樹;否則:

4. 查詢右子樹。

時間複雜度:

條件:先建立雜湊表(雜湊表

原理:根據鍵值方式(key value)進行查詢,通過雜湊函式,定位資料元素。

時間複雜度:幾乎是o(1),取決於產生衝突的多少。

原理:將n個資料元素"按塊有序"劃分為m塊(m ≤ n)。

每一塊中的結點不必有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;

而第2塊中任一元素又都必須小於第3塊中的任一元素,……。

然後使用二分查詢及順序查詢。

關於分塊查詢詳細內容

分塊查詢

分塊查詢(blocking search)又稱索引順序查詢。它是一種效能介於順序查詢和二分查詢之間的查詢方法。

1、 二分查詢表儲存結構

二分查詢表由"分塊有序"的線性表和索引表組成。

(1)"分塊有序"的線性表

表r[1..n]均分為b塊,前b-1塊中結點個數為

(2)索引表

抽取各塊中的最大關鍵字及其起始位置構成乙個索引表id[l..b],即:

id[i](1≤i≤b)中存放第i塊的最大關鍵字及該塊在表r中的起始位置。由於表r是分塊有序的,所以索引表是乙個遞增有序表。

【例】下圖就是滿足上述要求的儲存結構,其中r只有18個結點,被分成3塊,每塊中有6個結點,第一塊中最大關鍵字22小於第二塊中最小關鍵字24,第二塊中最大關鍵字48小於第三塊中最小關鍵字49。

2、分塊查詢的基本思想

分塊查詢的基本思想是:

(1)首先查詢索引表

索引表是有序表,可採用二分查詢或順序查詢,以確定待查的結點在哪一塊。

(2)然後在已確定的塊中進行順序查詢

由於塊內無序,只能用順序查詢。

3、分塊查詢示例

【例】對於上例的儲存結構:

(1)查詢關鍵字等於給定值k=24的結點

因為索引錶小,不妨用順序查詢方法查詢索引表。即首先將k依次和索引表中各關鍵字比較,直到找到第1個關鍵宇大小等於k的結點,由於k<48,所以關鍵字為24的結點若存在的話,則必定在第二塊中;然後,由id[2].addr找到第二塊的起始位址7,從該位址開始在r[7..12]中進行順序查詢,直到r[11].key=k為止。

(2)查詢關鍵字等於給定值k=30的結點

先確定第二塊,然後在該塊中查詢。因該塊中查詢不成功,故說明表中不存在關鍵字為30的結點。

具體過程【參見動畫演示】

4、演算法分析

(1)平均查詢長度asl

分塊查詢是兩次查詢過程。整個查詢過程的平均查詢長度是兩次查詢的平均查詢長度之和。

①以二分查詢來確定塊,分塊查詢成功時的平均查詢長度

aslblk=aslbn+aslsq≈lg(b+1)-1+(s+1)/2≈lg(n/s+1)+s/2

②以順序查詢確定塊,分塊查詢成功時的平均查詢長度

asl'blk=(b+1)/2+(s+1)/2=(s2+2s+n)/(2s)

注意:當s=

【例】若表中有10000個結點,則應把它分成100個塊,每塊中含100個結點。用順序查詢確定塊,分塊查詢平均需要做100次比較,而順序查詢平均需做5000次比較,二分查詢最多需14次比較。

注意:分塊查詢演算法的效率介於順序查詢和二分查詢之間。

(2)塊的大小

在實際應用中,分塊查詢不一定要將線性表分成大小相等的若干塊,可根據表的特徵進行分塊。

【例】乙個學校的學生登記表,可按系號或班號分塊。

(3) 結點的儲存結構

各塊可放在不同的向量中,也可將每一塊存放在乙個單鏈表中。

(4)分塊查詢的優點

分塊查詢的優點是:

①在表中插入或刪除乙個記錄時,只要找到該記錄所屬的塊,就在該塊內進行插入和刪除運算。

②因塊內記錄的存放是任意的,所以插入或刪除比較容易,無須移動大量記錄。

分塊查詢的主要代價是增加乙個輔助陣列的儲存空間和將初始表分塊排序的運算。

關於數值進行查詢的乙個總結

1.在乙個的陣列中查詢某個數 include include intmain int tofind 2 int i 0 利用for 語句的迴圈來使下標依次發生變化 for i 0 i 9 i system pause return0 2.在一組有序的數字中找到某乙個數的位置 include incl...

關於mysql查詢 關於MYSQL 查詢

你想要的是這種效果嗎?建立表city cost create table city cost id int primary key auto increment,cost time date,city varchar 20 money int auto increment 1 插入資料 insert...

關於日期的查詢

生日查詢 例如 8.1 8.15 之間過生日的 select from presoninfo where dateadd year,datediff year,flocktime,2009 8 1 flocktime between 2009 8 1 and 2009 8 15 or dateadd...