博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang 标准库 container/ring 及 container/heap
阅读量:5967 次
发布时间:2019-06-19

本文共 1452 字,大约阅读时间需要 4 分钟。

hot3.png

由于目前golang 没有提供泛型机制,所以通用容器实现基本和 c 类似,golang 用 interface{} 做转接, c 用 void * 转接。

ring 包实现循环双向链表:

type Ring struct   {       next, prev *Ring    		   Value      interface{} 	}

内部导出一个用户可以操作的Value 字段。

heap 包实现 binary heap :

type Interface interface {             sort.Interface     Push(x interface{}) // add x as element Len()     Pop() interface{}   // remove and return element Len() - 1.}

heap.Interface 内嵌 sort.Interface, 提供了接口组合的好例子,只要客户的数据类型实现这五个方法,即可插入binary heap  中,进行相关操作(排序,优先队列等)。

package mainimport (	"container/heap"	"container/ring"	"fmt")func josephus(n, m int) []int {	var res []int	ring := ring.New(n)	ring.Value = 1	for i, p := 2, ring.Next(); p != ring; i, p = i+1, p.Next() {		p.Value = i	}	h := ring.Prev()	for h != h.Next() {		for i := 1; i < m; i++ {			h = h.Next()		}		res = append(res, h.Unlink(1).Value.(int))	}	res = append(res, h.Value.(int))	return res}type intHeap []intfunc (h intHeap) Len() int           { return len(h) }func (h intHeap) Less(i, j int) bool { return h[i] < h[j] }func (h intHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }func (h *intHeap) Push(x interface{}) {	*h = append(*h, x.(int))}func (h *intHeap) Pop() interface{} {	old := *h	n := len(old)	x := old[n-1]	*h = old[0 : n-1]	return x}func main() {	fmt.Println(josephus(9, 5))	h := &intHeap{10, 3, 9, 7, 2, 88, 31, 67}	heap.Init(h)	heap.Push(h, 1)	for h.Len() > 0 {		fmt.Printf("%d ", heap.Pop(h))	}}

转载于:https://my.oschina.net/evilunix/blog/388379

你可能感兴趣的文章
java.lang.UnsupportedClassVersionError
查看>>
centos 5.4 nfs服务器搭建
查看>>
jquery获取父级元素和子级元素
查看>>
Delphi 调用Domino Lotus OA
查看>>
定时压缩log日志文件
查看>>
[yum]Another app is currently holding the yum lock
查看>>
远端仓库初始化成裸仓库 git init --bare
查看>>
php自动生产静态页
查看>>
DataUml Design 介绍11 - DataUML 1.5版本功能-支持无Oracle客户端
查看>>
我的友情链接
查看>>
你一个人能独处多久
查看>>
Octopress使用中经验总结
查看>>
手工释放linux内存——/proc/sys/vm/drop_caches
查看>>
在O(1)的时间删除链表结点
查看>>
spring结合ehcache-spring-annotations配置缓存
查看>>
一个简单的数据库工具类
查看>>
我的友情链接
查看>>
理解 Glance - 每天5分钟玩转 OpenStack(20)
查看>>
Unshelve Instance 操作详解 - 每天5分钟玩转 OpenStack(39)
查看>>
init.d文件夹 2012-02-09
查看>>