Algorithm 从堆中删除第i个节点

Algorithm 从堆中删除第i个节点,algorithm,Algorithm,我知道从堆中删除节点是发生在根目录下的O(logn)。我还知道,在堆树中删除堆中的任意节点是一个问题,这是O(n) 是否有任何算法可以将从maxheap中删除第I个节点的运行时间减少到O(logn),其中I的范围为1到n 从堆中删除任意节点的代价不在于删除,而在于查找要删除的节点。实际上删除节点是O(logn)。但首先必须对底层数据存储进行顺序扫描,以找到节点。这是O(n)部分 加快速度的唯一方法是保留第二个数据结构,如字典或哈希映射或类似的数据结构,它可以快速告诉您项目在备份存储中的位置。然后

我知道从堆中删除节点是发生在根目录下的
O(logn)
。我还知道,在堆树中删除堆中的任意节点是一个问题,这是
O(n)


是否有任何算法可以将从maxheap中删除第I个节点的运行时间减少到
O(logn)
,其中I的范围为1到n

从堆中删除任意节点的代价不在于删除,而在于查找要删除的节点。实际上删除节点是O(logn)。但首先必须对底层数据存储进行顺序扫描,以找到节点。这是O(n)部分


加快速度的唯一方法是保留第二个数据结构,如字典或哈希映射或类似的数据结构,它可以快速告诉您项目在备份存储中的位置。然后在字典中进行O(1)查找,从字典中删除O(1),从堆中删除O(logn)。

从堆中删除任意节点的代价不在于删除,而在于找到要删除的节点。实际上删除节点是O(logn)。但首先必须对底层数据存储进行顺序扫描,以找到节点。这是O(n)部分


加快速度的唯一方法是保留第二个数据结构,如字典或哈希映射或类似的数据结构,它可以快速告诉您项目在备份存储中的位置。然后在字典中进行O(1)查找,从字典中删除O(1),从堆中删除O(logn)。

谢谢Jim。你是说如果指定了i,运行时间是O(logn)吗?最大堆数组是[1000、800、7、400、600、5、4、100、200、300、500],我想从中删除7,但无法在O(logn)中删除它…如果要从列表中删除“7”,则运行时间为O(n),因为首先必须搜索列表以查找数组中“7”的索引(2)。但是,如果您已经知道要删除的项位于数组的索引(2)处,那么删除它就是O(logn)。谢谢Jim。您的意思是,如果指定了i,则运行时间是O(logn)?最大堆数组是[1000、800、7、400、600、5、4、100、200、300、500],我想从中删除7,但无法在O(logn)中删除它…如果要从列表中删除“7”,则运行时间为O(n),因为首先必须搜索列表以查找数组中“7”的索引(2)。但是,如果您已经知道要删除的项位于数组中的索引(2)处,那么删除它就是O(logn)。