diff --git a/priority_queue/vbt.go b/priority_queue/vbt.go index c9bcd78..f250879 100644 --- a/priority_queue/vbt.go +++ b/priority_queue/vbt.go @@ -1,8 +1,9 @@ package pqueue import ( - "github.com/474420502/focus/compare" "github.com/davecgh/go-spew/spew" + + "github.com/474420502/focus/compare" ) type Node struct { @@ -100,9 +101,9 @@ func (tree *vbTree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) { if idx1^idx2 < 0 { if idx1 < 0 { - idx1 = tree.root.size + idx1 - 1 + idx1 = tree.root.size + idx1 } else { - idx2 = tree.root.size + idx2 - 1 + idx2 = tree.root.size + idx2 } } diff --git a/priority_queuekey/vbt.go b/priority_queuekey/vbt.go index 27fa641..42b3f43 100644 --- a/priority_queuekey/vbt.go +++ b/priority_queuekey/vbt.go @@ -1,8 +1,9 @@ package pqueuekey import ( - "github.com/474420502/focus/compare" "github.com/davecgh/go-spew/spew" + + "github.com/474420502/focus/compare" ) type Node struct { @@ -101,9 +102,9 @@ func (tree *vbTree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) { if idx1^idx2 < 0 { if idx1 < 0 { - idx1 = tree.root.size + idx1 - 1 + idx1 = tree.root.size + idx1 } else { - idx2 = tree.root.size + idx2 - 1 + idx2 = tree.root.size + idx2 } } diff --git a/tree/vbt/vbt.go b/tree/vbt/vbt.go index 3532cb5..29668d0 100644 --- a/tree/vbt/vbt.go +++ b/tree/vbt/vbt.go @@ -104,9 +104,9 @@ func (tree *Tree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) { / if idx1^idx2 < 0 { if idx1 < 0 { - idx1 = tree.root.size + idx1 - 1 + idx1 = tree.root.size + idx1 } else { - idx2 = tree.root.size + idx2 - 1 + idx2 = tree.root.size + idx2 } } diff --git a/tree/vbt/vbt_test.go b/tree/vbt/vbt_test.go index 65994b3..bfb4efb 100644 --- a/tree/vbt/vbt_test.go +++ b/tree/vbt/vbt_test.go @@ -5,11 +5,13 @@ import ( "encoding/gob" "io/ioutil" "log" + "sort" "testing" - "github.com/474420502/focus/compare" - + "github.com/Pallinder/go-randomdata" "github.com/davecgh/go-spew/spew" + + "github.com/474420502/focus/compare" ) func loadTestData() []int { @@ -23,6 +25,98 @@ func loadTestData() []int { return l } +func TestLargePushRemove(t *testing.T) { + for n := 0; n < 10; n++ { + tree := New(compare.Int) + var results []int + for i := 0; i < 50000; i++ { + v := randomdata.Number(0, 100000000) + tree.Put(v) + results = append(results, v) + } + if tree.Size() != 50000 { + t.Error("Szie error") + } + for i := 0; i < 49990; i++ { + tree.Remove(results[i]) + } + results = results[49990:] + if tree.Size() != 10 { + t.Error("Szie error") + } + sort.Slice(results, func(i, j int) bool { + if results[i] < results[j] { + return true + } + return false + }) + if spew.Sprint(results) != spew.Sprint(tree.Values()) { + t.Error("tree is error") + } + + for i := 0; i < 10; i++ { + v1 := results[i] + v2, ok := tree.Index(i) + if !ok { + t.Error("not ok") + } + if v1 != v2 { + t.Error("v1(", v1, ") != v2(", v2, ")??") + } + } + + tree.Clear() + if tree.String() != "AVLTree\nnil" { + t.Error("tree String is error") + } + } +} + +func TestRemoveIndex(t *testing.T) { + tree := New(compare.Int) + l := []int{7, 14, 14, 14, 16, 1, 40, 15} + for _, v := range l { + tree.Put(v) + } + + // [1 7 14 14 14 15 16 40] + var result string + result = spew.Sprint(tree.Values()) + if result != "[1 7 14 14 14 15 16 40]" { + t.Error("result = ", result, " should be [1 7 14 14 14 15 16 40]") + } + + tree.RemoveIndex(3) + result = spew.Sprint(tree.Values()) + if result != "[1 7 14 14 15 16 40]" { + t.Error("result is error") + } + + tree.RemoveIndex(-1) + result = spew.Sprint(tree.Values()) + if result != "[1 7 14 14 15 16]" { + t.Error("result is error") + } + + tree.RemoveIndex(0) + result = spew.Sprint(tree.Values()) + if result != "[7 14 14 15 16]" { + t.Error("result is error") + } + + if tree.Size() != 5 { + t.Error("size is error") + } + + for tree.Size() != 0 { + tree.RemoveIndex(0) + } + + if tree.root != nil { + t.Error("tree roor is not error") + } +} + func TestIndexRange(t *testing.T) { tree := New(compare.Int) l := []int{7, 14, 14, 14, 16, 17, 20, 30, 21, 40, 50, 3, 40, 40, 40, 15} @@ -82,6 +176,22 @@ func TestIndexRange(t *testing.T) { if result != "[40 40 40 40 50] true" { t.Error(result) } + + // [3 7 14 14 14 15 16 17 20 21 30 40 40 40 40 50] + result = spew.Sprint(tree.IndexRange(-5, 10)) // + if result != "[40 30] true" { + t.Error(result) + } + + result = spew.Sprint(tree.IndexRange(10, -5)) // + if result != "[30 40] true" { + t.Error(result) + } + + result = spew.Sprint(tree.IndexRange(-1, 8)) // + if result != "[50 40 40 40 40 30 21 20] true" { + t.Error(result) + } } func TestGetAround(t *testing.T) { diff --git a/tree/vbtkey/iterator.go b/tree/vbtkey/iterator.go index a2f5875..8444c5e 100644 --- a/tree/vbtkey/iterator.go +++ b/tree/vbtkey/iterator.go @@ -1,7 +1,7 @@ package vbtkey import ( - "github.com/474420502/focus/stack/listarraystack" + lastack "github.com/474420502/focus/stack/listarraystack" ) type Iterator struct { @@ -148,7 +148,7 @@ func (iter *Iterator) Prev() (result bool) { if iter.dir < 1 { // 非 1(next 方向定义 -1 为 prev) if iter.dir == -1 && iter.cur != nil { // 如果上次为prev方向, 则清空辅助计算的栈 iter.tstack.Clear() - iter.curPushPrevStack(iter.cur) // 把当前cur计算的逆向回朔 + iter.curPushPrevStack(iter.cur) // 把当前cur计算的回朔 iter.up = iter.getPrevUp(iter.cur) // cur 寻找下个要计算up } iter.dir = 1 diff --git a/tree/vbtkey/vbtkey.go b/tree/vbtkey/vbtkey.go index a85d699..e5b0459 100644 --- a/tree/vbtkey/vbtkey.go +++ b/tree/vbtkey/vbtkey.go @@ -105,9 +105,9 @@ func (tree *Tree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) { / if idx1^idx2 < 0 { if idx1 < 0 { - idx1 = tree.root.size + idx1 - 1 + idx1 = tree.root.size + idx1 } else { - idx2 = tree.root.size + idx2 - 1 + idx2 = tree.root.size + idx2 } } diff --git a/tree/vbtkey/vbtkey_test.go b/tree/vbtkey/vbtkey_test.go index 9b5f2af..78ffd64 100644 --- a/tree/vbtkey/vbtkey_test.go +++ b/tree/vbtkey/vbtkey_test.go @@ -5,8 +5,10 @@ import ( "encoding/gob" "io/ioutil" "log" + "sort" "testing" + "github.com/Pallinder/go-randomdata" "github.com/davecgh/go-spew/spew" "github.com/474420502/focus/compare" @@ -23,6 +25,98 @@ func loadTestData() []int { return l } +func TestLargePushRemove(t *testing.T) { + for n := 0; n < 10; n++ { + tree := New(compare.Int) + var results []int + for i := 0; i < 50000; i++ { + v := randomdata.Number(0, 100000000) + tree.Put(v, v) + results = append(results, v) + } + if tree.Size() != 50000 { + t.Error("Szie error") + } + for i := 0; i < 49990; i++ { + tree.Remove(results[i]) + } + results = results[49990:] + if tree.Size() != 10 { + t.Error("Szie error") + } + sort.Slice(results, func(i, j int) bool { + if results[i] < results[j] { + return true + } + return false + }) + if spew.Sprint(results) != spew.Sprint(tree.Values()) { + t.Error("tree is error") + } + + for i := 0; i < 10; i++ { + v1 := results[i] + v2, ok := tree.Index(i) + if !ok { + t.Error("not ok") + } + if v1 != v2 { + t.Error("v1(", v1, ") != v2(", v2, ")??") + } + } + + tree.Clear() + if tree.String() != "AVLTree\nnil" { + t.Error("tree String is error") + } + } +} + +func TestRemoveIndex(t *testing.T) { + tree := New(compare.Int) + l := []int{7, 14, 14, 14, 16, 1, 40, 15} + for _, v := range l { + tree.Put(v, v) + } + + // [1 7 14 14 14 15 16 40] + var result string + result = spew.Sprint(tree.Values()) + if result != "[1 7 14 14 14 15 16 40]" { + t.Error("result = ", result, " should be [1 7 14 14 14 15 16 40]") + } + + tree.RemoveIndex(3) + result = spew.Sprint(tree.Values()) + if result != "[1 7 14 14 15 16 40]" { + t.Error("result is error") + } + + tree.RemoveIndex(-1) + result = spew.Sprint(tree.Values()) + if result != "[1 7 14 14 15 16]" { + t.Error("result is error") + } + + tree.RemoveIndex(0) + result = spew.Sprint(tree.Values()) + if result != "[7 14 14 15 16]" { + t.Error("result is error") + } + + if tree.Size() != 5 { + t.Error("size is error") + } + + for tree.Size() != 0 { + tree.RemoveIndex(0) + } + + if tree.root != nil { + t.Error("tree roor is not error") + } +} + func TestIndexRange(t *testing.T) { tree := New(compare.Int) l := []int{7, 14, 14, 14, 16, 17, 20, 30, 21, 40, 50, 3, 40, 40, 40, 15} @@ -82,6 +176,23 @@ func TestIndexRange(t *testing.T) { if result != "[40 40 40 40 50] true" { t.Error(result) } + + // [3 7 14 14 14 15 16 17 20 21 30 40 40 40 40 50] + result = spew.Sprint(tree.IndexRange(-5, 10)) // + if result != "[40 30] true" { + t.Error(result) + } + + result = spew.Sprint(tree.IndexRange(10, -5)) // + if result != "[30 40] true" { + t.Error(result) + } + + result = spew.Sprint(tree.IndexRange(-1, 8)) // + if result != "[50 40 40 40 40 30 21 20] true" { + t.Error(result) + } + } func TestGetAround(t *testing.T) {