示例#1
0
        public void Sort()
        {
            var histogram = new int[256];
            var working   = new SubstringArray(size);

            for (int bitOffset = 0; bitOffset <= 24; bitOffset += 8)
            {
                if (bitOffset > 0)
                {
                    for (int j = 0; j < histogram.Length; j++)
                    {
                        histogram[j] = 0;
                    }
                }
                int i, count, rollingSum;
                for (i = 0, count = size; i < count; i++)
                {
                    int sortValue = scores[i];
                    int sortByte  = (sortValue >> bitOffset) & 0xff;
                    histogram[sortByte]++;
                }

                for (i = 0, count = histogram.Length, rollingSum = 0; i < count; i++)
                {
                    int tmp = histogram[i];
                    histogram[i] = rollingSum;
                    rollingSum  += tmp;
                }

                for (i = 0, count = size; i < count; i++)
                {
                    int sortValue = scores[i];
                    int sortByte  = (sortValue >> bitOffset) & 0xff;
                    int newOffset = histogram[sortByte]++;
                    working.SetScore(newOffset, indexes[i], lengths[i], scores[i]);
                }

                // swap (brain transplant) innards
                int[] t = working.indexes;
                working.indexes = indexes;
                indexes         = t;

                t = working.lengths;
                working.lengths = lengths;
                lengths         = t;

                t = working.scores;
                working.scores = scores;
                scores         = t;

                size         = working.size;
                working.size = 0;

                i = working.capacity;
                working.capacity = capacity;
                capacity         = i;
            }
        }
        public void Sort()
        {
            var histogram = new int[256];
            var working = new SubstringArray(size);

            for (int bitOffset = 0; bitOffset <= 24; bitOffset += 8)
            {
                if (bitOffset > 0)
                {
                    for (int j = 0; j < histogram.Length; j++)
                    {
                        histogram[j] = 0;
                    }
                }
                int i, count, rollingSum;
                for (i = 0, count = size; i < count; i++)
                {
                    int sortValue = scores[i];
                    int sortByte = (sortValue >> bitOffset) & 0xff;
                    histogram[sortByte]++;
                }

                for (i = 0, count = histogram.Length, rollingSum = 0; i < count; i++)
                {
                    int tmp = histogram[i];
                    histogram[i] = rollingSum;
                    rollingSum += tmp;
                }

                for (i = 0, count = size; i < count; i++)
                {
                    int sortValue = scores[i];
                    int sortByte = (sortValue >> bitOffset) & 0xff;
                    int newOffset = histogram[sortByte]++;
                    working.SetScore(newOffset, indexes[i], lengths[i], scores[i]);
                }

                // swap (brain transplant) innards
                int[] t = working.indexes;
                working.indexes = indexes;
                indexes = t;

                t = working.lengths;
                working.lengths = lengths;
                lengths = t;

                t = working.scores;
                working.scores = scores;
                scores = t;

                size = working.size;
                working.size = 0;

                i = working.capacity;
                working.capacity = capacity;
                capacity = i;
            }
        }
        private byte[] Pack(int desiredLength)
        {
            var pruned = new SubstringArray(1024);
            int i, size = 0;

            for (i = substrings.Size - 1; i >= 0; i--)
            {
                bool alreadyCovered = false;
                for (int j = 0, c = pruned.Size; j < c; j++)
                {
                    if (pruned.IndexOf(j, substrings, i, bytes, suffixArray) != -1)
                    {

                        alreadyCovered = true;
                        break;
                    }
                }

                if (alreadyCovered)
                {
                    continue;
                }

                for (int j = pruned.Size - 1; j >= 0; j--)
                {
                    if (substrings.IndexOf(i, pruned, j, bytes, suffixArray) != -1)
                    {
                        size -= pruned.Length(j);
                        pruned.Remove(j);
                    }
                }
                pruned.SetScore(pruned.Size, substrings.Index(i), substrings.Length(i), substrings.Score(i));
                size += substrings.Length(i);
                // We calculate 2x because when we lay the strings out end to end we will merge common prefix/suffixes
                if (size >= 2 * desiredLength)
                {
                    break;
                }
            }

            byte[] packed = new byte[desiredLength];
            int pi = desiredLength;

            int count;
            for (i = 0, count = pruned.Size; i < count && pi > 0; i++)
            {
                int length = pruned.Length(i);
                if (pi - length < 0)
                {
                    length = pi;
                }
                pi -= prepend(bytes, suffixArray[pruned.Index(i)], packed, pi, length);
            }

            if (pi > 0)
            {
                packed = packed.Skip(pi).Take(packed.Length).ToArray();
            }

            return packed;
        }
        private byte[] Pack(int desiredLength)
        {
            var pruned = new SubstringArray(1024);
            int i, size = 0;

            for (i = substrings.Size - 1; i >= 0; i--)
            {
                bool alreadyCovered = false;
                for (int j = 0, c = pruned.Size; j < c; j++)
                {
                    if (pruned.IndexOf(j, substrings, i, bytes, suffixArray) != -1)
                    {
                        alreadyCovered = true;
                        break;
                    }
                }

                if (alreadyCovered)
                {
                    continue;
                }

                for (int j = pruned.Size - 1; j >= 0; j--)
                {
                    if (substrings.IndexOf(i, pruned, j, bytes, suffixArray) != -1)
                    {
                        size -= pruned.Length(j);
                        pruned.Remove(j);
                    }
                }
                pruned.SetScore(pruned.Size, substrings.Index(i), substrings.Length(i), substrings.Score(i));
                size += substrings.Length(i);
                // We calculate 2x because when we lay the strings out end to end we will merge common prefix/suffixes
                if (size >= 2 * desiredLength)
                {
                    break;
                }
            }

            byte[] packed = new byte[desiredLength];
            int    pi     = desiredLength;

            int count;

            for (i = 0, count = pruned.Size; i < count && pi > 0; i++)
            {
                int length = pruned.Length(i);
                if (pi - length < 0)
                {
                    length = pi;
                }
                pi -= prepend(bytes, suffixArray[pruned.Index(i)], packed, pi, length);
            }

            if (pi > 0)
            {
                packed = packed.Skip(pi).Take(packed.Length).ToArray();
            }

            return(packed);
        }