aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/doc/src/gb_trees.xml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stdlib/doc/src/gb_trees.xml')
-rw-r--r--lib/stdlib/doc/src/gb_trees.xml367
1 files changed, 367 insertions, 0 deletions
diff --git a/lib/stdlib/doc/src/gb_trees.xml b/lib/stdlib/doc/src/gb_trees.xml
new file mode 100644
index 0000000000..2bf18138c0
--- /dev/null
+++ b/lib/stdlib/doc/src/gb_trees.xml
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2001</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>gb_trees</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <module>gb_trees</module>
+ <modulesummary>General Balanced Trees</modulesummary>
+ <description>
+ <p>An efficient implementation of Prof. Arne Andersson's General
+ Balanced Trees. These have no storage overhead compared to
+ unbalanced binary trees, and their performance is in general
+ better than AVL trees.</p>
+ </description>
+
+ <section>
+ <title>Data structure</title>
+ <p>Data structure:</p>
+ <code type="none">
+
+- {Size, Tree}, where `Tree' is composed of nodes of the form:
+ - {Key, Value, Smaller, Bigger}, and the "empty tree" node:
+ - nil.</code>
+ <p>There is no attempt to balance trees after deletions. Since
+ deletions do not increase the height of a tree, this should be OK.</p>
+ <p>Original balance condition <em>h(T) &lt;= ceil(c * log(|T|))</em>
+ has been changed to the similar (but not quite equivalent)
+ condition <em>2 ^ h(T) &lt;= |T| ^ c</em>. This should also be OK.</p>
+ <p>Performance is comparable to the AVL trees in the Erlang book
+ (and faster in general due to less overhead); the difference is
+ that deletion works for these trees, but not for the book's
+ trees. Behaviour is logarithmic (as it should be).</p>
+ </section>
+
+ <section>
+ <title>DATA TYPES</title>
+ <code type="none">
+gb_tree() = a GB tree</code>
+ </section>
+ <funcs>
+ <func>
+ <name>balance(Tree1) -> Tree2</name>
+ <fsummary>Rebalance a tree</fsummary>
+ <type>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Rebalances <c>Tree1</c>. Note that this is rarely necessary,
+ but may be motivated when a large number of nodes have been
+ deleted from the tree without further insertions. Rebalancing
+ could then be forced in order to minimise lookup times, since
+ deletion only does not rebalance the tree.</p>
+ </desc>
+ </func>
+ <func>
+ <name>delete(Key, Tree1) -> Tree2</name>
+ <fsummary>Remove a node from a tree</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Removes the node with key <c>Key</c> from <c>Tree1</c>;
+ returns new tree. Assumes that the key is present in the tree,
+ crashes otherwise.</p>
+ </desc>
+ </func>
+ <func>
+ <name>delete_any(Key, Tree1) -> Tree2</name>
+ <fsummary>Remove a (possibly non-existing) node from a tree</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Removes the node with key <c>Key</c> from <c>Tree1</c> if
+ the key is present in the tree, otherwise does nothing;
+ returns new tree.</p>
+ </desc>
+ </func>
+ <func>
+ <name>empty() -> Tree</name>
+ <fsummary>Return an empty tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Returns a new empty tree</p>
+ </desc>
+ </func>
+ <func>
+ <name>enter(Key, Val, Tree1) -> Tree2</name>
+ <fsummary>Insert or update key with value in a tree</fsummary>
+ <type>
+ <v>Key = Val = term()</v>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Inserts <c>Key</c> with value <c>Val</c> into <c>Tree1</c> if
+ the key is not present in the tree, otherwise updates
+ <c>Key</c> to value <c>Val</c> in <c>Tree1</c>. Returns the
+ new tree.</p>
+ </desc>
+ </func>
+ <func>
+ <name>from_orddict(List) -> Tree</name>
+ <fsummary>Make a tree from an orddict</fsummary>
+ <type>
+ <v>List = [{Key, Val}]</v>
+ <v>&nbsp;Key = Val = term()</v>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Turns an ordered list <c>List</c> of key-value tuples into a
+ tree. The list must not contain duplicate keys.</p>
+ </desc>
+ </func>
+ <func>
+ <name>get(Key, Tree) -> Val</name>
+ <fsummary>Look up a key in a tree, if present</fsummary>
+ <type>
+ <v>Key = Val = term()</v>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Retrieves the value stored with <c>Key</c> in <c>Tree</c>.
+ Assumes that the key is present in the tree, crashes
+ otherwise.</p>
+ </desc>
+ </func>
+ <func>
+ <name>lookup(Key, Tree) -> {value, Val} | none</name>
+ <fsummary>Look up a key in a tree</fsummary>
+ <type>
+ <v>Key = Val = term()</v>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Looks up <c>Key</c> in <c>Tree</c>; returns
+ <c>{value, Val}</c>, or <c>none</c> if <c>Key</c> is not
+ present.</p>
+ </desc>
+ </func>
+ <func>
+ <name>insert(Key, Val, Tree1) -> Tree2</name>
+ <fsummary>Insert a new key and value in a tree</fsummary>
+ <type>
+ <v>Key = Val = term()</v>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Inserts <c>Key</c> with value <c>Val</c> into <c>Tree1</c>;
+ returns the new tree. Assumes that the key is not present in
+ the tree, crashes otherwise.</p>
+ </desc>
+ </func>
+ <func>
+ <name>is_defined(Key, Tree) -> bool()</name>
+ <fsummary>Test for membership of a tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Returns <c>true</c> if <c>Key</c> is present in <c>Tree</c>,
+ otherwise <c>false</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>is_empty(Tree) -> bool()</name>
+ <fsummary>Test for empty tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Returns <c>true</c> if <c>Tree</c> is an empty tree, and
+ <c>false</c> otherwise.</p>
+ </desc>
+ </func>
+ <func>
+ <name>iterator(Tree) -> Iter</name>
+ <fsummary>Return an iterator for a tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ <v>Iter = term()</v>
+ </type>
+ <desc>
+ <p>Returns an iterator that can be used for traversing the
+ entries of <c>Tree</c>; see <c>next/1</c>. The implementation
+ of this is very efficient; traversing the whole tree using
+ <c>next/1</c> is only slightly slower than getting the list
+ of all elements using <c>to_list/1</c> and traversing that.
+ The main advantage of the iterator approach is that it does
+ not require the complete list of all elements to be built in
+ memory at one time.</p>
+ </desc>
+ </func>
+ <func>
+ <name>keys(Tree) -> [Key]</name>
+ <fsummary>Return a list of the keys in a tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ <v>Key = term()</v>
+ </type>
+ <desc>
+ <p>Returns the keys in <c>Tree</c> as an ordered list.</p>
+ </desc>
+ </func>
+ <func>
+ <name>largest(Tree) -> {Key, Val}</name>
+ <fsummary>Return largest key and value</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ <v>Key = Val = term()</v>
+ </type>
+ <desc>
+ <p>Returns <c>{Key, Val}</c>, where <c>Key</c> is the largest
+ key in <c>Tree</c>, and <c>Val</c> is the value associated
+ with this key. Assumes that the tree is nonempty.</p>
+ </desc>
+ </func>
+ <func>
+ <name>map(Function, Tree1) -> Tree2</name>
+ <fsummary>Return largest key and value</fsummary>
+ <type>
+ <v>Function = fun(K, V1) -> V2</v>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc><p>maps the function F(K, V1) -> V2 to all key-value pairs
+ of the tree Tree1 and returns a new tree Tree2 with the same set of keys
+ as Tree1 and the new set of values V2.</p>
+ </desc>
+ </func>
+ <func>
+ <name>next(Iter1) -> {Key, Val, Iter2} | none</name>
+ <fsummary>Traverse a tree with an iterator</fsummary>
+ <type>
+ <v>Iter1 = Iter2 = Key = Val = term()</v>
+ </type>
+ <desc>
+ <p>Returns <c>{Key, Val, Iter2}</c> where <c>Key</c> is the
+ smallest key referred to by the iterator <c>Iter1</c>, and
+ <c>Iter2</c> is the new iterator to be used for
+ traversing the remaining nodes, or the atom <c>none</c> if no
+ nodes remain.</p>
+ </desc>
+ </func>
+ <func>
+ <name>size(Tree) -> int()</name>
+ <fsummary>Return the number of nodes in a tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Returns the number of nodes in <c>Tree</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>smallest(Tree) -> {Key, Val}</name>
+ <fsummary>Return smallest key and value</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ <v>Key = Val = term()</v>
+ </type>
+ <desc>
+ <p>Returns <c>{Key, Val}</c>, where <c>Key</c> is the smallest
+ key in <c>Tree</c>, and <c>Val</c> is the value associated
+ with this key. Assumes that the tree is nonempty.</p>
+ </desc>
+ </func>
+ <func>
+ <name>take_largest(Tree1) -> {Key, Val, Tree2}</name>
+ <fsummary>Extract largest key and value</fsummary>
+ <type>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ <v>Key = Val = term()</v>
+ </type>
+ <desc>
+ <p>Returns <c>{Key, Val, Tree2}</c>, where <c>Key</c> is the
+ largest key in <c>Tree1</c>, <c>Val</c> is the value
+ associated with this key, and <c>Tree2</c> is this tree with
+ the corresponding node deleted. Assumes that the tree is
+ nonempty.</p>
+ </desc>
+ </func>
+ <func>
+ <name>take_smallest(Tree1) -> {Key, Val, Tree2}</name>
+ <fsummary>Extract smallest key and value</fsummary>
+ <type>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ <v>Key = Val = term()</v>
+ </type>
+ <desc>
+ <p>Returns <c>{Key, Val, Tree2}</c>, where <c>Key</c> is the
+ smallest key in <c>Tree1</c>, <c>Val</c> is the value
+ associated with this key, and <c>Tree2</c> is this tree with
+ the corresponding node deleted. Assumes that the tree is
+ nonempty.</p>
+ </desc>
+ </func>
+ <func>
+ <name>to_list(Tree) -> [{Key, Val}]</name>
+ <fsummary>Convert a tree into a list</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ <v>Key = Val = term()</v>
+ </type>
+ <desc>
+ <p>Converts a tree into an ordered list of key-value tuples.</p>
+ </desc>
+ </func>
+ <func>
+ <name>update(Key, Val, Tree1) -> Tree2</name>
+ <fsummary>Update a key to new value in a tree</fsummary>
+ <type>
+ <v>Key = Val = term()</v>
+ <v>Tree1 = Tree2 = gb_tree()</v>
+ </type>
+ <desc>
+ <p>Updates <c>Key</c> to value <c>Val</c> in <c>Tree1</c>;
+ returns the new tree. Assumes that the key is present in the
+ tree.</p>
+ </desc>
+ </func>
+ <func>
+ <name>values(Tree) -> [Val]</name>
+ <fsummary>Return a list of the values in a tree</fsummary>
+ <type>
+ <v>Tree = gb_tree()</v>
+ <v>Val = term()</v>
+ </type>
+ <desc>
+ <p>Returns the values in <c>Tree</c> as an ordered list, sorted
+ by their corresponding keys. Duplicates are not removed.</p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>SEE ALSO</title>
+ <p><seealso marker="gb_sets">gb_sets(3)</seealso>,
+ <seealso marker="dict">dict(3)</seealso></p>
+ </section>
+</erlref>
+