Algorithm 使用双链表堆
假设您希望使用双链接列表实现最大堆。可以 与标准数组实现相比,使用双链表可以实现与Insert、ExtractMaxHeap和MaxHeapify操作相同的复杂性 我的答案是,我们可以使用数组在log(n)时间内完成所有三个操作 实施但是,对于双链表 插入-lognAlgorithm 使用双链表堆,algorithm,heap,Algorithm,Heap,假设您希望使用双链接列表实现最大堆。可以 与标准数组实现相比,使用双链表可以实现与Insert、ExtractMaxHeap和MaxHeapify操作相同的复杂性 我的答案是,我们可以使用数组在log(n)时间内完成所有三个操作 实施但是,对于双链表 插入-lognExtractMaxHeap-o(1)MaxHeapify- o(logn) 如果元素完全存储在链表中,没有其他结构,则为否。如果元素已排序,则插入将为O(n)。如果不是,则提取将是O(n)。在标准数组实现中,可以在恒定时间内找到元素
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操作的时间复杂性取决于您考虑的特定实现。如果您有一个特定的算法,您已经实现并且工作正常,但是不确定它的时间复杂度,那么您应该问一个关于它的新问题。