| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ssa |
| |
| import "fmt" |
| |
| const ( |
| rankLeaf rbrank = 1 |
| rankZero rbrank = 0 |
| ) |
| |
| type rbrank int8 |
| |
| // RBTint32 is a red-black tree with data stored at internal nodes, |
| // following Tarjan, Data Structures and Network Algorithms, |
| // pp 48-52, using explicit rank instead of red and black. |
| // Deletion is not yet implemented because it is not yet needed. |
| // Extra operations glb, lub, glbEq, lubEq are provided for |
| // use in sparse lookup algorithms. |
| type RBTint32 struct { |
| root *node32 |
| // An extra-clever implementation will have special cases |
| // for small sets, but we are not extra-clever today. |
| } |
| |
| func (t *RBTint32) String() string { |
| if t.root == nil { |
| return "[]" |
| } |
| return "[" + t.root.String() + "]" |
| } |
| |
| func (t *node32) String() string { |
| s := "" |
| if t.left != nil { |
| s = t.left.String() + " " |
| } |
| s = s + fmt.Sprintf("k=%d,d=%v", t.key, t.data) |
| if t.right != nil { |
| s = s + " " + t.right.String() |
| } |
| return s |
| } |
| |
| type node32 struct { |
| // Standard conventions hold for left = smaller, right = larger |
| left, right, parent *node32 |
| data interface{} |
| key int32 |
| rank rbrank // From Tarjan pp 48-49: |
| // If x is a node with a parent, then x.rank <= x.parent.rank <= x.rank+1. |
| // If x is a node with a grandparent, then x.rank < x.parent.parent.rank. |
| // If x is an "external [null] node", then x.rank = 0 && x.parent.rank = 1. |
| // Any node with one or more null children should have rank = 1. |
| } |
| |
| // makeNode returns a new leaf node with the given key and nil data. |
| func (t *RBTint32) makeNode(key int32) *node32 { |
| return &node32{key: key, rank: rankLeaf} |
| } |
| |
| // IsEmpty reports whether t is empty. |
| func (t *RBTint32) IsEmpty() bool { |
| return t.root == nil |
| } |
| |
| // IsSingle reports whether t is a singleton (leaf). |
| func (t *RBTint32) IsSingle() bool { |
| return t.root != nil && t.root.isLeaf() |
| } |
| |
| // VisitInOrder applies f to the key and data pairs in t, |
| // with keys ordered from smallest to largest. |
| func (t *RBTint32) VisitInOrder(f func(int32, interface{})) { |
| if t.root == nil { |
| return |
| } |
| t.root.visitInOrder(f) |
| } |
| |
| func (n *node32) Data() interface{} { |
| if n == nil { |
| return nil |
| } |
| return n.data |
| } |
| |
| func (n *node32) keyAndData() (k int32, d interface{}) { |
| if n == nil { |
| k = 0 |
| d = nil |
| } else { |
| k = n.key |
| d = n.data |
| } |
| return |
| } |
| |
| func (n *node32) Rank() rbrank { |
| if n == nil { |
| return 0 |
| } |
| return n.rank |
| } |
| |
| // Find returns the data associated with key in the tree, or |
| // nil if key is not in the tree. |
| func (t *RBTint32) Find(key int32) interface{} { |
| return t.root.find(key).Data() |
| } |
| |
| // Insert adds key to the tree and associates key with data. |
| // If key was already in the tree, it updates the associated data. |
| // Insert returns the previous data associated with key, |
| // or nil if key was not present. |
| // Insert panics if data is nil. |
| func (t *RBTint32) Insert(key int32, data interface{}) interface{} { |
| if data == nil { |
| panic("Cannot insert nil data into tree") |
| } |
| n := t.root |
| var newroot *node32 |
| if n == nil { |
| n = t.makeNode(key) |
| newroot = n |
| } else { |
| newroot, n = n.insert(key, t) |
| } |
| r := n.data |
| n.data = data |
| t.root = newroot |
| return r |
| } |
| |
| // Min returns the minimum element of t and its associated data. |
| // If t is empty, then (0, nil) is returned. |
| func (t *RBTint32) Min() (k int32, d interface{}) { |
| return t.root.min().keyAndData() |
| } |
| |
| // Max returns the maximum element of t and its associated data. |
| // If t is empty, then (0, nil) is returned. |
| func (t *RBTint32) Max() (k int32, d interface{}) { |
| return t.root.max().keyAndData() |
| } |
| |
| // Glb returns the greatest-lower-bound-exclusive of x and its associated |
| // data. If x has no glb in the tree, then (0, nil) is returned. |
| func (t *RBTint32) Glb(x int32) (k int32, d interface{}) { |
| return t.root.glb(x, false).keyAndData() |
| } |
| |
| // GlbEq returns the greatest-lower-bound-inclusive of x and its associated |
| // data. If x has no glbEQ in the tree, then (0, nil) is returned. |
| func (t *RBTint32) GlbEq(x int32) (k int32, d interface{}) { |
| return t.root.glb(x, true).keyAndData() |
| } |
| |
| // Lub returns the least-upper-bound-exclusive of x and its associated |
| // data. If x has no lub in the tree, then (0, nil) is returned. |
| func (t *RBTint32) Lub(x int32) (k int32, d interface{}) { |
| return t.root.lub(x, false).keyAndData() |
| } |
| |
| // LubEq returns the least-upper-bound-inclusive of x and its associated |
| // data. If x has no lubEq in the tree, then (0, nil) is returned. |
| func (t *RBTint32) LubEq(x int32) (k int32, d interface{}) { |
| return t.root.lub(x, true).keyAndData() |
| } |
| |
| func (t *node32) isLeaf() bool { |
| return t.left == nil && t.right == nil |
| } |
| |
| func (t *node32) visitInOrder(f func(int32, interface{})) { |
| if t.left != nil { |
| t.left.visitInOrder(f) |
| } |
| f(t.key, t.data) |
| if t.right != nil { |
| t.right.visitInOrder(f) |
| } |
| } |
| |
| func (t *node32) maxChildRank() rbrank { |
| if t.left == nil { |
| if t.right == nil { |
| return rankZero |
| } |
| return t.right.rank |
| } |
| if t.right == nil { |
| return t.left.rank |
| } |
| if t.right.rank > t.left.rank { |
| return t.right.rank |
| } |
| return t.left.rank |
| } |
| |
| func (t *node32) minChildRank() rbrank { |
| if t.left == nil || t.right == nil { |
| return rankZero |
| } |
| if t.right.rank < t.left.rank { |
| return t.right.rank |
| } |
| return t.left.rank |
| } |
| |
| func (t *node32) find(key int32) *node32 { |
| for t != nil { |
| if key < t.key { |
| t = t.left |
| } else if key > t.key { |
| t = t.right |
| } else { |
| return t |
| } |
| } |
| return nil |
| } |
| |
| func (t *node32) min() *node32 { |
| if t == nil { |
| return t |
| } |
| for t.left != nil { |
| t = t.left |
| } |
| return t |
| } |
| |
| func (t *node32) max() *node32 { |
| if t == nil { |
| return t |
| } |
| for t.right != nil { |
| t = t.right |
| } |
| return t |
| } |
| |
| func (t *node32) glb(key int32, allow_eq bool) *node32 { |
| var best *node32 |
| for t != nil { |
| if key <= t.key { |
| if key == t.key && allow_eq { |
| return t |
| } |
| // t is too big, glb is to left. |
| t = t.left |
| } else { |
| // t is a lower bound, record it and seek a better one. |
| best = t |
| t = t.right |
| } |
| } |
| return best |
| } |
| |
| func (t *node32) lub(key int32, allow_eq bool) *node32 { |
| var best *node32 |
| for t != nil { |
| if key >= t.key { |
| if key == t.key && allow_eq { |
| return t |
| } |
| // t is too small, lub is to right. |
| t = t.right |
| } else { |
| // t is a upper bound, record it and seek a better one. |
| best = t |
| t = t.left |
| } |
| } |
| return best |
| } |
| |
| func (t *node32) insert(x int32, w *RBTint32) (newroot, newnode *node32) { |
| // defaults |
| newroot = t |
| newnode = t |
| if x == t.key { |
| return |
| } |
| if x < t.key { |
| if t.left == nil { |
| n := w.makeNode(x) |
| n.parent = t |
| t.left = n |
| newnode = n |
| return |
| } |
| var new_l *node32 |
| new_l, newnode = t.left.insert(x, w) |
| t.left = new_l |
| new_l.parent = t |
| newrank := 1 + new_l.maxChildRank() |
| if newrank > t.rank { |
| if newrank > 1+t.right.Rank() { // rotations required |
| if new_l.left.Rank() < new_l.right.Rank() { |
| // double rotation |
| t.left = new_l.rightToRoot() |
| } |
| newroot = t.leftToRoot() |
| return |
| } else { |
| t.rank = newrank |
| } |
| } |
| } else { // x > t.key |
| if t.right == nil { |
| n := w.makeNode(x) |
| n.parent = t |
| t.right = n |
| newnode = n |
| return |
| } |
| var new_r *node32 |
| new_r, newnode = t.right.insert(x, w) |
| t.right = new_r |
| new_r.parent = t |
| newrank := 1 + new_r.maxChildRank() |
| if newrank > t.rank { |
| if newrank > 1+t.left.Rank() { // rotations required |
| if new_r.right.Rank() < new_r.left.Rank() { |
| // double rotation |
| t.right = new_r.leftToRoot() |
| } |
| newroot = t.rightToRoot() |
| return |
| } else { |
| t.rank = newrank |
| } |
| } |
| } |
| return |
| } |
| |
| func (t *node32) rightToRoot() *node32 { |
| // this |
| // left right |
| // rl rr |
| // |
| // becomes |
| // |
| // right |
| // this rr |
| // left rl |
| // |
| right := t.right |
| rl := right.left |
| right.parent = t.parent |
| right.left = t |
| t.parent = right |
| // parent's child ptr fixed in caller |
| t.right = rl |
| if rl != nil { |
| rl.parent = t |
| } |
| return right |
| } |
| |
| func (t *node32) leftToRoot() *node32 { |
| // this |
| // left right |
| // ll lr |
| // |
| // becomes |
| // |
| // left |
| // ll this |
| // lr right |
| // |
| left := t.left |
| lr := left.right |
| left.parent = t.parent |
| left.right = t |
| t.parent = left |
| // parent's child ptr fixed in caller |
| t.left = lr |
| if lr != nil { |
| lr.parent = t |
| } |
| return left |
| } |
| |
| // next returns the successor of t in a left-to-right |
| // walk of the tree in which t is embedded. |
| func (t *node32) next() *node32 { |
| // If there is a right child, it is to the right |
| r := t.right |
| if r != nil { |
| return r.min() |
| } |
| // if t is p.left, then p, else repeat. |
| p := t.parent |
| for p != nil { |
| if p.left == t { |
| return p |
| } |
| t = p |
| p = t.parent |
| } |
| return nil |
| } |
| |
| // prev returns the predecessor of t in a left-to-right |
| // walk of the tree in which t is embedded. |
| func (t *node32) prev() *node32 { |
| // If there is a left child, it is to the left |
| l := t.left |
| if l != nil { |
| return l.max() |
| } |
| // if t is p.right, then p, else repeat. |
| p := t.parent |
| for p != nil { |
| if p.right == t { |
| return p |
| } |
| t = p |
| p = t.parent |
| } |
| return nil |
| } |