Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用双链表堆_Algorithm_Heap - Fatal编程技术网

Algorithm 使用双链表堆

Algorithm 使用双链表堆,algorithm,heap,Algorithm,Heap,假设您希望使用双链接列表实现最大堆。可以 与标准数组实现相比,使用双链表可以实现与Insert、ExtractMaxHeap和MaxHeapify操作相同的复杂性 我的答案是,我们可以使用数组在log(n)时间内完成所有三个操作 实施但是,对于双链表 插入-lognExtractMaxHeap-o(1)MaxHeapify- o(logn) 如果元素完全存储在链表中,没有其他结构,则为否。如果元素已排序,则插入将为O(n)。如果不是,则提取将是O(n)。在标准数组实现中,可以在恒定时间内找到元素

假设您希望使用双链接列表实现最大堆。可以 与标准数组实现相比,使用双链表可以实现与Insert、ExtractMaxHeap和MaxHeapify操作相同的复杂性

我的答案是,我们可以使用数组在log(n)时间内完成所有三个操作 实施但是,对于双链表

插入-logn
ExtractMaxHeap-o(1)
MaxHeapify- o(logn)


如果元素完全存储在链表中,没有其他结构,则为否。如果元素已排序,则插入将为O(n)。如果不是,则提取将是O(n)。

在标准数组实现中,可以在恒定时间内找到元素的子元素。如果当前节点由索引i标识,则左侧子节点由索引2i+1标识,右侧子节点由索引2i+2*标识

*在有k个孩子的堆中,这将是ki+1,ki+2,…,ki+k。原理是一样的

给定双链表中的一个节点,无法在固定时间内到达第一个子节点。节点在列表中越深,它将采取越多的步骤——遍历链表的链——到达包含子节点的子链

在阵列实现中,您不需要访问位于节点及其子节点之间的元素。对子级的访问(通过索引)是即时的。这在链表中是不正确的。除了先访问下一个节点,然后访问下一个节点,…等等,您别无选择。直到到达子节点所在的“索引”。该链的长度(向子节点移动)随节点的深度呈指数增长

当您需要查找节点的父节点时,也会出现类似的低效情况


由于堆上的所有基本操作都涉及将子值与父值交换,因此,在双链表实现中,这些操作的时间复杂度比在数组实现中要差。

请您详细解释一下bot,您是怎么说的好吗?(@abdul:bot从bucket中一点也不知道。)欢迎来到stackoverflow@SE。你能不能描述一下
Insert
的实现,它让你声称运行时的增长速度和log(n)一样快?你在这里假设一个二进制堆。“还有其他堆呢!”斯奈夫特尔,没错。但原理是一样的。在我的回答中添加了一个关于k元堆的数组实现的脚注。@abdul操作的时间复杂性取决于您考虑的特定实现。如果您有一个特定的算法,您已经实现并且工作正常,但是不确定它的时间复杂度,那么您应该问一个关于它的新问题。