如何在双端队列(这是一个双链表)中哈希内置节点并删除O(1)中间的节点?内置节点是否暴露?
例如,我想在dict中保存双端队列的节点,以便以后可以在固定时间内删除该节点。
这是LRU中的一个用例,使用双端队列,因此我不需要编写自己的双链表。
from collections import deque
class LRU:
def __init__(self):
self.nodes = deque()
self.key2node = {}
def insertThenDelete(self):
# insert
node = deque.Node('k', 'v') # imagine you can expose deque node here
self.nodes.appendleft(node)
self.key2node = {'k': node}
# delete
self.key2node['k'].deleteInDeque() # HERE shold remove the node in DLL!
del self.key2node['k']
我知道您可以进行del mydeque[2]
删除索引。
但我想通过引用删除key2node['k'].deleteInDeque()
。
答案 0 :(得分:0)
deque API不支持直接引用内部节点或直接删除内部节点,因此使用 collections.deque()无法实现您要执行的操作。
此外,双端队列实现是固定长度块的双向链接列表,其中对象指针数组中的一个块,因此,即使您可以获得引用,也不会有简单的方法来删除其中的一部分一块(固定长度)。
您最好的选择是从头开始创建自己的双向链接列表。请参见functools.lru_cache()的源代码,该源代码完全符合您的描述:https://github.com/python/cpython/blob/3.7/Lib/functools.py#L405
希望这会有所帮助:-)