孙汉清吧 关注:17贴子:232
  • 4回复贴,共1

【算法分享】数据结构-堆

只看楼主收藏回复

堆(Heap)是一种特别的完全二叉树,满足每个节点的值都不小于(或不大于)其子节点的值,这种性质使得堆能有效地支持一系列与优先级队列相关的操作。堆主要有两种类型:最大堆和最小堆。
最大堆:在最大堆中,任意节点的值都不小于它的子节点的值。这意味着根节点的值是堆中的最大值。这种属性使得最大堆可以用于实现优先级队列,其中优先级最高的元素(即值最大的元素)总是位于队列的前端。
最小堆:在最小堆中,任意节点的值都不大于它的子节点的值。这意味着根节点的值是堆中的最小值。最小堆常用于需要快速访问最小元素的场景,例如实现Dijkstra算法中的优先级队列。


IP属地:河南1楼2024-02-29 13:17回复
    应用
    堆在很多领域都有应用,例如:
    优先级队列:堆是实现优先级队列的理想数据结构,能够高效地支持插入和删除最值的操作。
    堆排序:通过利用堆的性质,可以实现堆排序算法,这是一种高效的排序算法,特别适合于处理大数据集。
    图算法:在图算法中,如Dijkstra和Prim算法,最小堆被用来高效地选择下一个要处理的节点。
    堆的实现通常依赖于数组结构,其中父节点和子节点之间的关系可以通过索引计算得到。例如,在数组中,给定一个节点的索引i,其左子节点的索引为2*i+1,右子节点的索引为2*i+2,父节点的索引为(i-1)/2。


    IP属地:河南2楼2024-02-29 13:17
    回复
      基本操作
      堆的基本操作包括:
      插入(Heap Insert):将新元素添加到堆中,然后调整堆以恢复其性质。这通常通过“上浮”(或“上滤”)过程实现,即新添加的元素与其父节点比较,并在必要时交换位置,直到恢复堆的性质或元素到达根节点。
      删除(Heap Delete):在最大堆中删除根节点(即最大元素),或在最小堆中删除根节点(即最小元素)。删除根节点后,通常将堆的最后一个元素移动到根节点位置,然后通过“下沉”(或“下滤”)过程调整堆,恢复其性质。
      构建(Build Heap):将一个无序数组转换成一个堆。这个过程可以通过从最后一个非叶子节点开始,对每个节点执行下沉操作,直到根节点,从而高效地构建一个堆。
      更新(Heapify):当堆中某个节点的值改变时,通过上浮或下沉操作恢复堆的性质。


      IP属地:河南3楼2024-02-29 13:18
      回复
        python实现堆排序
        其中使用flody建堆
        n,m = tuple(map(int,input().split()))
        arr = [0]+list(map(int,input().split()))
        size = n
        def down(x):
        t = x
        if x * 2 <= size and arr[x*2] < arr[t]:
        t = x * 2
        if x * 2 + 1 <= size and arr[x*2+1] < arr[t]:
        t = x*2+1
        if x != t:
        arr[x],arr[t] = arr[t],arr[x]
        down(t)
        for i in range(size//2,0,-1):
        down(i)
        for _ in range(m):
        print(arr[1],end=" ")
        arr[1],arr[size] = arr[size],arr[1]
        size -= 1
        down(1)


        IP属地:河南4楼2024-02-29 18:00
        回复
          好厉害


          IP属地:河南来自Android客户端5楼2024-03-15 10:45
          回复