public void BTree_AccuracyTest() { var nodeCount = 1000; var rnd = new Random(); var randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); var order = 5; var tree = new BTree <int>(order); for (int i = 0; i < nodeCount; i++) { tree.Insert(randomNumbers[i]); var actualMaxHeight = BTreeTester.GetMaxHeight(tree.Root); var actualMinHeight = BTreeTester.GetMinHeight(tree.Root); Assert.IsTrue(actualMaxHeight == actualMinHeight); //https://en.wikipedia.org/wiki/B-tree#Best_case_and_worst_case_heights var theoreticalMaxHeight = Math.Ceiling(Math.Log((i + 2) / 2, (int)Math.Ceiling((double)order / 2))); Assert.IsTrue(actualMaxHeight <= theoreticalMaxHeight); Assert.IsTrue(tree.Count == i + 1); Assert.IsTrue(tree.HasItem(randomNumbers[i])); } for (int i = 0; i < nodeCount; i++) { Assert.IsTrue(tree.HasItem(randomNumbers[i])); } Assert.AreEqual(tree.Max, randomNumbers.Max()); Assert.AreEqual(tree.Min, randomNumbers.Min()); //shuffle again before deletion tests randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); for (int i = 0; i < nodeCount; i++) { tree.Delete(randomNumbers[i]); Assert.IsFalse(tree.HasItem(randomNumbers[i])); var actualMaxHeight = BTreeTester.GetMaxHeight(tree.Root); var actualMinHeight = BTreeTester.GetMinHeight(tree.Root); Assert.IsTrue(actualMaxHeight == actualMinHeight); //https://en.wikipedia.org/wiki/B-tree#Best_case_and_worst_case_heights var theoreticalMaxHeight = Math.Ceiling(Math.Log((nodeCount - i + 2) / 2, (int)Math.Ceiling((double)order / 2))); Assert.IsTrue(actualMaxHeight <= theoreticalMaxHeight); Assert.IsTrue(tree.Count == nodeCount - 1 - i); } Assert.IsTrue(tree.Count == 0); }
public void BPTree_AccuracyTest() { var nodeCount = 1000; var rnd = new Random(); var randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); var order = 5; var tree = new BPTree <int>(order); for (int i = 0; i < nodeCount; i++) { tree.Insert(randomNumbers[i]); var actualMaxHeight = BTreeTester.GetMaxHeight(tree.Root); var actualMinHeight = BTreeTester.GetMinHeight(tree.Root); Assert.IsTrue(actualMaxHeight == actualMinHeight); //https://en.wikipedia.org/wiki/B-tree#Best_case_and_worst_case_heights var theoreticalMaxHeight = Math.Ceiling(Math.Log((i + 2) / 2, (int)Math.Ceiling((double)order / 2))) + 1; Assert.IsTrue(actualMaxHeight <= theoreticalMaxHeight); Assert.IsTrue(tree.Count == i + 1); Assert.IsTrue(tree.HasItem(randomNumbers[i])); } for (int i = 0; i < nodeCount; i++) { Assert.IsTrue(tree.HasItem(randomNumbers[i])); } Assert.AreEqual(tree.Max, randomNumbers.Max()); Assert.AreEqual(tree.Min, randomNumbers.Min()); //check that the elements are in sorted order //since B+ tree stores all elements in leaves in sorted order from left to right int j = 1; foreach (var element in tree) { Assert.AreEqual(j, element); j++; } //shuffle again before deletion tests randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); for (int i = 0; i < nodeCount; i++) { tree.Delete(randomNumbers[i]); Assert.IsFalse(tree.HasItem(randomNumbers[i])); var actualMaxHeight = BTreeTester.GetMaxHeight(tree.Root); var actualMinHeight = BTreeTester.GetMinHeight(tree.Root); Assert.IsTrue(actualMaxHeight == actualMinHeight); //https://en.wikipedia.org/wiki/B-tree#Best_case_and_worst_case_heights var theoreticalMaxHeight = i == nodeCount - 1 ? 0 : Math.Ceiling(Math.Log((nodeCount - i - 1 + 1) / 2, (int)Math.Ceiling((double)order / 2))) + 1; Assert.IsTrue(actualMaxHeight <= theoreticalMaxHeight); Assert.IsTrue(tree.Count == nodeCount - 1 - i); } Assert.IsTrue(BTreeTester.GetMaxHeight(tree.Root) == 0); Assert.IsTrue(tree.Count == 0); }