python中几个常见的黑盒子之“字典dict” 与 “集合set”
2016-12-27 23:04
363 查看
这里说到“字典dict” 和 “集合set”类型,首先,先了解一下,对于python来说,标准散列机制是有hash函数提供的,对于调用一个__hash__方法:
对于这种标准散列的机制,常常用于字典类型(dict)的实现,而dict就是我们通常所说的散列表。同样,集合类型(set)也是通过这种机制进行实现的。
最重要的一点:散列值的构成基本上是在常数级时间内完成的,而且,就算其幕后数组足够长,我们用散列值对其访问的平均时间也是O(1).
这就意味着,我们在对 dict 以及set中的元素进行访问的时候,所消耗的时间都是常数级的。
注意:hash方法是特别用来构建哈希表的。对于其他比如密码的哈希,有一个标准库叫做hashlib模块
下面我们来看一个例子,对于上面内容很好的实践:
我们通过上面这个例子,可以发现:第二种方法在list之上再次构建了一个set。看起来是毫无意义的事情,但是其实这取决于实际的情况,因为:
当我们打算对上个例子中的 “L” 进行多次查询的话,第二种方法应该是值得的,因为成员的查询(不知道下标的情况下),在list中时间复杂度来说是线性的,但是在set中确实常数级的。
当我们想依次往某个集合里面添加新值的时候,并且在每一步中都检查是否这个新值添加成功的话,如果用list来处理的话,运行时间会是平方级别的,但是用集合set就可以获得线性级时间。
>>> hash(56) 56 >>> hash("I like python") -4698211515002810579
对于这种标准散列的机制,常常用于字典类型(dict)的实现,而dict就是我们通常所说的散列表。同样,集合类型(set)也是通过这种机制进行实现的。
最重要的一点:散列值的构成基本上是在常数级时间内完成的,而且,就算其幕后数组足够长,我们用散列值对其访问的平均时间也是O(1).
这就意味着,我们在对 dict 以及set中的元素进行访问的时候,所消耗的时间都是常数级的。
注意:hash方法是特别用来构建哈希表的。对于其他比如密码的哈希,有一个标准库叫做hashlib模块
下面我们来看一个例子,对于上面内容很好的实践:
>>> from random import randrange >>> L = [randrange(10000) for i in range(1000)] >>> 52 in L False >>> S = set(L) >>> 52 in L False
我们通过上面这个例子,可以发现:第二种方法在list之上再次构建了一个set。看起来是毫无意义的事情,但是其实这取决于实际的情况,因为:
当我们打算对上个例子中的 “L” 进行多次查询的话,第二种方法应该是值得的,因为成员的查询(不知道下标的情况下),在list中时间复杂度来说是线性的,但是在set中确实常数级的。
当我们想依次往某个集合里面添加新值的时候,并且在每一步中都检查是否这个新值添加成功的话,如果用list来处理的话,运行时间会是平方级别的,但是用集合set就可以获得线性级时间。
相关文章推荐
- python 学习笔记-列表
- youcomplete 添加 python 支持
- python 下载链接
- Python 学习笔记-字符串
- 第3章-1 创建ndarray 学习笔记
- 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试 推荐
- 自动化运维Python系列之消息队列RabbitMQ
- python 读取配置文件
- Python数组与矩阵操作
- Python数据分析
- 使用SublimeText 作为Python 的开发环境
- python 细节上的一些笔记
- 基础入门_Python-模块和包.深入Celery之Beat触发定时/周期性任务?
- python 获取命令行参数
- python 01
- Python多线程编程中daemon属性的作用
- python初识装饰器
- 10 种机器学习算法的要点(附 Python 和 R 代码)
- python3爬虫之入门和正则表达式
- LeetCode 477. Total Hamming Distance-python