0 前言
C++中的map和set都是使用红黑树来实现的,是一个排序的结构,插入,查找和删除都可以在logn的时间复杂度完成。另外C++中还提供了unordermap和unorderset数据结构,这两个数据结构是使用哈希表实现的,是没有排序,插入、查找和删除都可以在O(1)的时间复杂度内完成。
除了C++,Python也是我常用的一门编程语言,python提供了dict来存储键值对,相当于c++中的map,也提供了set数据结构,set中的元素是不可重复。Python的便利性,往往会让人忽略他的原理实现,我们这里来看一下pythondict和set的底层实现
1 原理
dict是用来存储键值对结构的数据的,set其实也是存储的键值对,只是默认键和值是相同的。Python中的dict和set都是通过散列表来实现的。下面来看与dict相关的几个比较重要的问题:
- dict中的数据是无序存放的
- 操作的时间复杂度,插入、查找和删除都可以在O(1)的时间复杂度
- 键的限制,只有可哈希的对象才能作为字典的键和set的值。可hash的对象即python中的不可变对象和自定义的对象。可变对象(列表、字典、集合)是不能作为字典的键和st的值的。
- 与list相比:list的查找和删除的时间复杂度是O(n),添加的时间复杂度是O(1)。但是dict使用hashtable内存的开销更大。为了保证较少的冲突,hashtable的装载因子,一般要小于0.75,在python中当装载因子达到2/3的时候就会自动进行扩容。
参考文章: