您的位置:首页 > 编程语言

浅谈hash家族中HashMap和Hash table的异同,用代码实现Leetcode中哈希表的题目

2018-02-16 23:04 696 查看
HashMap和Hash table 是开发中最经常使用到的数据结构,所以我们必须对其有深入的了解。我的水平比较低,写的都是皮毛,大佬勿喷,谢谢!

相同点:HashMap和Hash table都可以用来存储key—value数据;

不同点:1.HashMap的key和value都可以是Null,然而Hash table是不可以 的;2.HashMap是线程不安全的,所以它不需要考虑线程的问题,导致它的 存储效率较高,然而Hash table是线程不安全的,所以Hash table的存储效率较低。

为了在线程安全和存储效率之间取得平衡,于是在JDK1.5版本之后推出的线程并发库中包含了一个类ConcurrentHashMap 解决了这个问题,ConcurrentHashMap的工作原理是通过把大的Map分成N个小的Segment(类似于Hash table),可以提供相同的线程安全,实现了线程并发,效率提高了N倍,默认提高了16倍。

Leetcode中的水题:Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

我们先对数组进行排序,然后使用双指针方法或者二分查找方法,这样时间复杂度为 O(nlgn),空间复杂度为 O(1)。用 HashMap 存储数组元素和索引的映射,在访问到 nums[i] 时,判断 HashMap 中是否存在 target - nums[i] ,如果存在说明 target - nums[i] 所在的索引和 i 就是要找的两个数。该方法的时间复杂度为 O(n),空间复杂度为 O(n),和缓冲类似,使用空间来换取时间。

代码如下:

public int[] twoSum(int[] nums, int target) {

HashMap
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: