Erlang (programming language)/Tutorials/gb sets

From Citizendium
Jump to navigation Jump to search

gb_sets

Why go to the bother of using a structure other than a list for sets? Normally for small sets, lists work fine. But operations on lists are slow, and awkward if the list is long. Long depends on the machine and available memory. Generally speaking, a balanced binary tree will give the fastest access time of most any alternative data structure. Generally the speed is O(log(n)) for a binary tree. Whereas a list is order O(n).

Using gb_sets

Lets create a genalized balanced set from a list.

1> A = gb_sets:from_list([1,2,3,4,5]).
{5,{3,{2,{1,nil,nil},nil},{5,{4,nil,nil},nil}}}

     3
    / \
   2   5
  /   / \
 1   4   

Now we remove an element.

2> B = gb_sets:del_element(1,A).
{4,{3,{2,nil,nil},{5,{4,nil,nil},nil}}}

   3
  / \
 2   5
    / \
   4

And remove another element.

4> C = gb_sets:del_element(2,B).
{3,{3,nil,{5,{4,nil,nil},nil}}}
 
    3
   / \ 
      5
     / \
    4

Now we should balance the tree to keep our speed maximized.

5> D = gb_sets:balance(C).
{3,{4,{3,nil,nil},{5,nil,nil}}}

    4
   / \
  3   5