如何在 Google Go 中编写可重用优先级队列的代码,或者每次需要优先级队列实现时定义Less
Push
and函数?Pop
4 回答
后一种情况是必须要做的。至于 Go 没有泛型,它是目前唯一可用的选项。
还没有尝试过,但是如果您的案例恰好符合某些限制条件,也许您可以使用反射和结构标签。您将要求您的可堆类型是一个结构,在您用于排序的字段上带有类似 `pq:"Key"` 的标签,并且该字段类型是 < 可比较的。它远没有 Less 方法强大,但它可能满足您的需求。
抱歉,我没有适合您的示例代码。我不认为这会非常困难,但我需要一些时间。离开去锻炼。
如果我需要处理任意结构并且我可以忍受简单的密钥限制,我可能会尝试这种技术。但是,对于有限的类型集,我不会这样做。我只是按照书来做,为每种类型分别实现 heap.Interface 。它真的没有那么多工作,也没有那么多代码行。
标准库的模块中曾经有向量类型,container/vector
它们实现了这些方法,基于可调整大小的切片,并且完美地用作与heap
模块一起使用的容器。不幸的是,他们摆脱了vector
,我从来不理解它,因为它在切片变量上实现了一个很好的方法级抽象。所以现在,每当我看到有人在 Go 中使用 heap 模块时,他们基本上都必须根据切片变量重新实现部分内容vector
——编写Push
, Pop
,等。Length
我不确定我是否理解这个问题。
我在这里使用 interface{} 作为存储类型实现了一个队列(以及堆栈和环):
https://github.com/iNamik/go_container
使用 interface{} 允许您存储您想要的任何类型 - 尽管它不能帮助您强制执行类型 ala 泛型,但它可以完成工作。
我可以看到创建一个优先级队列没有太多麻烦。
我错过了什么吗?
如果您认为它有用,我很乐意添加一个优先队列容器。