基于二分查找与插入排序的符号表容器

基于二分查找与插入排序的符号表容器

符号表就是类似于编程常用的map,这里简单实现了一下

Api

   public ST()//构造器
   private void expansion()//扩容容器
   public Value get(Key key)//根据key获取value
   public boolean containKey(Key key)//二分查找符号表是否包含这个key
   public int keyIndex(Key key)//二分查找符号表里key的下标
   public void put(Key key,Value value)//向容器里添加一个key-value对
   private void insertSort(Key key,Value value)//添加key-value对并进行插入排序
   public void delete(Key key)//删除key-value对
   public int size()//返回符号表的真实大小
   private void swapKey(int i,int j)//交换俩个key的位置
   private void swapValue(int i,int j)//交换俩个value的位置
   private boolean less(Key a,Key b)//如果a<b,返回true
   private boolean isEquals(Key a,Key b)//如果a=b,返回true

实现

//基于二分查找与插入排序的符号表
//Key继承Comparable接口来保证良好的有序性
public class BinarySt<Key extends Comparable,Value> {
   private Key[] keys;      //键数组
   private Value[] values;  //值数组
   private int N = 0;       //键的数量
   private int realSize = 0;//符号表的真实大小
   //构造器,初始大小为2
   public BinarySt(){
       keys = (Key[]) new Comparable[2];
       values = (Value[]) new Object[2];
   }
   //扩容容器
   private void expansion(){
       Key[] newKeys = (Key[]) new Comparable[N*7/4];
       Value[] newValues = (Value[]) new Object[N*7/4];
       System.arraycopy(keys,0,newKeys,0,N);
       System.arraycopy(values,0,newValues,0,N);
       keys = newKeys;
       values = newValues;
   }
   //根据key获取value
   public Value get(Key key){
       int index;
       return -1==(index=keyIndex(key))?null:values[index];
   }
   //二分查找符号表是否包含这个key
   public boolean containKey(Key key){
       int begin = 0;
       int end = keys.length - 1;
       int mid;
       while (begin<=end){
           mid = (begin+end)/2;
           if (isEquals(key,keys[mid])){
               return null==values[mid]?false:true;
           }else if (less(key,keys[mid])){
               end = mid-1;
           }else {
               begin = mid+1;
           }
       }
       return false;
   }
   //二分查找符号表里key的下标
   public int keyIndex(Key key){
       int begin = 0;
       int end = N-1;
       int mid;

       while (begin<=end){
           mid = (begin+end)/2;
           if (isEquals(key,keys[mid])){
               return mid;
           }else if (less(key,keys[mid])){
               end = mid-1;
           }else {
               begin = mid+1;
           }
       }
       return -1;
   }
   //向容器里添加一个key-value对
   public void put(Key key,Value value){
       if (N == keys.length){
           expansion();
       }
       int index;
       if (-1 == (index = keyIndex(key))){
           realSize++;
           insertSort(key,value);
       }else {
           values[index] = value;
       }
   }
   //添加key-value对并进行插入排序
   private void insertSort(Key key,Value value){
       keys[N++] = key;
       values[N-1] = value;
       for (int i = N-1; i > 0; i--) {
           if (less(keys[i],keys[i-1])){
               swapKey(i,i-1);
               swapValue(i,i-1);
           }
       }
   }
   //删除key-value对
   public void delete(Key key){
       put(key,null);
       realSize--;
   }
   //返回符号表的真实大小
   public int size(){
       return realSize;
   }
   //交换俩个key的位置
   private void swapKey(int i,int j){
       Key temp = keys[i];
       keys[i] = keys[j];
       keys[j] = temp;
   }
   //交换俩个value的位置
   private void swapValue(int i,int j){
       Value temp = values[i];
       values[i] = values[j];
       values[j] = temp;
   }
   //如果a<b,返回true
   private boolean less(Key a,Key b){
       return a.compareTo(b) < 0;
   }
   //如果a=b,返回true
   private boolean isEquals(Key a,Key b){
       return a.compareTo(b)==0;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值