Class ImmutableBinaryTrie<T>

All Implemented Interfaces:
Function<T,Long>, Object2LongFunction<T>, Serializable, Function<T,Long>, ToLongFunction<T>

public class ImmutableBinaryTrie<T> extends AbstractObject2LongFunction<T> implements Serializable
An immutable implementation of binary tries.

Instance of this class are built starting from a lexicographically ordered list of BitVectors representing binary words. Each word is assigned its position (starting from 0) in the list. The words are then organised in a binary trie with path compression.

Once the trie has been built, it is possible to ask whether a word w is contained in the trie (getting back its position in the list), the interval given by the words extending w and the approximated interval defined by w.

Since:
0.9.2
Author:
Sebastiano Vigna
See Also:
  • Field Details

  • Constructor Details

    • ImmutableBinaryTrie

      public ImmutableBinaryTrie(Iterable<? extends T> elements, TransformationStrategy<? super T> transformationStrategy)
      Creates a trie from a set of elements.
      Parameters:
      elements - a set of elements
      transformationStrategy - a transformation strategy that must turn elements into a list of distinct, lexicographically increasing (in iteration order) binary words.
  • Method Details

    • buildTrie

      protected ImmutableBinaryTrie.Node buildTrie(ObjectList<LongArrayBitVector> elements, int pos)
      Builds a trie recursively.

      The trie will contain the suffixes of words in words starting at pos.

      Parameters:
      elements - a list of elements.
      pos - a starting position.
      Returns:
      a trie containing the suffixes of words in words starting at pos.
    • size

      public int size()
      Returns the number of binary words in this trie.
      Specified by:
      size in interface Function<T,Long>
      Returns:
      the number of binary words in this trie.
    • getIndex

      public long getIndex(Object element)
    • getLong

      public long getLong(Object element)
      Specified by:
      getLong in interface Object2LongFunction<T>
    • containsKey

      public boolean containsKey(Object element)
      Specified by:
      containsKey in interface Function<T,Long>
    • get

      public int get(BooleanIterator iterator)
      Return the index of the word returned by the given iterator, or -1 if the word is not in this trie.
      Parameters:
      iterator - a boolean iterator that will be used to find a word in this trie.
      Returns:
      the index of the specified word, or -1 if the word returned by the iterator is not in this trie.
      See Also:
    • getInterval

      public Interval getInterval(BitVector word)
      Returns an interval given by the smallest and the largest word in the trie starting with the specified word.
      Parameters:
      word - a word.
      Returns:
      an interval given by the smallest and the largest word in the trie that start with word (thus, the empty inteval if no such words exist).
      See Also:
    • getInterval

      public Interval getInterval(BooleanIterator iterator)
      Returns an interval given by the smallest and the largest word in the trie starting with the word returned by the given iterator.
      Parameters:
      iterator - an iterator.
      Returns:
      an interval given by the smallest and the largest word in the trie that start with the word returned by iterator (thus, the empty inteval if no such words exist).
      See Also:
    • getApproximatedInterval

      public Interval getApproximatedInterval(T element)
      Returns an approximated interval around the specified word.

      Given a word w, the corresponding approximated interval is defined as follows: if the words in the approximator are thought of as left interval extremes in a larger lexicographically ordered set of words, and we number these word intervals using the indices of their left extremes, then the first word extending w would be in the word interval given by the left extreme of the interval returned by this method, whereas the last word extending w would be in the word interval given by the right extreme of the interval returned by this method. If no word in the larger set could possibly extend w (because w is smaller than the lexicographically smallest word in the approximator) the result is just an empty interval.

      Parameters:
      element - an element.
      Returns:
      an approximated interval around the specified word.
      See Also:
    • getApproximatedInterval

      public Interval getApproximatedInterval(BooleanIterator iterator)
      Returns an approximated prefix interval around the word returned by the specified iterator.
      Parameters:
      iterator - an iterator.
      Returns:
      an approximated interval around the specified word: if the words in this trie are thought of as left interval extremes in a larger lexicographically ordered set of words, and we number these word intervals using the indices of their left extremes, then the first word extending word would be in the word interval given by the left extreme of the Interval returned by this method, whereas the last word extending word would be in the word interval given by the right extreme of the Interval returned by this method.
      See Also:
    • toString

      public String toString()
      Overrides:
      toString in class Object