二分查詢實現有序符號表
複雜度分析
參考資料
符號表是一種儲存鍵值對的資料結構,可以支援高效地插入、查詢等操作,因此在這裡使用乙個有序符號表介面來定義這些操作,這個符號表將保持鍵的有序性。
public
inte***ce
orderedst
comparable
, value>
二分查詢先將被查詢的鍵和陣列的中間鍵比較,如果被查詢的鍵小於中間鍵,我們就在左子陣列中繼續查詢,如果大於我們就在右子陣列中繼續查詢,否則中間鍵就是我們要找的鍵。如果表中存在該鍵,此方法將返回該鍵的位置,否則,將返回該鍵應該插入的位置。
二分查詢有很多種不同的實現方式,但個人更加喜歡用以下的方式實現,這同時也是書上的實現方式:
public
intbinarysearch
(int
nums,
int target)
return low;
}
對二分查詢可以做乙個簡單的拓展,即當乙個有序陣列中有重複的數字時,查詢乙個數字在陣列中第一次出現的位置。例如,對於陣列
,要查詢的數字3
的下標應該為2而不是3。我們僅僅需要對普通的二分查詢演算法做乙個簡單的修改就能完成此功能:
public
intbinarysearchfirst
(int
nums,
int target)
return low;
}
同理,我們也可以使用二分查詢找到重複數字在有序陣列中最後一次出現的位置:
public
intbinarysearchlast
(int
nums,
int target)
return high;
}
使用一對平行陣列,分別用來儲存鍵和值。
這份實現的核心是rank()
方法,它幾乎和上面單獨列出的二分查詢法一樣,返回找到的鍵的位置或者鍵應該插入的位置。對於put()
方法,如果鍵存在於表中則更新它的值,否則插入到合適的位置,並將所有更大的鍵向後移動一格。get()
方法根據rank()
方法的返回值來取鍵相應的值,如果不存在則返回null。
public
class
binarysearchorderedst
comparable
, value>
implements
orderedst
@override
public
intsize()
@override
public
intrank
(key key)
return l;
}@override
public list
keys
(key l, key h)
return list;
}@override
public
void
put(key key, value value)
for(
int j = n; j > index; j--
) keys[index]
= key;
values[index]
= value;
n++;}
@override
public value get
(key key)
@override
public key min()
@override
public key max()
}
二分查詢的時間複雜度是對數級別的,故使用二分查詢實現的符號表的查詢操作所需要的時間也是對數級別的,但是插入操作由於需要移動陣列元素,因此是線性級別的。 查詢演算法之 二分查詢
這個例項給出了二叉搜尋演算法在9個元素的陣列arr中查詢某個目標值的過程01 2345 678 7 35812 1623 3355 例子1 查詢目標值2301 2345 678 7 35812 1623 3355 步驟1 索引範圍 0,9 索引first 0,last 9,mid 0 9 2 4 t...
查詢演算法之二分查詢
二分查詢,也是經常會問道的,以下寫法主要是針對已經排好序,且不會受到重複元素影響的陣列使用。二分查詢 param string find 要查詢的值 param array array 要查詢的陣列 return bool string function binarysearch find arra...
查詢演算法之二分查詢
在乙個排好序的陣列t 1 n 中查詢x,如果x在t中,輸出x在t的下標j 如果x不在t中,輸出j 0。對於這樣的有序序列,可以使用二分查詢的演算法來實現。如下圖序列,二分查詢20。在有序表中,取中間資料作為比較物件,若給定值與中間記錄的數值相等,則查詢成功 若給定值小於中間值的數值,則在中間值的左半...