常用查詢演算法

2021-07-24 03:56:28 字數 2028 閱讀 1006

順序查詢是在乙個已知無(或有序)序佇列中找出與給定關鍵字相同的數的具體位置。原理是讓關鍵字與佇列中的數從第乙個開始逐個比較,直到找出與給定關鍵字相同的數為止,它的缺點是效率低下。

public

static

int sequencesearch(int array, int des)

}return -1;

}

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,二分查詢方法適用於不經常變動而查詢頻繁的有序列表。其演算法原理如下: 

首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。 

重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

public

static

int binarysearch(int array, int des) else

if (array[middle] > des) else

}return -1;

}

分塊查詢又稱索引順序查詢,是折半查詢和順序查詢的一種改進方法,折半查詢雖然具有很好的效能,但其前提條件時線性表順序儲存而且按照關鍵碼排序,這一前提條件在結點樹很大且表元素動態變化時是難以滿足的。而順序查詢可以解決表元素動態變化的要求,但查詢效率很低。如果既要保持對線性表的查詢具有較快的速度,又要能夠滿足表元素動態變化的要求,則可採用分塊查詢的方法。 

分塊查詢的速度雖然不如折半查詢演算法,但比順序查詢演算法快得多,同時又不需要對全部節點進行排序。當節點很多且塊數很大時,對索引表可以採用折半查詢,這樣能夠進一步提高查詢的速度。 

分塊查詢要求把乙個大的線性表分解成若干塊,每塊中的節點可以任意存放,但塊與塊之間必須排序。假設是按關鍵碼值非遞減的,那麼這種塊與塊之間必須滿足已排序要求,實際上就是對於任意的i,第i塊中的所有節點的關鍵碼值都必須小於第i+1塊中的所有節點的關鍵碼值。此外,還要建立乙個索引表,把每塊中的最大關鍵碼值作為索引表的關鍵碼值,按塊的順序存放到乙個輔助陣列中,顯然這個輔助陣列是按關鍵碼值非遞減排序的。查詢時,首先在索引表中進行查詢,確定要找的節點所在的塊。由於索引表是排序的,因此,對索引表的查詢可以採用順序查詢或折半查詢;然後,在相應的塊中採用順序查詢,即可找到對應的節點。

雜湊查詢是通過計算資料元素的儲存位址進行查詢的一種方法。雜湊查詢的操作步驟如下: 

(1)用給定的雜湊函式構造雜湊表; 

(2)根據選擇的衝突處理方法解決位址衝突; 

(3)在雜湊表的基礎上執行雜湊查詢。 

雜湊查詢的本質是先將資料對映成它的雜湊值。雜湊查詢的核心是構造乙個雜湊函式,它將原來直觀、整潔的資料對映為看上去似乎是隨機的一些整數。 

雜湊查詢的產生有這樣一種背景——有些資料本身是無法排序的(如影象),有些資料是很難比較的(如影象)。如果資料本身是無法排序的,就不能對它們進行比較查詢。如果資料是很難比較的,即使採用折半查詢,要比較的次數也是非常多的。因此,雜湊查詢並不查詢資料本身,而是先將資料對映為乙個整數(它的雜湊值),並將雜湊值相同的資料存放在同乙個位置——即以雜湊值為索引構造乙個陣列。 

在雜湊查詢的過程中,只需先將要查詢的資料對映為它的雜湊值,然後查詢具有這個雜湊值的資料,這就大大減少了查詢次數。

影響雜湊查詢效率的乙個重要因素是雜湊函式本身。當兩個不同的資料元素的雜湊值相同時,就會發生衝突。為減少發生衝突的可能性,雜湊函式應該將資料盡可能分散地對映到雜湊表的每乙個表項中。解決衝突的方法有以下兩種: 

(1) 開放位址法 

如果兩個資料元素的雜湊值相同,則在雜湊表中為後插入的資料元素另外選擇乙個表項。 

當程式查詢雜湊表時,如果沒有在第乙個對應的雜湊表項中找到符合查詢要求的資料元素,程式就會繼續往後查詢,直到找到乙個符合查詢要求的資料元素,或者遇到乙個空的表項。 

(2) 鏈位址法 

將雜湊值相同的資料元素存放在乙個鍊錶中,在查詢雜湊表的過程中,當查詢到這個鍊錶時,必須採用線性查詢方法。

常用查詢演算法

查詢是在大量的資訊中尋找乙個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。用關鍵字標識乙個資料元素,查詢時根據給定的某個值,在表中確定乙個關鍵字的值等於給定值的記錄或資料元素。在計算機中進行查詢的方法是根據表中的記錄的組織結構確定的。順序查詢也稱為線形查詢,從資料...

常用查詢演算法

include include include 順序表的查詢 順序表的查詢 平均o n 最好o 1 最差o n int sqsearch int r,int n,int key return 0 沒有查詢到v 有序表的查詢 交換值 void swap int r,int i,int j 獲取中間位置...

常用的查詢演算法

1 mid low high 2 2 當k arr mid 時,low mid 1,並重複1 當k 當k arr mid 時,找到,結束。直到low high,還沒找到那麼說明該關鍵字不存在。核心 實現 演算法步驟 1 第一步確定查詢節點在那個表中的那一塊。2 第二步在確定的塊中找到該節點。1 雜湊...