go go go中可重用的优先级队列实现

时间:2012-12-06 17:08:25

标签: algorithm go priority-queue reusability

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

没有尝试过,但如果您的案例恰好适合某些限制,也许您可​​以使用反射和结构标记。你需要你的heapable类型是一个结构,在你用于排序的字段上有一个像'pq:“Key”的标签,那个字段类型是<可比。它远不如Less方法强大,但它可能满足您的需求。

抱歉,我没有您的示例代码。我认为这不会太难,但我需要一些时间。留下来进行锻炼。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

https://github.com/iNamik/go_container

使用界面{}可以存储您想要的任何类型 - 虽然它不能帮助您强制执行类型,但它可以完成工作。

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

我错过了什么吗?

如果您认为自己有用,我会很乐意添加优先级队列容器。