目录
- 简单排序
- 优先队列
- 按时间排序
包 heap 为所有实现了 heap.Interface 的类型提供堆操作。 一个堆即是一棵树, 这棵树的每个节点的值都比它的子节点的值要小, 而整棵树最小的值位于树根(root), 也即是索引 0 的位置上。
包 heap 采样接口的形式来满足不同的类型的比较。
type Interface interface { sort.Interface Push(x any) // add x as element Len() Pop() any // remove and return element Len() - 1. } // sort.Interface type Interface interface { Len() int Less(i, j int) bool Swap(i, j int) }
因此,你要比较的对编程客栈象要先实现heap.Interface
简单排序
type myHeap []int func (h *myHeap) Less(i, j int) bool { return (*h)[i] < (*h)[j] } func (h *myHeap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[j], (*h)[i] } func (h *myHeap) Len() int { return len(*h) } // 把最后一个弹出,因为最小的值已经被换到了最后 func (h *myHeap) Pop() (v any) { *h, v = (*h)[:h.Len()-1], (*h)[h.Len()-1] return } func (h *myHeap) Push(v any) { *h = append(*h, v.(int)) } // 从小到大排序 func HeapSort(data []int) []int { hp := &myHeap{} for _, v := range data { heap.Push(hp, v) } heap.Init(hp) res := make([]int, hp.Len()) for i := 0; hp.Len() > 0; i++ { res[i] = heap.Pop(hp).(int) } return res } // data = 6, 0, 1, 7, 9, 4, 3, 8, 2, 5 // hp 中存储的是 0, 2, 1, 6, 5, 4, 3, 8, 7, 9
优先队列
使用一个 priority 字段来表示优先级大小,使用 index 字段来表示索引。
type Item struct { value string priority int index int } type PriorityQueue []*Item func (pq PriorityQueue) Len() int { return len(pq) } func (pq PriorityQueue) Less(i, j int) bool { return pq[i].priority > pq[j].priority } func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] pq[i].index = i pq[j].index = j } func (pq *PriorityQueue) Push(x any) { n := len(*pq) 编程item := x.(*Item) item.index = n *pq = append(*pq, item) } func (pq *PriorityQueue) Pop() any { old := *pq n := len(old) item := old[n-1] old[n-1] = nil // avoid memory leak item.index = -1 // for safety *pq = old[0 : n-1] return item } func (pq *PriorityQueue) update(item *Item, value string, priority int) { item.value = value item.priority = priority heap.Fix(pq, item.index) } func PriorityQueueTest() { items := map[string]int{ "banana": 3, "apple": 2, "pear": 4, } pq := make(PriorityQueue, len(items)) i := 0 for value, priority := range items { pq[i] = &Item{ value: value, priojsrity: priority, index: i, } i++ } heap.Init(&pq) item := &Item{ value: "orange", priority: 1, } heap.Push(&pq, item) pq.update(item, item.value, 5) for pq.Len() > 0 { item := heap.Pop(&pq).(*Item) fmt.Printf("%.2d:%s ", item.priority, item.value) } }
按时间排序
type TimeSortedQueueItem struct { Time int64 Value interface{} } type TimeSortedQ编程客栈ueue []*TimeSortedQueueItem func (q TimeSortedQueue) Len() int { return len(q) } func (q TimeSortedQueue) Less(i, j int) bool { return q[i].Time < q[j].Time } func (q TimeSortedQueue) Swap(i, j int) { q[i], q[j] = q[j], q[i] } func (q *TimeSortedQueue) Push(v interface{}) { *q = append(*q, v.(*TimeSortedQueueItem)) } func (q *TimeSortedQueue) Pop() interface{} { n := len(*q) item := (*q)[n-1] *q = (*q)[0 : n-1] return item } func NewTimeSortedQueue(items ...*TimeSortedQueueItem) *TimeSortedQueue { q := make(TimeSortedQueue, len(items)) for i, item := range items { q[i] = item } heap.Init(&q) return &q } func (q *TimeSortedQueue) PushItem(time int64, value interface{}) { heap.Push(q, &TimeSortedQueueItem{ Time: time, Value: value, }) } func (q *TimeSortedQueue) PopItem() interface{} { if q.Len() == 0 { return nil } return heap.Pop(q).(*TimeSortedQueueItem).Value }
到此这篇关于golang中的cont编程客栈ainer/heap包使用的文章就介绍到这了,更多相关golang container/heap包内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论