Compact/succinct representations for vectors and arrays
Compact bit arrays are space effecient representation of the classical array as described in "Compact Data Structures, a practical approach" and its extensive bibliography.
Arrays are stored in a compact form by using only the bits needed for each element. E.g. below the array A is shown to be stored using only two uint32 elements (W). From the compact representation, the values from the original array (A) can be read, written, and operated on.
ββββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ
A β 20 β 18 β 22 β 22 β 16 β 21 β 11 β 22 β 21 β 21 β
ββββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ
β β β β β β β β β β
β β β β β β β β β β
βΌ βΌ βΌ βΌ βΌ βΌ βΌ βΌ βΌ βΌ
ββββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ¬βββββββ
B β10100 β10010 β10110 β10110 β10000 β10101 β01011 β10110 β10101 β10101 β
ββββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ΄βββββββ
β β β β β β β β β β
β β β B is a virtual bit array β β β β
β β β β β β β β β β
βΌ βΌ βΌ βΌ βΌ βΌ βΌ βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
B β10100 10010 10110 10110 10000 10101 01011 10110 10101 10101 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ββββββββββββββββββββββββββ
β The bits are reordered to provide β β
β 0 based indexing from W βββββββ¬ββββββ β
β MSB β 010 β 11 β LSB β
β βββββββ΄ββββββ β
β A[6] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββ β
βΌ β βΌ β β β β β β β β β β β β β β β β β β β β β β¬ β β β β β β β β β β βββ β
βΌ βΌ
W β11 10101 10000 10110 10110 10010 10100 β10101 10101 10110 010 β
^^ ^^^
β β β β β β β β β β β β β β β β β β β β β β β β΄ β β β β β β β β β β β β β
A[6] β A[0] A[9] β A[6]
βββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββ
βΌ βΌ
ββββββββββββββ¬βββββββββββββ
W β 3943389780 β 177586 β
ββββββββββββββ΄βββββββββββββ
It is key to note that the values of A are stored lowest significant first. The same is true for entries which span multiple words. E.g. A[6] in the above visual is split with the 2 lowest sig bits in word 1, and the three highest sig bits in word 2. In word 1 the lowest sig bits of A[6] will be the last bits accessed, while in word 2 the highest sig bits of A[6] will be accessed first.
for implementation and operation details see: