public int Rank(char c, int stop, out WaveletTreeNodeAsc next, out bool done) { if (!groupMembership.ContainsKey(c)) { next = null; done = true; return 0; } else { bool bit = groupMembership[c]; int rank = bitString.Rank(bit, stop); next = bit ? right : left; done = next == null; return rank; } }
public WaveletTreeNodeAsc(string text, NodeList leaves) { List<char> distinctCharList = text.Distinct<char>().ToList<char>(); distinctCharList.Sort(); string distinctChars = new string(distinctCharList.ToArray<char>()); // Leaf Node if (distinctChars.Length == 1) { BitArray bitArray = new BitArray(text.Length); bitString = new BitString(bitArray); groupMembership = new Dictionary<char, bool>(); groupMembership[text[0]] = false; left = null; right = null; leaves.Add(text[0], this); } // Inner Node else { string charsGroup1 = distinctChars.Substring(0, distinctChars.Length / 2); string charsGroup2 = distinctChars.Substring(distinctChars.Length / 2); groupMembership = new Dictionary<char, bool>(charsGroup1.Length + charsGroup2.Length); foreach (char c in charsGroup1) groupMembership[c] = false; foreach (char c in charsGroup2) groupMembership[c] = true; string group1 = ""; string group2 = ""; BitArray bitArray = new BitArray(text.Length); for (int i = 0; i < text.Length; i++) { if (charsGroup1.Contains(text[i])) { group1 += text[i]; bitArray[i] = false; } else { group2 += text[i]; bitArray[i] = true; } } bitString = new BitString(bitArray); left = new WaveletTreeNodeAsc(group1, leaves); right = new WaveletTreeNodeAsc(group2, leaves); left.parent = right.parent = this; } }
public WaveletTreeAsc(string text) { leaves = new NodeList(); this.root = new WaveletTreeNodeAsc(text, leaves); }
public int Select(char c, int count, out WaveletTreeNodeAsc next, out bool done) { next = null; done = true; if (groupMembership == null || !groupMembership.ContainsKey(c)) return -1; bool bit = groupMembership[c]; int select = bitString.Select(bit, count); next = parent; done = next == null; return select; }