コード例 #1
0
 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;
       }
 }
コード例 #2
0
        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;
              }
        }
コード例 #3
0
 public WaveletTreeAsc(string text)
 {
     leaves = new NodeList();
       this.root = new WaveletTreeNodeAsc(text, leaves);
 }
コード例 #4
0
        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;
        }