iter 完成修复

This commit is contained in:
eson 2019-04-06 02:24:35 +08:00
parent 2f472ffded
commit 65621872f8
4 changed files with 28 additions and 21 deletions

View File

@ -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
}

View File

@ -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)

View File

@ -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)

View File

@ -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)