Index: lib/coreimpl/splay_tree.dart |
diff --git a/lib/coreimpl/splay_tree.dart b/lib/coreimpl/splay_tree.dart |
deleted file mode 100644 |
index 974c2bcb78cbb28f0c3fd015ae3645cd26a525f8..0000000000000000000000000000000000000000 |
--- a/lib/coreimpl/splay_tree.dart |
+++ /dev/null |
@@ -1,306 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/** |
- * A node in a splay tree. It holds the key, the value and the left |
- * and right children in the tree. |
- */ |
-class SplayTreeNode<K, V> { |
- SplayTreeNode(K this.key, V this.value); |
- |
- K key; |
- V value; |
- SplayTreeNode<K, V> left; |
- SplayTreeNode<K, V> right; |
-} |
- |
-/** |
- * A splay tree is a self-balancing binary |
- * search tree with the additional property that recently accessed |
- * elements are quick to access again. It performs basic operations |
- * such as insertion, look-up and removal in O(log(n)) amortized time. |
- * |
- * This implementation is a Dart version of the JavaScript |
- * implementation in the V8 project. |
- */ |
-class SplayTreeMap<K extends Comparable, V> implements Map<K, V> { |
- |
- // The root node of the splay tree. It will contain either the last |
- // element inserted, or the last element looked up. |
- SplayTreeNode<K, V> _root; |
- |
- // The dummy node used when performing a splay on the tree. It is a |
- // local field of the class to avoid allocating a node each time a |
- // splay is performed. |
- SplayTreeNode<K, V> _dummy; |
- |
- // Number of elements in the splay tree. |
- int _count; |
- |
- SplayTreeMap() { |
- _dummy = new SplayTreeNode<K, V>(null, null); |
- _count = 0; |
- } |
- |
- /** |
- * Perform the splay operation for the given key. Moves the node with |
- * the given key to the top of the tree. If no node has the given |
- * key, the last node on the search path is moved to the top of the |
- * tree. This is the simplified top-down splaying algorithm from: |
- * "Self-adjusting Binary Search Trees" by Sleator and Tarjan. |
- */ |
- void splay_(K key) { |
- if (isEmpty) return; |
- |
- // The right child of the dummy node will hold |
- // the L tree of the algorithm. The left child of the dummy node |
- // will hold the R tree of the algorithm. Using a dummy node, left |
- // and right will always be nodes and we avoid special cases. |
- SplayTreeNode<K, V> left = _dummy; |
- SplayTreeNode<K, V> right = _dummy; |
- SplayTreeNode<K, V> current = _root; |
- while (true) { |
- int comp = key.compareTo(current.key); |
- if (comp < 0) { |
- if (current.left === null) break; |
- if (key.compareTo(current.left.key) < 0) { |
- // Rotate right. |
- SplayTreeNode<K, V> tmp = current.left; |
- current.left = tmp.right; |
- tmp.right = current; |
- current = tmp; |
- if (current.left === null) break; |
- } |
- // Link right. |
- right.left = current; |
- right = current; |
- current = current.left; |
- } else if (comp > 0) { |
- if (current.right === null) break; |
- if (key.compareTo(current.right.key) > 0) { |
- // Rotate left. |
- SplayTreeNode<K, V> tmp = current.right; |
- current.right = tmp.left; |
- tmp.left = current; |
- current = tmp; |
- if (current.right === null) break; |
- } |
- // Link left. |
- left.right = current; |
- left = current; |
- current = current.right; |
- } else { |
- break; |
- } |
- } |
- // Assemble. |
- left.right = current.left; |
- right.left = current.right; |
- current.left = _dummy.right; |
- current.right = _dummy.left; |
- _root = current; |
- |
- _dummy.right = null; |
- _dummy.left = null; |
- } |
- |
- V operator [](K key) { |
- if (!isEmpty) { |
- splay_(key); |
- if (_root.key.compareTo(key) == 0) return _root.value; |
- } |
- return null; |
- } |
- |
- V remove(K key) { |
- if (isEmpty) return null; |
- splay_(key); |
- if (_root.key.compareTo(key) != 0) return null; |
- V value = _root.value; |
- |
- _count--; |
- // assert(_count >= 0); |
- if (_root.left === null) { |
- _root = _root.right; |
- } else { |
- SplayTreeNode<K, V> right = _root.right; |
- _root = _root.left; |
- // Splay to make sure that the new root has an empty right child. |
- splay_(key); |
- // Insert the original right child as the right child of the new |
- // root. |
- _root.right = right; |
- } |
- return value; |
- } |
- |
- void operator []=(K key, V value) { |
- if (isEmpty) { |
- _count++; |
- _root = new SplayTreeNode(key, value); |
- return; |
- } |
- // Splay on the key to move the last node on the search path for |
- // the key to the root of the tree. |
- splay_(key); |
- if (_root.key.compareTo(key) == 0) { |
- _root.value = value; |
- return; |
- } |
- SplayTreeNode<K, V> node = new SplayTreeNode(key, value); |
- // assert(_count >= 0); |
- _count++; |
- if (key.compareTo(_root.key) > 0) { |
- node.left = _root; |
- node.right = _root.right; |
- _root.right = null; |
- } else { |
- node.right = _root; |
- node.left = _root.left; |
- _root.left = null; |
- } |
- _root = node; |
- } |
- |
- V putIfAbsent(K key, V ifAbsent()) { |
- if (containsKey(key)) return this[key]; |
- V value = ifAbsent(); |
- this[key] = value; |
- return value; |
- } |
- |
- bool get isEmpty { |
- // assert(!((_root === null) && (_count != 0))); |
- // assert(!((_count == 0) && (_root !== null))); |
- return (_root === null); |
- } |
- |
- void forEach(void f(K key, V value)) { |
- List<SplayTreeNode<K, V>> list = new List<SplayTreeNode<K, V>>(); |
- SplayTreeNode<K, V> current = _root; |
- while (current !== null) { |
- if (current.left !== null) { |
- list.add(current); |
- current = current.left; |
- } else { |
- f(current.key, current.value); |
- while (current.right === null) { |
- if (list.isEmpty) return; |
- current = list.removeLast(); |
- f(current.key, current.value); |
- } |
- current = current.right; |
- } |
- } |
- } |
- |
- int get length { |
- return _count; |
- } |
- |
- void clear() { |
- _root = null; |
- _count = 0; |
- } |
- |
- bool containsKey(K key) { |
- if (!isEmpty) { |
- splay_(key); |
- if (_root.key.compareTo(key) == 0) return true; |
- } |
- return false; |
- } |
- |
- bool containsValue(V value) { |
- bool found = false; |
- bool visit(SplayTreeNode node) { |
- if (node === null) return false; |
- if (node.value == value) return true; |
- return visit(node.left) || visit(node.right); |
- } |
- return visit(_root); |
- } |
- |
- Collection<K> get keys { |
- List<K> list = new List<K>(); |
- forEach((K k, V v) { list.add(k); }); |
- return list; |
- } |
- |
- Collection<V> get values { |
- List<V> list = new List<V>(); |
- forEach((K k, V v) { list.add(v); }); |
- return list; |
- } |
- |
- String toString() { |
- return Maps.mapToString(this); |
- } |
- |
- /** |
- * Get the first key in the map. Returns [null] if the map is empty. |
- */ |
- K firstKey() { |
- if (_root === null) return null; |
- SplayTreeNode<K, V> node = _root; |
- while (node.left !== null) { |
- node = node.left; |
- } |
- // Maybe implement a splay-method that can splay the minimum without |
- // performing comparisons. |
- splay_(node.key); |
- return node.key; |
- } |
- |
- /** |
- * Get the last key in the map. Returns [null] if the map is empty. |
- */ |
- K lastKey() { |
- if (_root === null) return null; |
- SplayTreeNode<K, V> node = _root; |
- while (node.right !== null) { |
- node = node.right; |
- } |
- // Maybe implement a splay-method that can splay the maximum without |
- // performing comparisons. |
- splay_(node.key); |
- return node.key; |
- } |
- |
- /** |
- * Get the last key in the map that is strictly smaller than [key]. Returns |
- * [null] if no key was not found. |
- */ |
- K lastKeyBefore(K key) { |
- splay_(key); |
- K visit(SplayTreeNode node, K ifEmpty) { |
- if (node === null) return ifEmpty; |
- if (node.key.compareTo(key) >= 0) { |
- return visit(node.left, ifEmpty); |
- } |
- if (node.key.compareTo(key) < 0) { |
- return visit(node.right, node.key); |
- } |
- } |
- return visit(_root, null); |
- } |
- |
- /** |
- * Get the first key in the map that is strictly larger than [key]. Returns |
- * [null] if no key was not found. |
- */ |
- K firstKeyAfter(K key) { |
- splay_(key); |
- K visit(SplayTreeNode node, K ifEmpty) { |
- if (node === null) return ifEmpty; |
- if (node.key.compareTo(key) > 0) { |
- return visit(node.left, node.key); |
- } |
- if (node.key.compareTo(key) <= 0) { |
- return visit(node.right, ifEmpty); |
- } |
- } |
- return visit(_root, null); |
- } |
-} |