【问题标题】:Complexity of deleting a key from python ordered dict从python有序字典中删除键的复杂性
【发布时间】:2019-01-18 21:41:07
【问题描述】:

在 python 中从 python dictdefaultdict 中删除一个键是 O(1) 操作,as mentioned herehere。要从OrderedDict 中删除密钥,我们可以使用del d[key] 或使用popitem() 方法,如the docs 中所述。

OrderedDict的底层实现和del操作的时间复杂度是多少?

编辑:这个答案 OrderedDict performance (compared to deque) 指的是 OrderedDictdel 的复杂度为 O(1)。但是,我们如何在实现细节层面证明它的合理性?

【问题讨论】:

  • OrderedDict performance (compared to deque) 的可能重复项。虽然问题不同,但那里的答案也回答了您的问题。
  • 已编辑以包含它的不同之处,以及我正在寻找的细节,但我找不到。
  • OrderedDict 类是在 Python 中实现的(在普通的 dict 之上),因此您可以通过go directly to the source 了解它是如何实现的。顺序由双向链表维护。任何键的链接都可以在普通字典中有效地查找。

标签: python python-3.x dictionary ordereddictionary


【解决方案1】:

Python 3.7 中OrderedDict.__delitem__implementation 如下:

def __delitem__(self, key, dict_delitem=dict.__delitem__):
    'od.__delitem__(y) <==> del od[y]'
    # Deleting an existing item uses self.__map to find the link which gets
    # removed by updating the links in the predecessor and successor nodes.
    dict_delitem(self, key)
    link = self.__map.pop(key)
    link_prev = link.prev
    link_next = link.next
    link_prev.next = link_next
    link_next.prev = link_prev
    link.prev = None
    link.next = None

这段代码做了三件事:

  • 从内部键值字典中删除一个项目。
  • 从保存链表节点的字典中删除一个节点。
  • 从双向链表中删除一项。

由于上述所有操作都需要恒定的时间,OrderedDict.__delitem__ 的复杂度也是恒定的。

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 2016-06-11
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2014-09-02
    • 2012-07-01
    相关资源
    最近更新 更多