几乎所有语言都会内置哈希表这一数据结构,其实就是一个哈希函数,配合数组和链表实现,会存在数组的重新动态分配的过程。[reference]

哈希表一般会被实现成两种形式,即所谓的Map和Set,基本上可以认为Set是只利用了Key值信息的Map,例如Java的HashSet就是基于HashMap实现的。

提到哈希表可能会有一些比较绕的序问题,各个语言还都有自己的特色。

先区分一下有序、无序以及排序:有序、无序是指插入元素时,保持插入的顺序性,也就是先插入的元素优先放入集合的前面部分(view it or iterate through it)。 而排序是指插入元素后,集合中的元素是否自动排序。(例如升序排序)。

1、先说Python:

在py 3.6以前,dict是无序的,想要有序的dict可以from collections import OrderedDict(内部维护了一个双向链表)。

但是在3.6(含)及以后的版本中,From Python 3.6 onwards, the standard dict type maintains insertion order by default。

依旧有一些理由来使用OrderedDict:

 

那么dict有序是怎么实现的呢,参考 stackoverflow

 Python中似乎没有所谓自动排序的集合,这种集合底层都是基于树来实现的。

在py 3.6以前,dict的无序性质保证了不能依赖dict的顺序,尽管遍历输出时它也遵循某种顺序,但这个顺序是不可靠的,至少有两个因素会影响到:新插入的元素;散列表扩容。

2、Java就很简单了:

HashMap、HashSet之类的都是无序的。

加了Linked之后都是有序的,如LinkedHashMap。

以Tree打头的,如TreeMap,TreeSet都是排序的。

3、C++就比较原始了:

毕竟从C++ 11才开始引入unordered_map。

原来的STL中的map是基于红黑树实现的,所以会有排序性质,查找的复杂度是O(log N)。

unordered_map自然是基于散列表来实现的,无序。

至于有序这回事(即维护元素插入顺序),C++貌似还没考虑到。hhh

 

posted on 2019-09-29 16:04  MicN  阅读(407)  评论(0编辑  收藏  举报