哈希表进化史(CS61B笔记)

本文探讨了二叉搜索树、2-3树和红黑树等数据结构的问题,如需要元素可比较及高复杂度。通过引入哈希表,解决了这些问题,实现了常数时间的插入和查询操作。文章详细介绍了如何将对象转化为哈希码,以及处理哈希冲突的方法,如使用链表。最后,讨论了哈希表的动态扩容和改进哈希码以降低冲突,确保高效存储和查找。
摘要由CSDN通过智能技术生成

哈希表进化史:

问题的引出:

Binary Search Tree,2-3 tree,Red-Black Tree存在的问题

  1. 要求存储的元素必须comparable,如果存储String,Integer没问题,但对有些Object来说,bigger或者smaller的问题可能无法回答或者没有意义

  2. 复杂度是 Θ ( l o g N ) \Theta(log N) Θ(logN)

如何解决这些问题?

尝试1:

我们首先尝试解决上述问题二,即复杂度较高

DataIndexedIntegerSet:

public class DataIndexedIntegerSet {
   
    private boolean[] present;

    public DataIndexedIntegerSet() {
   
        present = new boolean[2000000000];
    }

    public void add(int x) {
   
        present[x] = true;
    }

    public boolean contains(int x) {
   
        return present[x];
    }

想法很简单,构造一个足够大的数组,如果插入x,就把该数组的x位置赋值true。询问数据库中是否有x时,也只需直接查询数组的x位置是否为true

上述的插入(add)和查询(contains)操作的复杂度都是 Θ ( 1 ) \Theta(1) Θ(1)

缺点:

浪费空间,假设我只存储了x=1999999999一个整数,却需要大小为2000000000的数组

如果我们想插入的变量是String怎么办?

尝试2:

任何整数通过10的幂唯一表示(为什么是10的幂可以自行证明):

e.g., 5149 = 5 ⋅ 1 0 3 + 1 ⋅ 1 0 2 + 4 ⋅ 1 0 1 + 9 ⋅ 1 0 1 5149 = 5\cdot 10^3+1\cdot 10^2+4\cdot 10^1+9\cdot 10^1 5149=5103+

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值