In computer science, a succinct data structure is a data structure which uses an amount of space that is "close" to the information-theoretic lower bound, but (unlike other compressed representations) still allows for efficient query operations. The concept was originally introduced by Jacobson to encode bit vectors, (unlabeled) trees, and planar graphs. Unlike general lossless data compression algorithms, succinct data structures retain the ability to use them in-place, without decompressing them first. A related notion is that of a compressed data structure, insofar as the size of the stored or encoded data similarly depends upon the specific content of the data itself. Suppose that Z {\displaystyle Z} is the information-theoretical optimal number of bits needed to store some data. A representation of this data is called:
implicit if it takes Z + O ( 1 ) {\displaystyle Z+O(1)} bits of space, succinct if it takes Z + o ( Z ) {\displaystyle Z+o(Z)} bits of space, and compact if it takes O ( Z ) {\displaystyle O(Z)} bits of space. For example, a data structure that uses 2 Z {\displaystyle 2Z} bits of storage is compact, Z + Z {\displaystyle Z+{\sqrt {Z}}} bits is succinct, Z + lg Z {\displaystyle Z+\lg Z} bits is also succinct, and Z + 3 {\displaystyle Z+3} bits is implicit. Implicit structures are thus usually reduced to storing information using some permutation of the input data; the most well-known example of this is the heap.
Succinct indexable dictionaries Succinct indexable dictionaries, also called rank/select dictionaries, form the basis of a number of succinct representation techniques, including binary trees, k {\displaystyle k} -ary trees and multisets, as well as suffix trees and arrays. The basic problem is to store a subset S {\displaystyle S} of a universe U = [ 0 … n ) = { 0 , 1 , … , n − 1 } {\displaystyle U=[0\dots n)=\{0,1,\dots ,n-1\}} , usually represented as a bit array B [ 0 … n ) {\displaystyle B[0\dots n)} where B [ i ] = 1 {\displaystyle B[i]=1} iff i ∈ S . {\displaystyle i\in S.} An indexable dictionary supports the usual methods on dictionaries (queries, and insertions/deletions in the dynamic case) as well as the following operations:
r a n k q ( x ) = | { k ∈ [ 0 … x ] : B [ k ] = q } | {\displaystyle \mathbf {rank} _{q}(x)=|\{k\in [0\dots x]:B[k]=q\}|}
s e l e c t q ( x ) = min { k ∈ [ 0 … n ) : r a n k q ( k ) = x } {\displaystyle \mathbf {select} _{q}(x)=\min\{k\in [0\dots n):\mathbf {rank} _{q}(k)=x\}}
… excerpt ends here. Continue reading the full article.
