GoLLRB很棒,没有理由你应该切换。我们认为 特雷普斯背后的想法是我们问题的优雅解决方案,所以我们 实施了它。我们喜欢GoLLRB提供的界面,所以我们 在我们的实施中模仿它。
我们添加到treap包中的一件事是允许你迭代 使用重叠功能,这样你就可以获得[3,9]中的所有键 例。我们经常使用它,通常以结构为关键。
帕特里克
我正在使用以下代码,并且不知道如何继续:
package main
import(
"reflect"
"fmt"
"github.com/stathat/treap"
)
func IntLess(p, q interface{}) bool {
return p.(int) < q.(int)
}
func BucketOverlap(a, b interface{}) bool {
return false
}
func main() {
tree := treap.NewOverlapTree(IntLess, BucketOverlap)
tree.Insert(5, "a")
tree.Insert(7, "b")
tree.Insert(2, "c")
tree.Insert(1, "d")
for v := range tree.IterateOverlap([]int{2,5}) {
fmt.Printf("val: %v\n", v)
}
}
假设我想获取范围[2,5]
=&gt;范围内的密钥[c,a]
答案 0 :(得分:1)
我开始的第一个地方是stathat treap代码的测试: https://github.com/stathat/treap/blob/master/treap_test.go#L164
看起来你正在做的是尝试在预期单个密钥时传递一些密钥。您还尝试对标量值(即int)执行向量运算(即范围重叠)。
也许我误解了重叠点,但我的理解是它的用途是作为间隔树:
key1 := []int{1, 3}
key2 := []int{2, 4}
key3 := []int{5, 6}
这些是间隔(低和高)。 key1与key2重叠,反之亦然。没有重叠key3。在这种情况下,重叠将是有用的(即IterateOverlap([]int{2,3})
将给我key1和key2,而IterateOverlap([]int{3,5})
将返回所有)。
我不确定你是如何迭代这些条目的。也许这个:
for i := 2; i <= 5; i++ {
fmt.Printf("val: %v\n", tree.Get(i))
}
同样,我没有使用过这个实现,所以请原谅我,如果我正在咆哮错误的树。
答案 1 :(得分:0)
我找到了使用GoLLRB的解决方案:
package main
import (
"fmt"
"github.com/petar/GoLLRB/llrb"
)
type Item struct {
key int
value string
}
func lessInt(a, b interface{}) bool {
aa := a.(*Item)
bb := b.(*Item)
return aa.key < bb.key
}
func main() {
tree := llrb.New(lessInt)
tree.ReplaceOrInsert(&Item{5, "a"})
tree.ReplaceOrInsert(&Item{7, "b"})
tree.ReplaceOrInsert(&Item{2, "c"})
tree.ReplaceOrInsert(&Item{1, "d"})
//tree.DeleteMin()
c := tree.IterRangeInclusive(&Item{key: 2}, &Item{key: 5})
for item := <-c; item != nil; item = <-c {
i := item.(*Item)
fmt.Printf("%s\n", i.value)
}
}
我仍然想知道这是否也可以使用stathat的treap。