golang中container/heap包

栏目: Go · 发布时间: 7年前

内容简介:任何实现了 heap.Interface 接口的对象都可以使用heap包提供的方法对堆进行操作(堆是一个完成二叉树)。通过对heap.Interface 中的 Less 方法的不同实现,来实现最大堆和最小堆。通常堆的数据结构是一个一维数组。heap包提供的函数列表:1)func Init(h Interface)

任何实现了 heap.Interface 接口的对象都可以使用heap包提供的方法对堆进行操作(堆是一个完成二叉树)。通过对heap.Interface 中的 Less 方法的不同实现,来实现最大堆和最小堆。通常堆的数据结构是一个一维数组。

heap包提供的函数列表:

1)func Init(h Interface)

2)func Pop(h Interface) interface{}

3)func Push(h Interface, x interface{})

4)func Remove(h Interface, i int) interface{}

5)type Interface

现在对提供的函数进行分析:

func Init(h Interface)
参数列表:h,实现了heap.Interface接口的堆对象
功能说明:在对堆h进行操作前必须保证堆已经初始化(即符合堆结构),该方法可以在堆中元素的顺序不符合堆要求时调用,调用后堆会调整为标准的堆结构,该方法的时间复杂度为:O(n),n为堆h中元素的总个数。

前面有一个 实现了heap.Interface 接口的对象?那么实现了这个接口的对象要实现哪些内容呢?

一共需要实现5个方法,Len、Swap、Less、Pop、Push

标准库源码:
type Interface interface {
    sort.Interface
    Push(x interface{})
    Pop() interface{}
}
功能:
这是堆的接口,heap包里面的方法只是提供的一些堆算法操作,要想使用这些算法操作,就必须实现这些接口,每个接口方法都有具体的含义,堆本身的数据结构由这个接口的具体实现决定,可以是数组、列表。
接口方法:
1)sort.Interface
要实现三个接口:func Len() int,func Less(i, j int) bool,func Swap(i, j int),其中Less方法的实现决定了堆是最大堆还是最小堆。
type myHeap []int    // 定义一个堆,存储结构为数组

// 最小堆的Less方法实现
func (h *myHeap) Less(i, j int) bool {
    return (*h)[i] < (*h)[j]
}

// 最大堆的Less方法实现
func (h *myHeap) Less(i, j int) bool {
    return (*h)[i] > (*h)[j]
}

2)Push(x interface{})
参数列表:x将存到堆中的元素
功能说明:把元素x存放到切片最末尾。
type (h *myHeap) Push(v interface{}) {
    *h = append(*h, v.(int))
}

3)Pop() interface{}
返回值:移除切片末尾的那个元素
功能说明:把最后一个元素移除并将其值返回。
func (h *myHeap) Pop() (v interface{}) {
    *h, v = (*h)[:h.Len()-1], (*h)[h.Len()-1]
    return
}

编写一个应用heap包的案例:

package main

import (
    "fmt"
    "container/heap"
)

type myHeap []int

/* 实现排序 */
func (h *myHeap) Len() int {
    return len(*h)
}

func (h *myHeap) Swap(i, j int) {
    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]
}

// 最小堆实现
func (h *myHeap) Less(i, j int) bool {
    return (*h)[i] < (*h)[j]
}

/* 实现往堆中添加元素 */
func (h *myHeap)Push(v interface{}) {
    *h = append(*h, v.(int))
}

/* 实现删除堆中元素 */
func (h *myHeap)Pop() (v interface{}) {
    *h, v = (*h)[:len(*h)-1], (*h)[len(*h)-1]
    return
}

// 按层来遍历和打印堆数据,第一行只有一个元素,即堆顶元素
func (h myHeap) printHeap() {
    n := 1
    levelCount := 1
    for n <= h.Len() {
        fmt.Println(h[n-1 : n-1+levelCount])
        n += levelCount
        levelCount *= 2
    }
}

func main() {
    data := [7]int{13,12,45,23,11,9,20}
    aHeap := new(myHeap)
    for i := 0;i < len(data);i++ {
        aHeap.Push(data[i])
    }
    aHeap.printHeap()

    // 堆 排序 处理
    heap.Init(aHeap)
    aHeap.printHeap()
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Kotlin实战

Kotlin实战

【美】Dmitry Jemerov(德米特里·詹莫瑞福)、【美】 Svetlana Isakova(斯维特拉娜·伊凡诺沃) / 覃宇、罗丽、李思阳、蒋扬海 / 电子工业出版社 / 2017-8 / 89.00

《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 ......一起来看看 《Kotlin实战》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具