2013年4月23日 腾讯一面之STL中的map实现机制

来源:互联网 发布:淘宝开店怎么上架 编辑:程序博客网 时间:2024/06/08 02:36

在腾讯一面中,面试官问了关于map的实现机制,当时回答的不好,回来后看了看书做个总结。

map的本质就是数据结构中的搜索;对于搜索一般有两种方法可以实现:hash和树。

一、红黑树

STL 中的map是以红黑树作为底层机制来实现的。

下面我们一步一步来看,为什么STL用的是红黑树。

1. 二叉搜索树。在树里面最基本的首先想到的就是二叉搜索树。

2. 平衡二叉搜索树。但是在二叉搜索树中有个缺点就是最差情况下,搜索时间是O(n),这样可不是我们想要的,要想做到时间复杂度变为O(nlogn),那么就想到了平衡二叉搜索树。

3. 2-3-4树。平衡二叉搜索树虽然能在O(nlogn)时间内实现搜索,但是最差情况下时间复杂度确实O(n)。这个问题的解决方案有三种:随机化、平摊和优化。随机化BST就是按照随机次序插入数据;伸展BST就是使用平摊的方法,在每次根插入元素的时候,通过旋转使得树变得平衡;2-3-4树就是通过使得树节点能容纳一个以上的关键字,更明确的说就是能容纳1个关键字、2个关键字和3个关键字,即2节点、3节点和4节点,一棵平衡2-3-4树是一棵2-3-4树,其中所有指向空树的链接到树根的距离都相同。

4. 红黑树。随机BST可以满足时间复杂度为O(nlogn),但是随机插入的特性似乎不满足我们进行插入的要求,我们平时的插入操作可能是非随机性的;伸展BST使用平摊法,把时间消耗在每次插入上面,使得进行搜索的时候时间复杂度变为O(nlogn),但是每次插入时进行平衡旋转似乎也很耗费时间;我们沿着2-3-4树的思路往下走,2-3-4树是通过树节点数目的灵活性来减少插入时平衡旋转的次数的,但是有个致命的缺点就是我们需要维护三种不同类型的节点(2-节点、3-节点、4-节点),如何把三种不同的节点变换成二节点哪?大笑看下图一目了然:



二、hash table

hash_map是以hash table作为底层机制来实现的。

hash table的优点是在O(1)时间能搜索到想要的内容;缺点就是冲突(碰撞collision)。解决冲突一般有3种方法:线性探测、二次探测、链表等方法。

(待续)

原创粉丝点击