From 65621872f882b983e3aac37ce680fecf317052a7 Mon Sep 17 00:00:00 2001 From: eson <474420502@qq.com> Date: Sat, 6 Apr 2019 02:24:35 +0800 Subject: [PATCH] =?UTF-8?q?iter=20=E5=AE=8C=E6=88=90=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avl/avl.go | 31 ++++++++++++++++++------------- avl/avl_test.go | 4 ++-- avl/iterator.go | 11 +++++++---- avldup/avldup_test.go | 3 +-- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/avl/avl.go b/avl/avl.go index eed5d80..e67cc2f 100644 --- a/avl/avl.go +++ b/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 } diff --git a/avl/avl_test.go b/avl/avl_test.go index c939111..aee2ac0 100644 --- a/avl/avl_test.go +++ b/avl/avl_test.go @@ -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) diff --git a/avl/iterator.go b/avl/iterator.go index f979838..501ae6b 100644 --- a/avl/iterator.go +++ b/avl/iterator.go @@ -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) diff --git a/avldup/avldup_test.go b/avldup/avldup_test.go index 0f883f6..f37ee66 100644 --- a/avldup/avldup_test.go +++ b/avldup/avldup_test.go @@ -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)