/// <summary> /// Method used for decompression of a compressed suffix array based on Delta encoding algorithm. /// This method is also using method which generates suffix array from Psi function. /// See <see cref="PsiFunction.PsiToSA(int[])"/>. /// </summary> /// <param name="delta">Dictionary of compressed values divided by characters from the original input.</param> /// <param name="length">Length of the original input.</param> /// <returns>Suffix array.</returns> public static int[] DecompressDeltaEncoding(Dictionary <char, List <Int16> > delta, int length) { int[] psi = new int[length]; psi[0] = -1; int j = 1; foreach (var key in delta.Keys) { psi[j++] = Convert.ToInt32(delta[key][0]); for (int i = 1; i < delta[key].Count; i++) { psi[j] = Convert.ToInt32(delta[key][i]) + psi[j - 1]; j++; } } return(PsiFunction.PsiToSA(psi)); }
/// <summary> /// Method used for decompression of list of byte arrays based on Elias-Fano algorithm. /// </summary> /// <param name="eliasFano">List of byte arrays. Result of Elias-Fano compression.</param> /// <param name="bitLengthOfSeq">List of values that represent length of resulting bit sequences by increasing sequences.</param> /// <param name="bitLengthOfOrigParts">List of integer arrays containing information about length of leading and lower bit sequences.</param> /// <returns>Suffix array.</returns> public static int[] DecompressEliasFano(List <byte[]> eliasFano, List <int> bitLengthOfSeq, List <int[]> bitLengthOfOrigParts) { int highLowBitsSeam = 0; List <int> sequence; List <int> psi = new List <int>(); psi.Insert(0, -1); int k = 1; for (int i = 0; i < eliasFano.Count; i++) { bool[] bitArray = ByteToBit(eliasFano[i], bitLengthOfSeq[i]); highLowBitsSeam = GetHigherLowerBitsSeam(bitArray, bitLengthOfOrigParts[i][0]); List <bool[]> leadingBits = GenerateLeadingBits(bitArray, highLowBitsSeam, bitLengthOfOrigParts[i][0]); List <bool[]> lowerBits = GenerateLowerBits(bitArray, highLowBitsSeam, bitLengthOfOrigParts[i][1]); if (bitLengthOfOrigParts[i][1] == 0) { sequence = new List <int>(); int index = 0; foreach (var item in leadingBits) { sequence.Insert(index, GetNumberFromBits(item)); index++; } } else { sequence = GenerateSequence(leadingBits, lowerBits); } foreach (var el in sequence) { psi.Insert(k, el); k++; } } return(PsiFunction.PsiToSA(psi.ToArray())); }