符号表的构建与实例

符号表

符号表的目的:将一个键和一个值联系起来,并能通过键直接查找到对应的值。
定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作。

  • 一个键只对应一个值,不允许有重复的键。
  • 当插入的键和以往的键有冲突时,新值取代旧值。

put()方法的实现

 public void put(Key key, Value value)
    {
        if(key == null)		//防止插入空值
            return;
        int i = rank(key);  //找到插入符号表的位置
        //如果符号表已经放满,则扩大表的大小
        if(size == keys.length)
        {
            resize(2*keys.length);
        }
        //如果已经存在,则交换值。避免重复值
        if(i < size && keys[i].compareTo(key) == 0)
        {
            values[i] = value;
            return;
        }
        //否则,将大于i的键序列往右移,空出i将键值对插入。
        for(int j = size; j>i; j--)
        {
            keys[j] = keys[j-1];
            values[j] = values[j-1];
        }
        keys[i] = key;
        values[i] = value;
        size++;
    }

get()方法的实现

  public Value get(Key key)
    {
        if(isEmpty() || key == null)    //如果为空或键值不存在则返回null。
        {
            return null;
        }
        int i = rank(key);      //找到键key对应的序列。
        if ((i < size) && (keys[i].compareTo(key) == 0))
        {
            return values[i];
        }
        return null;
    }

rank()方法对符号表排序

 //对键值对进行排序
    private int rank(Key key) {
        int lo = 0;
        int hi = size -1;
        //二分查找
        while (lo <= hi)
        {
            int mid = lo + (hi - lo)/2;
            int cmd = key.compareTo(keys[mid]);
                if(cmd == 0)
                    return mid;
                else if(cmd < 0)
                    hi = mid - 1;
                else
                    lo = mid + 1;
        }
        return lo;
    }

符号表的实例

用符号表统计英英语文章中单词出现的频率

思路设计

建立符号表之后,使用IO流在文件中读取字符串并将其按空格分解成各个单词,再将各个单词存入到符号表中,如果在符号表中未查找到此单词,则将<单词,1>存入表中,如果已存在此单词,则将<单词,get(单词) + 1>存入表中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值