如何在Google Go中编写可重用优先级队列的代码,或者每当需要优先级队列实现时,可以定义Less
Push
和Pop
函数?
答案 0 :(得分:3)
后一种情况是人们必须做的事情。对于Go没有泛型,它是目前唯一可用的选项。
答案 1 :(得分:1)
没有尝试过,但如果您的案例恰好适合某些限制,也许您可以使用反射和结构标记。你需要你的heapable类型是一个结构,在你用于排序的字段上有一个像'pq:“Key”的标签,那个字段类型是<可比。它远不如Less方法强大,但它可能满足您的需求。
抱歉,我没有您的示例代码。我认为这不会太难,但我需要一些时间。留下来进行锻炼。
如果我遇到需要处理任意结构的情况,我可以尝试这种技术,我可以忍受简单的密钥限制。但是对于一组有限的类型,我不会这样做。我只是按照本书的说法,为每种类型分别实现heap.Interface。这真的不是那么多的工作,也不是那么多行代码。
答案 2 :(得分:0)
实现这些方法的标准库的container/vector
模块中曾经存在基于可调整大小的切片的向量类型,并且完美地用作与heap
模块一起使用的容器。不幸的是,它们摆脱了vector
,我从未理解它,因为它在切片变量上实现了一个很好的方法级抽象。所以现在,每当我看到有人在Go中使用堆模块时,他们必须基本上重新实现vector
的一部分 - 编写Push
,Pop
,Length
,等等基于切片变量。
答案 3 :(得分:0)
我不确定我理解这个问题。
我在这里使用interface {}作为存储类型实现了一个队列(以及堆栈和响铃):
https://github.com/iNamik/go_container
使用界面{}可以存储您想要的任何类型 - 虽然它不能帮助您强制执行类型,但它可以完成工作。
我可以看到创建一个没有太多麻烦的优先级队列。
我错过了什么吗?
如果您认为自己有用,我会很乐意添加优先级队列容器。