//O(n) private Suffix[] CreateInitializedSuffixArray(byte[] text) { int Length = text.Length; Suffix[] suffixes = new Suffix[Length]; for (int i = 0; i < suffixes.Length; i++) //O(n) { suffixes[i] = new Suffix(); suffixes[i].Index = i; suffixes[i].Rank = (int)(text[i]); suffixes[i].NextRank = (i + 1) < Length ? (int)(text[i + 1]) : -1; //((i+1) < n)? (txt[i + 1] - 'a'): -1; } return suffixes; }
private void CountSort(Suffix[] suffixes, bool sortRank) { var count = new List<Suffix>[suffixes.Length + 256]; //O(1) int count_length = count.Length; for (int i = 0; i < count_length; i++) //O(n) { count[i] = new List<Suffix>(); //O(1) } foreach (var suffix in suffixes)//O(n) { int ind = (sortRank == true) ? suffix.Rank : (suffix.NextRank + 1);//O(1) count[ind].Add(suffix);//O(1) } int index = 0; //O(1) foreach (var suffixList in count) //O(n)------> o(n^2) { if (suffixList.Count == 0) //O(1) continue; //O(1) foreach (var suffix in suffixList) //O(n) { suffixes[index++] = suffix; //O(1) } } }