哈希表(Hashtable)效率和Java实现

刷Leetcode的时候会发现有时候巧妙的运用一下HashMap或者HashSet可以让同样逻辑的代码变得干净很多。但是我经常会想,HashTable虽然可以让代码变得干净,但是真的可以提高代码效率吗?例如我们最经常用的containsKey()这个方法,用这个方法有时候可以让你省去一个循环,但是它的时间复杂度真的优于循环的O(n)吗?如果真的优于O(n), 那key和value之间的mapping又是怎么实现的呢。本文即是作者抱着这个疑惑对该问题进行探究的一个总结。

Hash table是什么?

解决问题,先从概括性的概念寻找深入细节的线索,根据Wiki对Hash table的定义:

In computing, a hash table (hash map) is a data structure that implements an associative array abstract data type, a structure that can map keys to values. A hash table uses a hash function to compute an index into an array of buckets or slots, from which the desired value can be found.

In a well-dimensioned hash table, the average cost (number of instructions) for each lookup is independent of the number of elements stored in the table. Many hash table designs also allow arbitrary insertions and deletions of key-value pairs, at (amortized) constant average cost per operation.

根据上述定义,我们提炼出三点线索:

  • Hash table的数据结构似乎和数组有些关系。而这也说得通,因为数组也是key-value结构,只不过数组的key的类型并不像Hashtable那样可以用Object,而必须是连续的整型.
  • 可以看出对HashTable内元素的增删查的平均时间复杂度确实可以达到O(1)。
  • 实现这个key-value mapping的方式应该就是定义中提到的Hash function.

Hash table的结构

事实上,hash table确实是在数组的基础上建立的。二者的区别只是key的类型接受度不同,数组的key(或者说index)只能是连续的整型, 比如0, 1, 2, etc,但Hash table的key可以是任何Object. 而事实上,在hash table中定位key-value对位置的值也是整型, 只不过是将key经过一系列计算后得到的整型。将key从一个Object转变成一个整型index的过程,也就是上文提到的Hash function. 将在下文中探究。
既然是基于数组的,那么看来Hash table的增删查的时间复杂度是达到O(1)的。但是java.util.Map中提供的containsKey()和containsValue()方法时间复杂度也能达到O(1)吗?继续探究…

containsKey(Object k)和containsValue(Object v)的时间复杂度

想知道时间复杂度,需要读一下Java的HashMap对containsKey()方法是怎么实现的:

public boolean containsKey(Object key) {
   
    return getEntry(key) != null;
}

/**
* Returns the entry associated with the specified key in the
* Hash
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值