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