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