1、基本思想
采用一对平行的数组,一个存储键一个存储值
实现的核心是 rank()
方法,它返回表中小于给定键的键的数量
。
2、算法实现
二分查找法
:将被查找的键和子数组的中间键比较。如果被查找的键小于中间
键,就在左子数组
中继续查找,如果大于就在右子数组
中继续查找,否则中间键就是我们要找的键。
实现 rank() 采用了二分查找法,rank()性质如下:
如果表中存在该键,rank() 返回该键的位置,也就是表中小于它的键的数量
如果表中不存在该键,rank() 仍返回表中小于它的键的数量
/*基于递归的二分查找*/
public int rank(Key key,int lo,int hi)
{
if(hi<lo)
return lo;
int mid = lo+(hi-lo)/2;
int cmp = key.compareTo(keys[mid]);
if(cmp > 0)
return rank(key, mid+1, hi);
else if(cmp < 0)
return rank(key, lo, mid-1);
else return mid;
}
/*基于迭代的二分查找*/
public int rank(Key key)
{
int lo=0, hi=N-1;
while(lo <= hi)