private void initialiseInverseBWT ( ) { final int bwtStartPointer = this . bwtStartPointer ; final byte [ ] bwtBlock = this . bwtBlock ; final int [ ] bwtMergedPointers = new int [ bwtBlockLength ] ; final int [ ] characterBase = new int [ 256 ] ; if ( bwtStartPointer < 0 || bwtStartPointer >= bwtBlockLength ) { throw new DecompressionException ( "start pointer invalid" ) ; } // Cumulative character counts System . arraycopy ( bwtByteCounts , 0 , characterBase , 1 , 255 ) ; for ( int i = 2 ; i <= 255 ; i ++ ) { characterBase [ i ] += characterBase [ i - 1 ] ; } // Merged-Array Inverse Burrows-Wheeler Transform // Combining the output characters and forward pointers into a single array here, where we // have already read both of the corresponding values, cuts down on memory accesses in the // final walk through the array for ( int i = 0 ; i < bwtBlockLength ; i ++ ) { int value = bwtBlock [ i ] & 0xff ; bwtMergedPointers [ characterBase [ value ] ++ ] = ( i << 8 ) + value ; } this . bwtMergedPointers = bwtMergedPointers ; bwtCurrentMergedPointer = bwtMergedPointers [ bwtStartPointer ] ; }
Set up the Inverse Burrows - Wheeler Transform merged pointer array .