public int Rank(bool b, int stop, out WaveletTreeNodeBin next, out bool done) { if (!groupMembership.ContainsKey(b)) { next = null; done = true; return 0; } else { bool bit = groupMembership[b]; int rank = bitString.Rank(bit, stop); next = bit ? right : left; done = next == null; return rank; } }
public WaveletTreeNodeBin(BitArray text, NodeList leaves) { List<bool> distinctChars = new List<bool>(); if (text.HasZeros()) distinctChars.Add(false); if (text.HasOnes()) distinctChars.Add(true); // Leaf Node if (distinctChars.Count == 1) { BitArray bitArray = new BitArray(text.Length); bitString = new BitString(bitArray); groupMembership = new Dictionary<bool, bool>(); groupMembership[text[0]] = false; left = null; right = null; leaves.Add(text[0], this); } // Inner Node else { groupMembership = new Dictionary<bool, bool>(2); groupMembership[false] = false; groupMembership[true] = true; BitArray group1 = new BitArray(0); BitArray group2 = new BitArray(0); BitArray bitArray = new BitArray(text.Length); for (int i = 0; i < text.Length; i++) { if (text[i] == false) { group1 = group1.Append(false); bitArray[i] = false; } else { group2 = group2.Append(true); bitArray[i] = true; } } bitString = new BitString(bitArray); left = new WaveletTreeNodeBin(group1, leaves); right = new WaveletTreeNodeBin(group2, leaves); left.parent = right.parent = this; } }
public WaveletTreeBin(BitArray text) { leaves = new NodeList(); this.root = new WaveletTreeNodeBin(text, leaves); }
public int Select(bool b, int count, out WaveletTreeNodeBin next, out bool done) { next = null; done = true; if (groupMembership == null || !groupMembership.ContainsKey(b)) return -1; bool bit = groupMembership[b]; int select = bitString.Select(bit, count); next = parent; done = next == null; return select; }