statistical encoding
This commit is contained in:
parent
f8dee5b7d1
commit
ccf6641bad
41 changed files with 4543 additions and 1965 deletions
|
|
@ -0,0 +1,87 @@
|
|||
package btools.codec;
|
||||
|
||||
/**
|
||||
* Simple container for a list of lists of integers
|
||||
*/
|
||||
public class LinkedListContainer
|
||||
{
|
||||
private int[] ia; // prev, data, prev, data, ...
|
||||
private int size;
|
||||
private int[] startpointer; // 0=void, odd=head-data-cell
|
||||
private int listpointer;
|
||||
|
||||
/**
|
||||
* Construct a container for the given number of lists
|
||||
*
|
||||
* If no default-buffer is given, an int[nlists*4] is constructed,
|
||||
* able to hold 2 entries per list on average
|
||||
*
|
||||
* @param nlists the number of lists
|
||||
* @param defaultbuffer an optional data array for re-use (gets replaced if too small)
|
||||
*/
|
||||
public LinkedListContainer( int nlists, int[] defaultbuffer )
|
||||
{
|
||||
ia = defaultbuffer == null ? new int[nlists*4] : defaultbuffer;
|
||||
startpointer = new int[nlists];
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a data element to the given list
|
||||
*
|
||||
* @param listNr the list to add the data to
|
||||
* @param data the data value
|
||||
*/
|
||||
public void addDataElement( int listNr, int data )
|
||||
{
|
||||
if ( size + 2 > ia.length )
|
||||
{
|
||||
resize();
|
||||
}
|
||||
ia[size++] = startpointer[ listNr ];
|
||||
startpointer[ listNr ] = size;
|
||||
ia[size++] = data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a list for reading
|
||||
*
|
||||
* @param listNr the list to initialize
|
||||
* @return the number of entries in that list
|
||||
*/
|
||||
public int initList( int listNr )
|
||||
{
|
||||
int cnt = 0;
|
||||
int lp = listpointer = startpointer[ listNr ];
|
||||
while( lp != 0 )
|
||||
{
|
||||
lp = ia[ lp-1 ];
|
||||
cnt++;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a data element from the list previously initialized.
|
||||
* Data elements are return in reverse order (lifo)
|
||||
*
|
||||
* @return the data element
|
||||
* @throws IllegalArgumentException if no more element
|
||||
*/
|
||||
public int getDataElement()
|
||||
{
|
||||
if ( listpointer == 0 )
|
||||
{
|
||||
throw new IllegalArgumentException( "no more element!" );
|
||||
}
|
||||
int data = ia[ listpointer ];
|
||||
listpointer = ia[ listpointer-1 ];
|
||||
return data;
|
||||
}
|
||||
|
||||
private void resize()
|
||||
{
|
||||
int[] ia2 = new int[2*ia.length];
|
||||
System.arraycopy( ia, 0, ia2, 0, ia.length );
|
||||
ia = ia2;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue