Ejemplo n.º 1
0
            ////////////////////////////////////////////////////////////////////////////

            public Node Merge(Node aNode)
            {
                if (aNode is StdNode)
                {
                    StdNode node    = (StdNode)aNode;
                    Node    newLeft = node.left != null?Merge(node.left) : this;

                    return(new StdNode(node.elt, node.hashcode, newLeft, node.right));
                }
                else
                {
                    ArraysNode node = (ArraysNode)aNode;
                    if (count > node.count) // count > node.count >= 2  =>  count >= 3
                    {
                        Node left = NewNode(elts, hashcodes, first, count - 1);
                        int  idx  = first + count - 1;
                        return(new StdNode(elts[idx], hashcodes[idx], left, node));
                    }
                    else // node.count >= count >= 2  =>  count >= 2
                    {
                        Node right = NewNode(node.elts, node.hashcodes, node.first + 1, node.count - 1);
                        return(new StdNode(node.elts[node.first], node.hashcodes[node.first], this, right));
                    }
                }
            }
        public void TestDeleteComplex()
        {
            var testData = TestDataGenerator.GetKeysAndValues(treeCount);
            var treeHead = new StdNode <int, string>();

            List <int> existingKeys = new List <int>(testData.Item1);
            List <int> deletedKeys  = new List <int>();

            Random rnd = new Random();

            for (int i = 0; i < treeCount; i++)
            {
                treeHead.Insert(testData.Item1[i], testData.Item2[i]);
            }

            while (existingKeys.Count > 0)
            {
                foreach (int key in existingKeys)
                {
                    Assert.AreEqual(Convert.ToString(key), treeHead.Find(key));
                }

                int keyToDelete = existingKeys[rnd.Next(0, existingKeys.Count - 1)];

                treeHead.Delete(keyToDelete);
                deletedKeys.Add(keyToDelete);
                existingKeys.RemoveAll(x => x == keyToDelete);

                int deletedKeyToFind = deletedKeys[rnd.Next(0, deletedKeys.Count - 1)];

                Assert.AreEqual(null, treeHead.Find(deletedKeyToFind));
            }
        }
        public void TestCreateTree()
        {
            //var treeHead = MockFabric.GetMockForBSTree(TestDataGenerator.GetKeysAndValues(treeCount)).Object;
            var treeHead = new StdNode<int, string>();

            for (int i = 0; i < treeCount; i++)
                treeHead.Insert(i, Convert.ToString(i));
        }
Ejemplo n.º 4
0
            ////////////////////////////////////////////////////////////////////////////

            public StdNode Insert(Obj elt, uint hashcode)
            {
                Node right = null, left = null;

                int lastIdx = first + count - 1;
                int idx     = EltIdx(elt, hashcode);

                if (idx >= 0)
                {
                    // <elt> was found
                    int leftCount = idx - first;
                    if (leftCount > 1)
                    {
                        left = NewNode(elts, hashcodes, first, leftCount);
                    }
                    else if (leftCount == 1)
                    {
                        left = new StdNode(elts[first], hashcodes[first]);
                    }

                    int rightCount = lastIdx - idx;
                    if (rightCount > 1)
                    {
                        right = NewNode(elts, hashcodes, idx + 1, rightCount);
                    }
                    else if (rightCount == 1)
                    {
                        right = new StdNode(elts[lastIdx], hashcodes[lastIdx]);
                    }
                }
                else
                {
                    // <elt> was not found
                    int insIdx = -idx - 1;

                    int leftCount = insIdx - first;
                    if (leftCount > 1)
                    {
                        left = NewNode(elts, hashcodes, first, leftCount);
                    }
                    else if (leftCount == 1)
                    {
                        left = new StdNode(elts[first], hashcodes[first]);
                    }

                    int rightCount = lastIdx - insIdx + 1;
                    if (rightCount > 1)
                    {
                        right = NewNode(elts, hashcodes, insIdx, rightCount);
                    }
                    else if (rightCount == 1)
                    {
                        right = new StdNode(elts[insIdx], hashcodes[insIdx]);
                    }
                }

                return(new StdNode(elt, hashcode, left, right));
            }
Ejemplo n.º 5
0
        protected StdNode <int, string> GetTree(int count)
        {
            var treeHead = new StdNode <int, string>();
            var testData = TestDataGenerator.GetKeysAndValues(count);

            FillTreeByTestData(treeHead, testData);

            return(treeHead);
        }
Ejemplo n.º 6
0
        protected void FillTreeByTestData(StdNode <int, string> head, Tuple <int[], string[]> data)
        {
            var keys   = data.Item1;
            var values = data.Item2;

            for (int i = 0; i < keys.Length; i++)
            {
                head.Insert(keys[i], values[i]);
            }
        }
        public void TestCreateTree()
        {
            //var treeHead = MockFabric.GetMockForBSTree(TestDataGenerator.GetKeysAndValues(treeCount)).Object;
            var treeHead = new StdNode <int, string>();

            for (int i = 0; i < treeCount; i++)
            {
                treeHead.Insert(i, Convert.ToString(i));
            }
        }
