Пример #1
0
        //
        // 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
            };
        }
Пример #2
0
        //
        // 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);
        }
Пример #3
0
        //
        // 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;
        }
Пример #4
0
        //
        // 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 };
        }