使用keys
和values
兩個陣列分別儲存鍵和值
實現的核心是rank()
方法,它返回表中小於給定鍵的數量
/**
* 有序陣列的二分查詢
*/public
class
arraybinarysearchst
comparable
, value>
implements
iorderedsymboltable
public
arraybinarysearchst
(int capacity)
/** * 返回最小的鍵
** @return 最小的鍵
*/@override
public key min()
return keys[0]
;}/** * 返回最大的鍵
** @return 最大的鍵
*/@override
public key max()
return keys[n -1]
;}/** * 返回小於等於key的最大鍵
** @param key
* 鍵
* @return 小於等於key的最大鍵
*/@override
public key floor
(key key)
if(i ==0)
return keys[i -1]
;}/** * 返回大於等於key的最小鍵
** @param key
* 鍵
* @return 大於等於key的最小鍵
*/@override
public key ceiling
(key key)
return keys[i];}
/** * 返回小於key的鍵的數量(鍵的排名)
** @param key
* 鍵
* @return 小於key的鍵的數量
*/@override
public
intrank
(key key)
else
if(compare >0)
else
}return low;
}/**
* 獲取排名為k的鍵
** @param k
* 排名
* @return 排名為k的鍵
*/@override
public key select
(int k)
return keys[k];}
/** * 刪除最小的鍵值對
*/@override
public
void
deletemin()
/** * 刪除最大的鍵值對
*/@override
public
void
deletemax()
/** * 返回[low..high]之間鍵的數量
** @param low
* 小鍵
* @param high
* 大鍵
* @return [low..high]之間鍵的數量
*/@override
public
intsize
(key low, key high)if(
contains
(high)
)return
rank
(high)
-rank
(low);}
/** * 返回[low..high]之間的所有鍵,已排序
** @param lo
* 小鍵
* @param hi
* 大鍵
* @return [low..high]之間的所有鍵
*/@override
public iterable
keys
(key lo, key hi)
for(
int i =
rank
(lo)
; i <
rank
(hi)
; i++)if
(contains
(hi)
)return queue;
}/**
* 將鍵值對存入符號表(如果值為空則將鍵從表中刪除)
** @param key
* 鍵
* @param value
* 值
*/@override
public
void
put(key key, value value)
if(i < n && keys[i]
.compareto
(key)==0
)if(n >= keys.length)
// 將所有更大的鍵向後移動一格
for(
int j = n; j > i; j--
) keys[i]
= key;
values[i]
= value;
n++;}
/***
* 獲取鍵 key 的值(如果鍵 key 不存在則返回 null)
** @param key
* 鍵
* @return 對應的值
*/@override
public value get
(key key)
int i =
rank
(key);if
(i < n && keys[i]
.compareto
(key)==0
)return null;
}/**
* 從符號表中刪除鍵 key(以及對應的值)
** @param key
* 鍵
*/@override
public
void
delete
(key key)
int i =
rank
(key);if
(i == n || key.
compareto
(keys[i])!=
0)for(
int j = i; j < n -
1; j++
) n--
; keys[n]
= null;
values[n]
= null;
if(n >
0&& n == keys.length /4)
}/**
* 鍵key是否在符號表中有對應的值
** @param key
* 鍵
* @return boolean
*/@override
public
boolean
contains
(key key)
/** * 返回符號表是否為空
** @return boolean
*/@override
public
boolean
isempty()
/** * 返回符號表中鍵值對的個數
** @return 符號表中鍵值對的個數
*/@override
public
intsize()
/** * 返回符號表中所有鍵的(可迭代)集合
** @return 鍵的集合
*/@override
public iterable
keys()
private
void
validkey
(key key)
}private
void
resize
(int capacity)
values = tempv;
keys = tempk;
}}
符號表的順序查詢和二分查詢
符號表表示一張抽象的 我們將資訊儲存到其中,然後按照指定的鍵來搜尋並獲取這些資訊。鍵和值的具體意義取決於不同的應用。符號表中可能會儲存很多鍵和很多資訊,因此實現一張高效的符號表也是一項很有挑戰性的任務。符號表也稱為字典。符號表最主要的目的就是將乙個鍵和乙個值聯絡起來。用例能夠將乙個鍵值對插入符號表中...
《演算法》筆記 7 符號表 順序查詢 二分查詢
無序鍊錶中的順序查詢 有序陣列中的二分查詢 現代計算機和網路使人們能夠訪問海量的資訊,而且各種計算裝置正在源源不斷地生成新的資訊,高效檢索這些資訊的能力就成了處理它們的重要前提。接下來學習幾種經典的查詢演算法。符號表指的是一張用於儲存資訊的抽象的 主要目的就是將乙個鍵和乙個值聯絡起來,可以將乙個鍵值...
符號表 二叉查詢樹
實現了二叉查詢樹的 插入,查詢,獲取最大 最小值,刪除最大 最小值,按照給定的鍵值刪除鍵值,向上取整等方法。如下 標頭檔案如下 bst.h created on 2014年6月28日 author zhongchao ifndef bst define bst include include inc...