什麼是二分查詢 插值查詢 斐波那契查詢和索引查詢?

2021-10-14 06:26:06 字數 1996 閱讀 2916

術語

解釋查詢表

同一型別資料元素構成的集合

關鍵字資料元素中某個資料項的值

查詢根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的資料元素

靜態查詢表

查詢時不做插入或刪除操作。適用於用線性表儲存,可以採用順序查詢或折半查詢

動態查詢表

查詢時會有插入或刪除操作,適用於二叉樹。

先介紹兩種查詢演算法:

有序表查詢有三種:

優點:相對於順序查詢而言,效率高。

缺點:如果經常插入或刪除元素,則還需要另外維護元素的有序性,而且由於是順序儲存,會帶來不小的工作量。

如果要查的是乙個很小的元素,為什麼要從中間開始折半查詢呢?

比如[1,3,5,9,10,20,35,39,50,78,139]這個順序表,我想查3這個元素,從中間的位置開始折半查詢效率並不是很高。

這時候就出來乙個插值查詢,是對二分法的改進。

折半查詢的公式是:

middle_index = (min_index+max_index)/2

將上面的公式做一下數學變換:

middle_index =min_index+1/2*(max_index-min_index)

這個公式的意思是:

middle_index =最小索引+(最大索引與最小索引差值的二分之一)

重點就在於這個二分之一,插值查詢的改進方案是:

將1/2換成(key-a[min_index])/(a[max_index]-a[min_index])

a是陣列名,key是要查詢的值。

斐波那契數列(又叫兔子數列、**分割數列)

如果兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一

對小兔子來。假設所有兔都不死,那麼一年以後可以繁殖多少對兔子?

這個數列有乙個很明顯的特徵,每一項的值等於前兩項之和。用數學函式來定義,如下圖所示。

那和**分割又有什麼關係呢?

因為隨著數列項數的增加,前一項與後一項之比越來越逼近**分割的數值 0.6180339887

上面講到了順序表和有序表的查詢:

對於這樣的查詢表,解決辦法就是通過索引。索引是為了加快查詢速度而設計的一種資料結構。

索引有多個索引項,而每個索引項至少包含關鍵字和對應的記錄在儲存器中的位置兩個字段。

索引按儲存結構可分為如下幾種:

線性索引又可以分為如下三種:

下面簡單介紹一下這三種索引。

資料集中的每乙個記錄都對應乙個索引項,即資料與索引是一對一關係。

假如有一萬條資料,那麼就對應一萬條索引項,資料是無序的,而索引項是有序的,通過有序表的查詢演算法先查詢索引項,然後再通過一對一關係迅速找到資料。

這種索引的缺點很明顯,就是太佔空間了。

分塊索引的典型例子是圖書館的書架。

分塊就是將資料集分成若干塊,塊內可以無序,而塊間是有序的。

每個索引項有三個字段:

分塊與索引項的關係如下圖所示。

查詢步驟就是:

搜尋引擎中最基礎的搜尋技術就是倒排索引。

假如有兩篇文章,然後我們把每篇文章的關鍵字提取出來,如下表所示。

文章1文章2

我們可以根據某篇文章找到該文章的關鍵字,這樣的儲存結構叫正排索引。

相反地,如果能根據關鍵字找到對應的文章,就叫倒排索引,因此我們可以將儲存結構做一下變換,如下表所示。

qq文章1

文章1,文章2

**文章1

天貓文章2

二分查詢 插值查詢 斐波那契查詢

在有序表中,取中間記錄作為比較物件,將其與給定值相比較,若其等於給定值,則查詢成功 若其小於給定值,則在中間記錄的右半區繼續查詢 若其大於給定值,則在中間記錄的左半區繼續查詢。不斷重複以上過程,直到查詢成功或無匹配記錄。使用該查詢方法的前提條件在於,線性表中的資料必須有序,且必須採用順序儲存的方式。...

二分查詢,插值查詢,斐波那契查詢

二分查詢,插值查詢,斐波那契查詢 1.二分查詢 偽 while left else if key arr left index 2 then right left right 2 else left left right 2 end 示例 public int midsearch listarr,i...

順序查詢 二分查詢,斐波那契查詢,插值查詢

include include include using namespace std void printerr else if arr mid ele else return 1 void print int i else if len 2 else if len 3 else if len 3...