算法系列笔记(八)符号表

符号表听不懂,但有个更简单的名字——字典。主要目的就是将一个键和一个值联系起来。我们通过查询键来找到对应的值。

符号表是一种存储键值对的数据结构,支持插入和查找操作。

符号表中不允许重复的键,当重复的时候新值会代替旧值。

键不能空。

链表的形式实现符号表

平均成本(查找 N/2 插入N)

public class SequentialSearchST {
    private Node first;
    private class Node{   //结点,存放键值对和下一个结点指针
        Key key;
        Value val;
        Node next;
    public Node(Key k,Value v,Node n) {
        key=k;
        val=v;
        this.next=n;
    }
  }
    public Value get(Key key) {
        for(Node x=first;x!=null;x=x.next) {   //遍历链表(符号表)
            if(key.equals(x.key)) 
                return x.val;
        }
        return null;
    }
    public void put(Key key,Value val) {
        for(Node x=first;x!=null;x=x.next) {
            if(key.equals(x.key)) {
                x.val=val; return;    //倘若原先有重复的键则更新其值
            }
        }
        first=new Node(key, val, first);  //否则就新建一个结点
    }   
}
用数组实现有序序号表

平均成本(查找 lgN 插入N)

public class BinarySearchST,Value> {
    private Key[]keys;
    private Value[]vals;
    private int N;
    public BinarySearchST(int a) {
        keys=(Key[])new Comparable[a];
        vals=(Value[])new Object[a];
    }
    public int size() {
        return N;
    }
    public boolean isEmpty() {
        return N==0;
    }
    public int rank(Key key)  {   //二分查找 这是有序的
        int lo=0,hi=N-1;
        while(lo<=hi) {
            int mid=lo+(hi-lo)/2;
            int cmp=key.compareTo(keys[mid]);
            if(cmp<0) hi=mid-1;
            else if(cmp>0) lo=mid+1;
            else return mid;
        }
        return lo;
    }

    public Value get(Key key) {
        if(isEmpty())return null;
        int i=rank(key);
        if(ii;j--) {          //序号i之后的元素往后移动一格
            keys[j]=keys[j-1];
            vals[j]=vals[j-1];
        }
        keys[i]=key;
        vals[i]=val;
        N++;
    }


    public Key min() {  //返回最小值
        return keys[0];
    }
    public Key max() {
        return keys[N-1];
    }
    public Key select(int k) {
        return keys[k];
    }
    public Key ceiling(Key key) {     //返回key对应的值
        int i=rank(key);
        return keys[i];
    }

}

你可能感兴趣的:(算法系列笔记(八)符号表)