1 heap是什么

堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。

2 heap可以用来做什么

优先级队列、求 Top K 和求中位数

3 Go标准库中的实现

Go 标准库中 container/heap 原文地址为: https://golang.org/pkg/container/heap/

4 动手写一个大顶堆

 

package src

//"container/heap")

type BigHeap struct {
	HeapList []int
	MaxNum   int
	Count    int
}

func (h *BigHeap) Insert(data int) {
	if h.Count >= h.MaxNum {
		return
	}
	h.Count += 1
	h.HeapList[h.Count] = data
	i := h.Count
	for i/2 > 0 && h.HeapList[i] > h.HeapList[i/2] {
		h.swap(i, i/2)
		i = i / 2
	}
}

func (h *BigHeap) swap(a, b int) {
	h.HeapList[a], h.HeapList[b] = h.HeapList[b], h.HeapList[a]

}

func (h *BigHeap) RemoveMax() {
	if h.Count == 0 {
		return
	}
	h.HeapList[1] = h.HeapList[h.Count]
	h.HeapList[h.Count] = 0
	h.Count -= 1
	h.heapify(h.Count, 1)

}

func (h *BigHeap) heapify(n, i int) { // 自上往下堆化
	for {
		maxPos := i
		if i*2 <= n && h.HeapList[i] < h.HeapList[i*2] {
			maxPos = i * 2
		}
		if i*2+1 <= n && h.HeapList[maxPos] < h.HeapList[i*2+1] {
			maxPos = i*2 + 1
		}
		if maxPos == i {
			break
		}
		h.swap(i, maxPos)
		i = maxPos
	}

}

        

发表评论