从stathat重叠treap包?

时间:2013-04-18 16:50:00

标签: go

根据此link状态使用与treap重叠:

  

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]

2 个答案:

答案 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。