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); }