jpp*_*jpp 26 python dictionary python-3.x python-internals
我理解字典是在Python 3.6+中排序的插入,作为3.6中的实现细节和3.7+中的官方.
鉴于它们是有序的,似乎很奇怪,没有方法可以通过插入顺序检索字典的第i项.该唯一的解决方案可出现有O(ñ)的复杂性,无论是:
list.__getitem__.enumerate循环中的字典项,并在达到所需索引时返回值.同样,O(n)时间复杂度.由于从list具有O(1)复杂度的项目中获取项目,是否有办法通过字典实现相同的复杂性?无论是定期dict还是collections.OrderedDict工作.
如果不可能,是否存在阻止这种方法的结构性原因,或者这只是一个尚未考虑/实施的特征?
Tim*_*ers 36
因为OrderedDict它本身就是O(n)因为订单记录在链表中.
对于内置字典,有一个向量(一个连续的数组)而不是一个链表,但最后几乎是相同的东西:向量包含一些"假人",特殊的内部值表示"没有键已经存储在这里"或"一把钥匙曾经存放在这里,但不再是".这使得例如非常便宜地删除密钥(仅用虚拟值覆盖密钥).
但是,如果不添加辅助数据结构,就没有办法跳过假人,而不是一次一个地跳过它们.因为Python使用一种开放式寻址方式来进行冲突解决,并且将负载因子保持在2/3以下,所以至少三分之一的向量条目是虚拟对象. the_vector[i]可以及时访问O(1),但实际上与第i个非虚拟条目没有可预测的关系.
| 归档时间: |
|
| 查看次数: |
2567 次 |
| 最近记录: |