iter 完成修复
This commit is contained in:
parent
2f472ffded
commit
65621872f8
31
avl/avl.go
31
avl/avl.go
|
@ -180,7 +180,9 @@ func (tree *Tree) GetRange(k1, k2 interface{}) (result []interface{}) {
|
|||
|
||||
result = make([]interface{}, 0, 16)
|
||||
|
||||
iter := NewIterator(max)
|
||||
// iter := NewIterator(max)
|
||||
tree.iter.SetNode(max)
|
||||
iter := tree.iter
|
||||
for iter.Prev() {
|
||||
result = append(result, iter.Value())
|
||||
if iter.cur == min {
|
||||
|
@ -253,21 +255,21 @@ func (tree *Tree) getArountNode(key interface{}) (result [3]*Node) {
|
|||
|
||||
if result[1] != nil {
|
||||
|
||||
result[0] = GetPrev(result[1], 1)
|
||||
result[2] = GetNext(result[1], 1)
|
||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
||||
result[2] = tree.iter.GetNext(result[1], 1)
|
||||
} else {
|
||||
result[0] = last
|
||||
result[2] = GetNext(last, 1)
|
||||
result[2] = tree.iter.GetNext(last, 1)
|
||||
}
|
||||
|
||||
case -1:
|
||||
|
||||
if result[1] != nil {
|
||||
result[0] = GetPrev(result[1], 1)
|
||||
result[2] = GetNext(result[1], 1)
|
||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
||||
result[2] = tree.iter.GetNext(result[1], 1)
|
||||
} else {
|
||||
result[2] = last
|
||||
result[0] = GetPrev(last, 1)
|
||||
result[0] = tree.iter.GetPrev(last, 1)
|
||||
}
|
||||
|
||||
case 0:
|
||||
|
@ -275,8 +277,8 @@ func (tree *Tree) getArountNode(key interface{}) (result [3]*Node) {
|
|||
if result[1] == nil {
|
||||
return
|
||||
}
|
||||
result[0] = GetPrev(result[1], 1)
|
||||
result[2] = GetNext(result[1], 1)
|
||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
||||
result[2] = tree.iter.GetNext(result[1], 1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -291,11 +293,14 @@ func (tree *Tree) GetNode(value interface{}) (*Node, bool) {
|
|||
n = n.children[1]
|
||||
case 0:
|
||||
// iter := NewIterator(n)
|
||||
|
||||
tree.iter.SetNode(n)
|
||||
tree.iter.Prev()
|
||||
for tree.iter.Prev() {
|
||||
if tree.Compare(tree.iter.cur.value, n.value) == 0 {
|
||||
n = tree.iter.cur
|
||||
|
||||
iter := tree.iter
|
||||
iter.Prev()
|
||||
for iter.Prev() {
|
||||
if tree.Compare(iter.cur.value, n.value) == 0 {
|
||||
n = iter.cur
|
||||
} else {
|
||||
break
|
||||
}
|
||||
|
|
|
@ -492,7 +492,7 @@ func BenchmarkGet(b *testing.B) {
|
|||
b.ResetTimer()
|
||||
b.StartTimer()
|
||||
|
||||
execCount := 50
|
||||
execCount := 10
|
||||
b.N = len(l) * execCount
|
||||
|
||||
for i := 0; i < execCount; i++ {
|
||||
|
@ -535,7 +535,7 @@ func BenchmarkPut(b *testing.B) {
|
|||
b.ResetTimer()
|
||||
b.StartTimer()
|
||||
|
||||
execCount := 1000
|
||||
execCount := 10
|
||||
b.N = len(l) * execCount
|
||||
for i := 0; i < execCount; i++ {
|
||||
tree := New(compare.Int)
|
||||
|
|
|
@ -32,6 +32,7 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
|||
|
||||
func (iter *Iterator) SetNode(n *Node) {
|
||||
iter.up = n
|
||||
iter.dir = 0
|
||||
iter.tstack.Clear()
|
||||
}
|
||||
|
||||
|
@ -57,9 +58,10 @@ func (iter *Iterator) Right() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func GetNext(cur *Node, idx int) *Node {
|
||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||
|
||||
iter := NewIterator(cur)
|
||||
// iter := NewIterator(cur)
|
||||
iter.SetNode(cur)
|
||||
iter.curPushNextStack(iter.up)
|
||||
iter.up = iter.getNextUp(iter.up)
|
||||
|
||||
|
@ -114,9 +116,10 @@ func (iter *Iterator) Next() (result bool) {
|
|||
|
||||
return false
|
||||
}
|
||||
func GetPrev(cur *Node, idx int) *Node {
|
||||
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
||||
|
||||
iter := NewIterator(cur)
|
||||
// iter := NewIterator(cur)
|
||||
iter.SetNode(cur)
|
||||
iter.curPushPrevStack(iter.up)
|
||||
iter.up = iter.getPrevUp(iter.up)
|
||||
|
||||
|
|
|
@ -404,9 +404,8 @@ func BenchmarkGet(b *testing.B) {
|
|||
b.ResetTimer()
|
||||
b.StartTimer()
|
||||
|
||||
execCount := 500
|
||||
execCount := 10
|
||||
b.N = len(l) * execCount
|
||||
b.Log(tree.size)
|
||||
for i := 0; i < execCount; i++ {
|
||||
for _, v := range l {
|
||||
tree.Get(v)
|
||||
|
|
Loading…
Reference in New Issue
Block a user