diff options
Diffstat (limited to 'lib/stdlib/doc/src/gb_trees.xml')
-rw-r--r-- | lib/stdlib/doc/src/gb_trees.xml | 367 |
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) <= ceil(c * log(|T|))</em> + has been changed to the similar (but not quite equivalent) + condition <em>2 ^ h(T) <= |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> 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> + |