Ejemplo n.º 8
0
            internal StdNode(Obj key, Obj value, uint hashcode, Node left, Node right)
            {
                this.key      = key;
                this.value    = value;
                this.hashcode = hashcode;
                this.size     = 1 + (left != null ? left.Size() : 0) + (right != null ? right.Size() : 0);
                this.left     = left;
                this.right    = right;

                if (left != null)
                {
                    if (left is StdNode)
                    {
                        StdNode node = (StdNode)left;
                        Debug.Assert(
                            node.hashcode < hashcode || (node.hashcode == hashcode && node.key.QuickOrder(key) < 0)
                            );
                    }
                    else
                    {
                        ArraysNode node = (ArraysNode)left;
                        int        last = node.first + node.count - 1;
                        Debug.Assert(
                            node.hashcodes[last] < hashcode ||
                            (node.hashcodes[last] == hashcode && node.keys[last].QuickOrder(key) < 0)
                            );
                    }
                }

                if (right != null)
                {
                    if (right is StdNode)
                    {
                        StdNode node = (StdNode)right;
                        Debug.Assert(
                            hashcode < node.hashcode || (node.hashcode == hashcode && key.QuickOrder(node.key) < 0)
                            );
                    }
                    else
                    {
                        ArraysNode node  = (ArraysNode)right;
                        int        first = node.first;
                        Debug.Assert(
                            hashcode < node.hashcodes[first] ||
                            (node.hashcodes[first] == hashcode && key.QuickOrder(node.keys[first]) < 0)
                            );
                    }
                }
            }
        public void TestInsertAndFind()
        {
            var testData = TestDataGenerator.GetKeysAndValues(treeCount);
            //var treeHead = MockFabric.GetMockForBSTree(testData).Object;
            var treeHead = new StdNode <int, string>();

            for (int i = 0; i < treeCount; i++)
            {
                treeHead.Insert(testData.Item1[i], testData.Item2[i]);
            }

            for (int i = 0; i < treeCount; i++)
            {
                Assert.AreEqual(testData.Item2[i], treeHead.Find(testData.Item1[i]));
            }
        }
Ejemplo n.º 10
0
        public void TestDelete3()
        {
            var treeHead = new StdNode<int, string>();
            var keys = new List<int>(new int[] { 10, 5, 15, 12, 17, 18 });
            var keyToDelete = keys[2];

            foreach (int key in keys)
                treeHead.Insert(key, Convert.ToString(key));

            treeHead.Delete(keyToDelete);
            keys.Remove(keyToDelete);

            Assert.AreEqual(null, treeHead.Find(keyToDelete));

            foreach (int key in keys)
                Assert.AreEqual(Convert.ToString(key), treeHead.Find(key));
        }
Ejemplo n.º 11
0
        public void TestDelete3()//удаление узла с обоими потомками, но у правого потомка нет левой ветви
        {
            var treeHead    = new StdNode <int, string>();
            var keys        = new List <int>(new int[] { 10, 5, 15, 12, 17, 18 });
            var keyToDelete = keys[2];

            foreach (int key in keys)
            {
                treeHead.Insert(key, Convert.ToString(key));
            }

            treeHead.Delete(keyToDelete);
            keys.Remove(keyToDelete);

            Assert.AreEqual(null, treeHead.Find(keyToDelete));

            foreach (int key in keys)
            {
                Assert.AreEqual(Convert.ToString(key), treeHead.Find(key));
            }
        }
Ejemplo n.º 12
0
        public void TestDelete2()//удаление узла с одним из потомков
        {
            var treeHead    = new StdNode <int, string>();
            var keys        = new List <int>(new int[] { 10, 5, 15, 12 });
            var keyToDelete = keys[2];

            foreach (int key in keys)
            {
                treeHead.Insert(key, Convert.ToString(key));
            }

            treeHead.Delete(keyToDelete);
            keys.Remove(keyToDelete);

            Assert.AreEqual(null, treeHead.Find(keyToDelete));

            foreach (int key in keys)
            {
                Assert.AreEqual(Convert.ToString(key), treeHead.Find(key));
            }
        }
Ejemplo n.º 13
0
        public void TestInsertAndFind()
        {
            var testData = TestDataGenerator.GetKeysAndValues(treeCount);
            //var treeHead = MockFabric.GetMockForBSTree(testData).Object;
            var treeHead = new StdNode<int, string>();

            for (int i = 0; i < treeCount; i++)
                treeHead.Insert(testData.Item1[i], testData.Item2[i]);

            for (int i = 0; i < treeCount; i++)
                Assert.AreEqual(testData.Item2[i], treeHead.Find(testData.Item1[i]));
        }
Ejemplo n.º 14
0
        public void TestDeleteComplex()
        {
            var testData = TestDataGenerator.GetKeysAndValues(treeCount);
            var treeHead = new StdNode<int, string>();

            List<int> existingKeys = new List<int>(testData.Item1);
            List<int> deletedKeys = new List<int>();

            Random rnd = new Random();

            for (int i = 0; i < treeCount; i++)
                treeHead.Insert(testData.Item1[i], testData.Item2[i]);

            while (existingKeys.Count > 0)
            {
                foreach (int key in existingKeys)
                    Assert.AreEqual(Convert.ToString(key), treeHead.Find(key));

                int keyToDelete = existingKeys[rnd.Next(0, existingKeys.Count - 1)];

                treeHead.Delete(keyToDelete);
                deletedKeys.Add(keyToDelete);
                existingKeys.RemoveAll(x => x == keyToDelete);

                int deletedKeyToFind = deletedKeys[rnd.Next(0, deletedKeys.Count - 1)];

                Assert.AreEqual(null, treeHead.Find(deletedKeyToFind));
            }
        }