// // This Add method attach an object "data" to a node "n" using // the BitVector key as path. // private void Add(Node n, BitVector key, string data) { if (n.Key == null) { AddAsChildren(n, key, data); return; } // // First, calculate the longest common prefix for the key // and the BitVector stored in this node. // var longest = key.LongestCommonPrefix(n.Key); //System.Diagnostics.Debug.Assert(longest != 0); if (longest == n.Key.Length) { // // If the current node is a perfect prefix of the // key, then remove the prefix from the key, and // we continue our walk on the children. // key = key.Range(longest, key.Length - longest); AddAsChildren(n, key, data); return; } // // Here, n.Key and key share a common prefix. So we: // // - Create a new node with this common prefix // held there, // // - make n.Key and a new node with key as // children of this new node. var common = n.Key.Range(0, longest); var c1 = new Node { Key = n.Key.Range(longest, n.Key.Length - longest), Data = n.Data, Children = n.Children }; var c2 = new Node { Key = key.Range(longest, key.Length - longest), Data = data }; n.Key = common; n.Data = null; // initialize the list with a capacity: we save ourself // a few ms n.Children = new List <Node>(2) { c1, c2 }; }
// // Returns the object held in the node that best matches our // key. // internal string GetBest(BitVector key) { var curnode = root; while (curnode != null) { if (curnode.Children == null) { return(curnode.Data); } // Get the best fitting index var bestindex = -1; var bestlength = 0; for (var i = 0; i < curnode.Children.Count; i++) { var b = curnode.Children[i].Key.LongestCommonPrefix(key); if (b <= bestlength) { continue; } bestlength = b; bestindex = i; } if (bestindex == -1) { return(curnode.Data); } key = key.Range(bestlength, key.Length - bestlength); curnode = curnode.Children[bestindex]; if (key.Length == 0) { return(curnode.Data); } } return(null); }
// // Returns the object held in the node that best matches our // key. // internal string GetBest(BitVector key) { var curnode = root; while (curnode != null) { if (curnode.Children == null) return curnode.Data; // Get the best fitting index var bestindex = -1; var bestlength = 0; for (var i = 0; i < curnode.Children.Count; i++) { var b = curnode.Children[i].Key.LongestCommonPrefix(key); if (b <= bestlength) continue; bestlength = b; bestindex = i; } if (bestindex == -1) { return curnode.Data; } key = key.Range(bestlength, key.Length - bestlength); curnode = curnode.Children[bestindex]; if (key.Length == 0) { return curnode.Data; } } return null; }
// // This Add method attach an object "data" to a node "n" using // the BitVector key as path. // private void Add(Node n, BitVector key, string data) { if (n.Key == null) { AddAsChildren(n, key, data); return; } // // First, calculate the longest common prefix for the key // and the BitVector stored in this node. // var longest = key.LongestCommonPrefix(n.Key); //System.Diagnostics.Debug.Assert(longest != 0); if (longest == n.Key.Length) { // // If the current node is a perfect prefix of the // key, then remove the prefix from the key, and // we continue our walk on the children. // key = key.Range(longest, key.Length - longest); AddAsChildren(n, key, data); return; } // // Here, n.Key and key share a common prefix. So we: // // - Create a new node with this common prefix // held there, // // - make n.Key and a new node with key as // children of this new node. var common = n.Key.Range(0, longest); var c1 = new Node { Key = n.Key.Range(longest, n.Key.Length - longest), Data = n.Data, Children = n.Children }; var c2 = new Node { Key = key.Range(longest, key.Length - longest), Data = data }; n.Key = common; n.Data = null; // initialize the list with a capacity: we save ourself // a few ms n.Children = new List<Node>(2) { c1, c2 }; }