/// <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));
        }
Beispiel #2
0
        /// <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()));
        }