public void RedBlackTree_StressTest() { var nodeCount = 1000 * 10; var rnd = new Random(); var randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); var tree = new RedBlackTree <int>(); for (int i = 0; i < nodeCount; i++) { tree.Insert(randomNumbers[i]); Assert.IsTrue(tree.Count == i + 1); } //shuffle again before deletion tests randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); //IEnumerable test using linq Assert.AreEqual(tree.Count, tree.Count()); Assert.AreEqual(tree.Count, tree.AsEnumerableDesc().Count()); for (int i = 0; i < nodeCount; i++) { tree.Delete(randomNumbers[i]); Assert.IsTrue(tree.Count == nodeCount - 1 - i); } Assert.IsTrue(tree.Count == 0); }
public void RedBlackTree_BulkInit_Test_With_Node_LookUp() { var nodeCount = 1000; var rnd = new Random(); var sortedNumbers = Enumerable.Range(1, nodeCount).ToList(); var tree = new RedBlackTree <int>(sortedNumbers, true); Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue)); //IEnumerable test using linq Assert.AreEqual(tree.Count, tree.Count()); Assert.AreEqual(tree.Count, tree.AsEnumerableDesc().Count()); tree.Root.VerifyCount(); for (int i = 0; i < nodeCount; i++) { tree.Delete(sortedNumbers[i]); tree.Root.VerifyCount(); Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue)); var actualHeight = tree.Root.GetHeight(); //http://doctrina.org/maximum-height-of-red-black-tree.html var maxHeight = 2 * Math.Log(nodeCount + 1, 2); Assert.IsTrue(actualHeight < maxHeight); Assert.IsTrue(tree.Count == nodeCount - 1 - i); } Assert.IsTrue(tree.Count == 0); }
/// <summary> /// Time complexity: O(nlog(n)). /// </summary> public static IEnumerable <T> Sort(IEnumerable <T> enumerable, SortDirection sortDirection = SortDirection.Ascending) { //create BST var tree = new RedBlackTree <T>(); foreach (var item in enumerable) { tree.Insert(item); } return(sortDirection == SortDirection.Ascending ? tree.AsEnumerable() : tree.AsEnumerableDesc()); }
public void RedBlackTree_Smoke_Test() { //insert test var tree = new RedBlackTree <int>(); Assert.AreEqual(-1, tree.Root.GetHeight()); tree.Insert(1); tree.Insert(2); tree.Insert(3); tree.Insert(4); tree.Insert(5); tree.Insert(6); tree.Insert(7); tree.Insert(8); tree.Insert(9); tree.Insert(10); tree.Insert(11); Assert.AreEqual(11, tree.Count); //IEnumerable test using linq Assert.AreEqual(tree.Count, tree.Count()); Assert.AreEqual(tree.Count, tree.AsEnumerableDesc().Count()); //delete tree.Delete(1); tree.Delete(2); tree.Delete(3); tree.Delete(4); tree.Delete(5); tree.Delete(6); tree.Delete(7); tree.Delete(8); tree.Delete(9); tree.Delete(10); tree.Delete(11); Assert.AreEqual(0, tree.Count); }
public void RedBlackTree_Accuracy_Test() { var nodeCount = 1000; var rnd = new Random(); var sorted = Enumerable.Range(1, nodeCount).ToList(); var randomNumbers = sorted .OrderBy(x => rnd.Next()) .ToList(); var tree = new RedBlackTree <int>(); for (int i = 0; i < nodeCount; i++) { var index = tree.Insert(randomNumbers[i]); Assert.AreEqual(index, tree.IndexOf(randomNumbers[i])); Assert.IsTrue(tree.HasItem(randomNumbers[i])); Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue)); tree.Root.VerifyCount(); var actualHeight = tree.Root.GetHeight(); //http://doctrina.org/maximum-height-of-red-black-tree.html var maxHeight = 2 * Math.Log(nodeCount + 1, 2); Assert.IsTrue(actualHeight < maxHeight); Assert.IsTrue(tree.Count == i + 1); } for (int i = 0; i < sorted.Count; i++) { Assert.AreEqual(sorted[i], tree.ElementAt(i)); Assert.AreEqual(i, tree.IndexOf(sorted[i])); } //shuffle again before deletion tests randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); //IEnumerable test using linq Assert.AreEqual(tree.Count, tree.Count()); Assert.AreEqual(tree.Count, tree.AsEnumerableDesc().Count()); for (int i = 0; i < nodeCount; i++) { if (rnd.NextDouble() >= 0.5) { var index = tree.IndexOf(randomNumbers[i]); Assert.AreEqual(index, tree.Delete(randomNumbers[i])); } else { var index = tree.IndexOf(randomNumbers[i]); Assert.AreEqual(tree.ElementAt(index), randomNumbers[i]); tree.RemoveAt(index); } Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue)); tree.Root.VerifyCount(); var actualHeight = tree.Root.GetHeight(); //http://doctrina.org/maximum-height-of-red-black-tree.html var maxHeight = 2 * Math.Log(nodeCount + 1, 2); Assert.IsTrue(actualHeight < maxHeight); Assert.IsTrue(tree.Count == nodeCount - 1 - i); } Assert.IsTrue(tree.Count == 0); }