1

如何在 Google Go 中编写可重用优先级队列的代码,或者每次需要优先级队列实现时定义Less Pushand函数?Pop

4

4 回答 4

3

后一种情况是必须要做的。至于 Go 没有泛型,它是目前唯一可用的选项。

于 2012-12-06T17:10:16.003 回答
1

还没有尝试过,但是如果您的案例恰好符合某些限制条件,也许您可​​以使用反射和结构标签。您将要求您的可堆类型是一个结构,在您用于排序的字段上带有类似 `pq:"Key"` 的标签,并且该字段类型是 < 可比较的。它远没有 Less 方法强大,但它可能满足您的需求。

抱歉,我没有适合您的示例代码。我不认为这会非常困难,但我需要一些时间。离开去锻炼。

如果我需要处理任意结构并且我可以忍受简单的密钥限制,我可能会尝试这种技术。但是,对于有限的类型集,我不会这样做。我只是按照书来做,为每种类型分别实现 heap.Interface 。它真的没有那么多工作,也没有那么多代码行。

于 2012-12-06T22:34:08.150 回答
0

标准库的模块中曾经有向量类型,container/vector它们实现了这些方法,基于可调整大小的切片,并且完美地用作与heap模块一起使用的容器。不幸的是,他们摆脱了vector,我从来不理解它,因为它在切片变量上实现了一个很好的方法级抽象。所以现在,每当我看到有人在 Go 中使用 heap 模块时,他们基本上都必须根据切片变量重新实现部分内容vector——编写Push, Pop,等。Length

于 2012-12-06T20:07:05.317 回答
0

我不确定我是否理解这个问题。

我在这里使用 interface{} 作为存储类型实现了一个队列(以及堆栈和环):

https://github.com/iNamik/go_container

使用 interface{} 允许您存储您想要的任何类型 - 尽管它不能帮助您强制执行类型 ala 泛型,但它可以完成工作。

我可以看到创建一个优先级队列没有太多麻烦。

我错过了什么吗?

如果您认为它有用,我很乐意添加一个优先队列容器。

于 2012-12-20T07:30:15.343 回答