3 ms·
Abstract: We can represent an array of n values from {0, 1, 2} using n log_2 3 bits (arithmetic coding), but then we cannot retrieve a single element efficientl
by AndrewOMartin 8y ago
Abstract: We can represent an array of n values from {0, 1, 2} using
n log_2 3 bits (arithmetic coding), but then we cannot
retrieve a single element efficiently. Instead, we can encode
every block of t elements using t log_2 3 bits, and bound
the retrieval time by t. This gives a linear trade-off between
the redundancy of the representation and the query time.
In fact, this type of linear trade-off is ubiquitous in
known succinct data structures, and in data compression.
The folk wisdom is that if we want to waste one bit per block,
the encoding is so constrained that it cannot help the query
in any way. Thus, the only thing a query can do is to read
the entire block and unpack it.
We break this limitation and show how to use recursion
to improve redundancy. It turns out that if a block is encoded
with two (!) bits of redundancy, we can decode a
single element, and answer many other interesting queries,
in time logarithmic in the block size.
Our technique allows us to revisit classic problems in
succinct data structures, and give surprising new upper
bounds. We also construct a locally-decodable version of
arithmetic coding.