请记着 map 这个数据结构

栏目: 数据库 · 发布时间: 6年前

内容简介:很多问题,都可以使用map解决,如果不能,那只能使用树了。由于 map 已经可以解决大多数问题了,所以请记住 map 这个数据结构。善于使用这个数据结构,可以帮我们节省很多代码量。

一、背景

很多问题,都可以使用map解决,如果不能,那只能使用树了。

由于 map 已经可以解决大多数问题了,所以请记住 map 这个数据结构。

善于使用这个数据结构,可以帮我们节省很多代码量。

PS:最近几天事情比较多,一直在思考工作上自己做的项目该如何优化,文章就被落下了。

不过,现在工作上的事情已经思考的差不多了,后面文章应该正常写吧。

二、集合 set

一种特殊的 map 叫做 set,即所谓的集合。

对于集合,只需要关注一个数据是否存在,而不需要其对应的其他信息,如计数或者关联的值。

通过集合这个数据结构,你可以解决重复数据相关的问题。

比如判断一个数组是否有重复的元素。

比如求两个数组的交集(去重)。

比如路径搜索时,一个点是否搜索过,也可以使用集合来判断。

三、映射 map

对于集合 set ,只储存了索引信息,有时候还需要对于的关联数据。

这个就需要映射 map 这个数据接口了。

这个关联数据根据不同的场景含义不一样。

比如求两个数组的交集(不去重),此时就需要map来计数了。

而对于数组中是否存在两个数之和等于指定数,也是使用map来查找。

四、哈希 hash

其实 hash 和 map 是等价的,但是理论上,hash 的速度更快,传说中时间复杂度是 O(1)

所以有很多面试题,就需要留意了。

比如问:怎么在常数复杂度内完成插入元素、删除元素、判断元素是否存在三种操作?

一般我们一想,使用 map 至少也是 log(n) 级别的,没法更快了。

而面试期望你回答的是使用 hash

五、寻找重复的子树

题意:给一个二叉树,返回所有重复子树去重后的根节点。

重复定义:二叉树有相同的结构,且值相同。

去重定义:重复的子树,只输出其中任意一个。

这道题其实需要我们将一个子树当做集合或者 map 的key值了。

map的key值需要时可以比较大小的,如何做的?

答案是序列化,将树序列化为一种唯一的个数。

这样就可以使用序列化后的字符串来代表这个树了。

请记着 map 这个数据结构

六、前K个高频元素

题意:给一个整数数组,求出现频率前 K 高的元素。

要求:要求复杂度小于 O(n log(n))

思路:看到不合理的时间复杂度,那只能使用 hash 来解决了。

通过 hash 对所有整数进行计数 O(n) ,然后再使用桶 排序 的方法按统计的数字排序 O(n)

最后,逆向遍历桶,得到答案 O(k)

请记着 map 这个数据结构

七、最后

哈希(hash)、集合(set)、映射(map)三个数据结构其实很类似。

虽然传说中,哈希的各种操作复杂度都是 O(1) 的,但是实际场景中,大家都是使用 map 的居多。

哈希一般出现在面试题里,而 map 则更实用了,所以请记住常使用 map 这个数据结构。

-EOF-


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Development Recipes

Web Development Recipes

Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00

You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具