成功 旋转3
This commit is contained in:
@@ -24,6 +24,18 @@ func NewIterator(n *Node) *Iterator {
|
||||
return iter
|
||||
}
|
||||
|
||||
func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||
iter := &Iterator{tstack: lastack.NewWithCap(cap)}
|
||||
iter.up = n
|
||||
return iter
|
||||
}
|
||||
|
||||
func (iter *Iterator) SetNode(n *Node) {
|
||||
iter.up = n
|
||||
iter.dir = 0
|
||||
iter.tstack.Clear()
|
||||
}
|
||||
|
||||
func (iter *Iterator) Value() interface{} {
|
||||
return iter.cur.value
|
||||
}
|
||||
@@ -46,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)
|
||||
|
||||
@@ -103,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)
|
||||
|
||||
|
||||
51
vbt/vbt.go
51
vbt/vbt.go
@@ -27,10 +27,12 @@ func (n *Node) String() string {
|
||||
type Tree struct {
|
||||
root *Node
|
||||
Compare compare.Compare
|
||||
|
||||
iter *Iterator
|
||||
}
|
||||
|
||||
func New(Compare compare.Compare) *Tree {
|
||||
return &Tree{Compare: Compare}
|
||||
return &Tree{Compare: Compare, iter: NewIteratorWithCap(nil, 16)}
|
||||
}
|
||||
|
||||
func (tree *Tree) String() string {
|
||||
@@ -263,7 +265,9 @@ func (tree *Tree) GetRange(k1, k2 interface{}) (result []interface{}) {
|
||||
|
||||
result = make([]interface{}, 0, 16)
|
||||
|
||||
iter := NewIterator(min)
|
||||
// iter := NewIterator(min)
|
||||
tree.iter.SetNode(min)
|
||||
iter := tree.iter
|
||||
for iter.Next() {
|
||||
result = append(result, iter.Value())
|
||||
if iter.cur == max {
|
||||
@@ -288,7 +292,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 {
|
||||
@@ -338,7 +344,9 @@ func (tree *Tree) getArountNode(key interface{}) (result [3]*Node) {
|
||||
n = n.children[1]
|
||||
lastc = c
|
||||
case 0:
|
||||
iter := NewIterator(n)
|
||||
// iter := NewIterator(n)
|
||||
tree.iter.SetNode(n)
|
||||
iter := tree.iter
|
||||
iter.Prev()
|
||||
for iter.Prev() {
|
||||
if tree.Compare(iter.cur.value, n.value) == 0 {
|
||||
@@ -359,21 +367,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:
|
||||
@@ -381,8 +389,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
|
||||
}
|
||||
@@ -396,7 +404,10 @@ func (tree *Tree) GetNode(value interface{}) (*Node, bool) {
|
||||
case 1:
|
||||
n = n.children[1]
|
||||
case 0:
|
||||
iter := NewIterator(n)
|
||||
// iter := NewIterator(n)
|
||||
|
||||
tree.iter.SetNode(n)
|
||||
iter := tree.iter
|
||||
iter.Prev()
|
||||
for iter.Prev() {
|
||||
if tree.Compare(iter.cur.value, n.value) == 0 {
|
||||
@@ -615,16 +626,14 @@ func (tree *Tree) lrrotate3(cur *Node) {
|
||||
const l = 1
|
||||
const r = 0
|
||||
|
||||
movparent := cur.children[l]
|
||||
mov := movparent.children[r]
|
||||
mov := cur.children[l].children[r]
|
||||
|
||||
mov.value, cur.value = cur.value, mov.value //交换值达到, 相对位移
|
||||
|
||||
cur.children[r] = mov
|
||||
mov.parent = cur
|
||||
|
||||
cur.children[l] = movparent
|
||||
movparent.children[r] = nil
|
||||
cur.children[l].children[r] = nil
|
||||
|
||||
cur.children[r] = mov
|
||||
mov.parent = cur
|
||||
@@ -678,16 +687,14 @@ func (tree *Tree) rlrotate3(cur *Node) {
|
||||
const l = 0
|
||||
const r = 1
|
||||
|
||||
movparent := cur.children[l]
|
||||
mov := movparent.children[r]
|
||||
mov := cur.children[l].children[r]
|
||||
|
||||
mov.value, cur.value = cur.value, mov.value //交换值达到, 相对位移
|
||||
|
||||
cur.children[r] = mov
|
||||
mov.parent = cur
|
||||
|
||||
cur.children[l] = movparent
|
||||
movparent.children[r] = nil
|
||||
cur.children[l].children[r] = nil
|
||||
|
||||
cur.children[r] = mov
|
||||
mov.parent = cur
|
||||
@@ -744,7 +751,6 @@ func (tree *Tree) rrotate3(cur *Node) {
|
||||
mov.value, cur.value = cur.value, mov.value //交换值达到, 相对位移
|
||||
|
||||
cur.children[r] = mov
|
||||
mov.size = 1
|
||||
|
||||
cur.children[l] = mov.children[l]
|
||||
cur.children[l].parent = cur
|
||||
@@ -797,7 +803,6 @@ func (tree *Tree) lrotate3(cur *Node) {
|
||||
mov.value, cur.value = cur.value, mov.value //交换值达到, 相对位移
|
||||
|
||||
cur.children[r] = mov
|
||||
mov.size = 1
|
||||
|
||||
cur.children[l] = mov.children[l]
|
||||
cur.children[l].parent = cur
|
||||
|
||||
@@ -17,7 +17,7 @@ import (
|
||||
"github.com/emirpasic/gods/trees/redblacktree"
|
||||
)
|
||||
|
||||
const CompareSize = 5000
|
||||
const CompareSize = 1000000
|
||||
const NumberMax = 50000000
|
||||
|
||||
func TestSave(t *testing.T) {
|
||||
@@ -32,13 +32,13 @@ func TestSave(t *testing.T) {
|
||||
// l = append(l, v)
|
||||
// }
|
||||
|
||||
//m := make(map[int]int)
|
||||
m := make(map[int]int)
|
||||
for i := 0; len(l) < CompareSize; i++ {
|
||||
v := randomdata.Number(0, NumberMax)
|
||||
// if _, ok := m[v]; !ok {
|
||||
// m[v] = v
|
||||
l = append(l, v)
|
||||
// }
|
||||
if _, ok := m[v]; !ok {
|
||||
m[v] = v
|
||||
l = append(l, v)
|
||||
}
|
||||
}
|
||||
|
||||
var result bytes.Buffer
|
||||
|
||||
Reference in New Issue
Block a user