Class IntArrayFrontCodedList
- All Implemented Interfaces:
ObjectCollection<int[]>
,ObjectIterable<int[]>
,ObjectList<int[]>
,Stack<int[]>
,Serializable
,Cloneable
,Comparable<List<? extends int[]>>
,Iterable<int[]>
,Collection<int[]>
,List<int[]>
,RandomAccess
,SequencedCollection<int[]>
This class stores immutably a list of arrays in a single
big array using front coding (of course, the
compression will be reasonable only if the list is sorted lexicographically—see below). It
implements an immutable type-specific list that returns the i-th array when calling
get(i)
. The returned array may be freely modified.
Front-coding (also known as prefix-omission) compression is based on the idea that if the i-th and the (i+1)-th array have a common prefix, we might store the length of the common prefix, and then the rest of the second array.
This approach, of course, requires that once in a while an array is stored entirely. The
ratio of a front-coded list defines how often this happens (once every ratio()
arrays). A higher ratio means more compression, but means also a longer access time, as more
arrays have to be probed to build the result. Note that we must build an array every time
get(int)
is called, but this class provides also methods that extract one of the stored
arrays in a given array, reducing garbage collection. See the documentation of the family of
get()
methods.
By setting the ratio to 1 we actually disable front coding: however, we still have a data structure storing large list of arrays with a reduced overhead (just one integer per array, plus the space required for lengths).
Note that the typical usage of front-coded lists is under the form of serialized objects; usually, the data that has to be compacted is processed offline, and the resulting structure is stored permanently. Since the pointer array is not stored, the serialized format is very small.
Implementation Details
All arrays are stored in a big array. A separate array of pointers indexes arrays whose position is a multiple of the ratio: thus, a higher ratio means also less pointers.
More in detail, an array whose position is a multiple of the ratio is stored as the array length,
followed by the elements of the array. The array length is coded by a simple variable-length list
of k-1 bit blocks, where k is the number of bits of the underlying
primitive type. All other arrays are stored as follows: let common
the length of the
maximum common prefix between the array and its predecessor. Then we store the array length
decremented by common
, followed by common
, followed by the array elements whose
index is greater than or equal to common
. For instance, if we store foo
,
foobar
, football
and fool
in a front-coded character-array list with
ratio 3, the character array will contain
3 f o o 3 3 b a r 5 3 t b a l l 4 f o o l
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class it.unimi.dsi.fastutil.objects.AbstractObjectList
AbstractObjectList.ObjectRandomAccessSubList<K>, AbstractObjectList.ObjectSubList<K>
-
Constructor Summary
ConstructorDescriptionIntArrayFrontCodedList
(Collection<int[]> c, int ratio) Creates a new front-coded list containing the arrays in the given collection.IntArrayFrontCodedList
(Iterator<int[]> arrays, int ratio) Creates a new front-coded list containing the arrays returned by the given iterator. -
Method Summary
Modifier and TypeMethodDescriptionint
arrayLength
(int index) Computes the length of the array at the given index.clone()
Returns a copy of this list.int[]
get
(int index) int
get
(int index, int[] a) Stores in the given array an array stored in this front-coded list.int
get
(int index, int[] a, int offset, int length) Stores in the given array elements from an array stored in this front-coded list.int[]
getArray
(int index) Returns an array stored in this front-coded list.ObjectListIterator
<int[]> listIterator
(int start) Returns a type-specific list iterator on the list starting at a given index.int
ratio()
Returns the ratio of this list.int
size()
toString()
Methods inherited from class it.unimi.dsi.fastutil.objects.AbstractObjectList
add, add, addAll, addAll, addElements, addElements, clear, compareTo, contains, equals, forEach, getElements, hashCode, indexOf, iterator, lastIndexOf, listIterator, peek, pop, push, remove, removeElements, set, setElements, size, subList, toArray, toArray, top
Methods inherited from class java.util.AbstractCollection
containsAll, isEmpty, remove, removeAll, retainAll
Methods inherited from interface java.util.Collection
parallelStream, removeIf, stream, toArray
Methods inherited from interface java.util.List
addFirst, addLast, containsAll, getFirst, getLast, isEmpty, remove, removeAll, removeFirst, removeLast, replaceAll, retainAll, reversed
Methods inherited from interface it.unimi.dsi.fastutil.objects.ObjectCollection
spliterator
Methods inherited from interface it.unimi.dsi.fastutil.objects.ObjectList
addAll, addAll, setElements, setElements, sort, spliterator, unstableSort
-
Constructor Details
-
IntArrayFrontCodedList
Creates a new front-coded list containing the arrays returned by the given iterator.- Parameters:
arrays
- an iterator returning arrays.ratio
- the desired ratio.
-
IntArrayFrontCodedList
Creates a new front-coded list containing the arrays in the given collection.- Parameters:
c
- a collection containing arrays.ratio
- the desired ratio.
-
-
Method Details
-
ratio
public int ratio()Returns the ratio of this list.- Returns:
- the ratio of this list.
-
arrayLength
public int arrayLength(int index) Computes the length of the array at the given index.- Parameters:
index
- an index.- Returns:
- the length of the
index
-th array.
-
get
public int[] get(int index) - Specified by:
get
in interfaceList<int[]>
- Implementation Specification:
- This implementation delegates to
getArray(int)
.
-
getArray
public int[] getArray(int index) Returns an array stored in this front-coded list.- Parameters:
index
- an index.- Returns:
- the corresponding array stored in this front-coded list.
-
get
public int get(int index, int[] a, int offset, int length) Stores in the given array elements from an array stored in this front-coded list.- Parameters:
index
- an index.a
- the array that will store the result.offset
- an offset intoa
where elements will be store.length
- a maximum number of elements to store ina
.- Returns:
- if
a
can hold the extracted elements, the number of extracted elements; otherwise, the number of remaining elements with the sign changed.
-
get
public int get(int index, int[] a) Stores in the given array an array stored in this front-coded list.- Parameters:
index
- an index.a
- the array that will store the content of the result (we assume that it can hold the result).- Returns:
- if
a
can hold the extracted elements, the number of extracted elements; otherwise, the number of remaining elements with the sign changed.
-
size
public int size()- Specified by:
size
in interfaceCollection<int[]>
- Specified by:
size
in interfaceList<int[]>
- Specified by:
size
in classAbstractCollection<int[]>
-
listIterator
Description copied from class:AbstractObjectList
Returns a type-specific list iterator on the list starting at a given index.- Specified by:
listIterator
in interfaceList<int[]>
- Specified by:
listIterator
in interfaceObjectList<int[]>
- Overrides:
listIterator
in classAbstractObjectList<int[]>
- See Also:
-
clone
Returns a copy of this list.- Returns:
- a copy of this list.
-
toString
- Overrides:
toString
in classAbstractObjectList<int[]>
-