📜  构建堆的时间复杂度(1)

📅  最后修改于: 2023-12-03 15:10:42.320000             🧑  作者: Mango

构建堆的时间复杂度

堆是一种基于完全二叉树的数据结构,分为最大堆和最小堆。在最大堆中,每个节点的值都大于或等于其父节点的值;在最小堆中,每个节点的值都小于或等于其父节点的值。构建堆的过程就是将给定的数组转换成堆的过程。

在构建堆的过程中,我们遍历整个数组,对于数组中的每个元素,都将其添加到堆中。添加元素的过程中,需要调整当前节点以满足堆的性质。这个过程称为“堆化”。

堆化的时间复杂度取决于堆的高度,也就是树的深度。最好的情况下,堆的高度为log(n),其中n是堆中的元素个数。最坏的情况下,堆的高度为n。因此,构建堆的时间复杂度是O(nlog(n))。

下面是构建最大堆的代码片段:

def heapify(arr, n, i): 
    # 初始化最大值为根节点 
    largest = i  
    # 左子节点的位置 
    l = 2 * i + 1    
    # 右子节点的位置 
    r = 2 * i + 2      
    # 如果左子节点比根节点大,那么更新最大值位置 
    if l < n and arr[i] < arr[l]: 
        largest = l 
    # 如果右子节点比根节点大,那么更新最大值位置 
    if r < n and arr[largest] < arr[r]: 
        largest = r 
    # 如果最大值位置不是根节点,则交换根节点和最大值节点 
    if largest != i: 
        arr[i],arr[largest] = arr[largest],arr[i] 
        # 递归调整交换后的最大值节点 
        heapify(arr, n, largest) 

def build_heap(arr):
    # 获取堆中元素的个数
    n = len(arr) 
    # 从最后一个非叶子节点开始向上调整 
    for i in range(n // 2 - 1, -1, -1): 
        heapify(arr, n, i) 

在这段代码中,build_heap函数调用heapify函数调整节点。heapify函数首先找到根节点、左子节点和右子节点中的最大值,然后将根节点与最大值节点交换。交换后,需要递归调用heapify函数,以确保交换后的节点满足堆的性质。在build_heap函数中,我们从最后一个非叶子节点开始,向上调整整个堆。因此,构建堆的时间复杂度是O(nlog(n))。