哈希中的那些序问题

摘要:
几乎所有语言都会内置哈希表这一数据结构,其实就是一个哈希函数,配合数组和链表实现,会存在数组的重新动态分配的过程。提到哈希表可能会有一些比较绕的序问题,各个语言还都有自己的特色。而排序是指插入元素后,集合中的元素是否自动排序。Python中似乎没有所谓自动排序的集合,这种集合底层都是基于树来实现的。原来的STL中的map是基于红黑树实现的,所以会有排序性质,查找的复杂度是O。

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

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

哈希中的那些序问题第1张

那么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

免责声明:文章转载自《哈希中的那些序问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AVD模拟器怎么配置上网vim之补全2(完全个人定制版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Set接口HashSet实现类

java.util.Set接口 extends Collection接口 Set特点: 1、不允许有重复的元素 2、没有索引,没有带索引的方法,也不能使用普通的for遍历 java.util.HashSet集合 implements Set接口 Set接口的一个实现类 HashSet特点: 1、没有重复的元素 2、没有索引,没有带索引的方法,也不能使用普通...

【整理】hash算法原理及常见函数

简介        Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。        散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。        散列表(...

倒排表数据结构、通配符查询、拼写纠正详解

目录: Dictionary Data Structure 词典数据结构 Wild-Card Query 通配符查询 Spelling Correction 拼写纠正 搜索引擎里的dictionary data通常存储着这些信息: 索引词(term vocabulary)。 文档频率(document frequency,即这个词在多少个文档里出现)...

HashMap在并发下可能出现的问题分析

我们都知道,HashMap在并发环境下使用可能出现问题,但是具体表现,以及为什么出现并发问题,可能并不是所有人都了解,这篇文章记录一下HashMap在多线程环境下可能出现的问题以及如何避免。 在分析HashMap的并发问题前,先简单了解HashMap的put和get基本操作是如何实现的。 1.HashMap的put和get操作 大家知道HashMap内部实...

哈希表(hash)

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 (来自维基百科) 其中前边说到的离散化也是一种特殊的哈希方式,只不过离散化注重保序性,因此使用二分查找...

python 基础数据类型

python基础数据类型 一.什么是数据类型? 二.基础数据类型。 2.1数字int。 2.2布尔值bool。 2.3字符串str。 2.4元祖tuple。 2.5列表list。 2.6字典dict。 2.6集合set。 三.python基础初始总结 四.其他 一.什么是数据类型? 什么是数据类型? 我们人类可以很容易的分清数字与字符的区别,但是计算...