📄 redblacktests.cs
字号:
Assert.AreEqual(11, index);
}
/// <summary>
/// Insert values into tree using replace policy and then find values in the tree.
/// </summary>
[Test] public void ReplaceFind() {
tree = new RedBlackTree<TestItem>(new DataComparer());
InsertValidate("m", 101, DuplicatePolicy.ReplaceFirst, 0);
FindOnlyKey("m", 101);
InsertValidate("b", 102, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("t", 103, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("m", 201, DuplicatePolicy.ReplaceFirst, 101);
FindOnlyKey("b", 102);
FindOnlyKey("t", 103);
InsertValidate("o", 104, DuplicatePolicy.ReplaceFirst, 0);
FindOnlyKey("b", 102);
InsertValidate("z", 105, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("g", 106, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("b", 202, DuplicatePolicy.ReplaceFirst, 102);
FindOnlyKey("g", 106);
InsertValidate("g", 206, DuplicatePolicy.ReplaceFirst, 106);
InsertValidate("a5", 107, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("t", 203, DuplicatePolicy.ReplaceFirst, 103);
InsertValidate("c", 8, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("a2", 9, DuplicatePolicy.ReplaceFirst, 0);
FindOnlyKey("z", 105);
InsertValidate("a7", 10, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("i", 11, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("h", 112, DuplicatePolicy.ReplaceFirst, 0);
InsertValidate("z", 205, DuplicatePolicy.ReplaceFirst, 105);
InsertValidate("a2", 209, DuplicatePolicy.ReplaceFirst, 9);
InsertValidate("c", 208, DuplicatePolicy.ReplaceFirst, 8);
InsertValidate("i", 211, DuplicatePolicy.ReplaceFirst, 11);
InsertValidate("h", 212, DuplicatePolicy.ReplaceFirst, 112);
Assert.AreEqual(12, tree.ElementCount, "Wrong number of items in the tree.");
FindOnlyKey("m", 201);
FindOnlyKey("b", 202);
FindOnlyKey("t", 203);
FindOnlyKey("o", 104);
FindOnlyKey("z", 205);
FindOnlyKey("g", 206);
FindOnlyKey("a5", 107);
FindOnlyKey("c", 208);
FindOnlyKey("a2", 209);
FindOnlyKey("a7", 10);
FindOnlyKey("i", 211);
FindOnlyKey("h", 212);
}
/// <summary>
/// Insert values into tree using "do-nothing" policy and then find values in the tree.
/// </summary>
[Test] public void DoNothingFind() {
tree = new RedBlackTree<TestItem>(new DataComparer());
InsertValidate("m", 101, DuplicatePolicy.DoNothing, 0);
FindOnlyKey("m", 101);
InsertValidate("b", 102, DuplicatePolicy.DoNothing, 0);
InsertValidate("t", 103, DuplicatePolicy.DoNothing, 0);
InsertValidate("m", 201, DuplicatePolicy.DoNothing, 101);
FindOnlyKey("b", 102);
FindOnlyKey("t", 103);
InsertValidate("o", 104, DuplicatePolicy.DoNothing, 0);
FindOnlyKey("b", 102);
InsertValidate("z", 105, DuplicatePolicy.DoNothing, 0);
InsertValidate("g", 106, DuplicatePolicy.DoNothing, 0);
InsertValidate("b", 202, DuplicatePolicy.DoNothing, 102);
FindOnlyKey("g", 106);
InsertValidate("g", 206, DuplicatePolicy.DoNothing, 106);
InsertValidate("a5", 107, DuplicatePolicy.DoNothing, 0);
InsertValidate("t", 203, DuplicatePolicy.DoNothing, 103);
InsertValidate("c", 8, DuplicatePolicy.DoNothing, 0);
InsertValidate("a2", 9, DuplicatePolicy.DoNothing, 0);
FindOnlyKey("z", 105);
InsertValidate("a7", 10, DuplicatePolicy.DoNothing, 0);
InsertValidate("i", 11, DuplicatePolicy.DoNothing, 0);
InsertValidate("h", 112, DuplicatePolicy.DoNothing, 0);
InsertValidate("z", 205, DuplicatePolicy.DoNothing, 105);
InsertValidate("a2", 209, DuplicatePolicy.DoNothing, 9);
InsertValidate("c", 208, DuplicatePolicy.DoNothing, 8);
InsertValidate("i", 211, DuplicatePolicy.DoNothing, 11);
InsertValidate("h", 212, DuplicatePolicy.DoNothing, 112);
InsertValidate("m", 401, DuplicatePolicy.DoNothing, 101);
Assert.AreEqual(12, tree.ElementCount, "Wrong number of items in the tree.");
FindOnlyKey("m", 101);
FindOnlyKey("b", 102);
FindOnlyKey("t", 103);
FindOnlyKey("o", 104);
FindOnlyKey("z", 105);
FindOnlyKey("g", 106);
FindOnlyKey("a5", 107);
FindOnlyKey("c", 8);
FindOnlyKey("a2", 9);
FindOnlyKey("a7", 10);
FindOnlyKey("i", 11);
FindOnlyKey("h", 112);
}
/// <summary>
/// Insert values into tree using insert-first policy and then find values in the tree.
/// </summary>
[Test] public void InsertFirstFind() {
tree = new RedBlackTree<TestItem>(new DataComparer());
InsertValidate("m", 101, DuplicatePolicy.InsertFirst, 0);
FindOnlyKey("m", 101);
InsertValidate("b", 102, DuplicatePolicy.InsertFirst, 0);
InsertValidate("t", 103, DuplicatePolicy.InsertFirst, 0);
InsertValidate("m", 201, DuplicatePolicy.InsertFirst, 101);
FindOnlyKey("b", 102);
FindOnlyKey("t", 103);
InsertValidate("o", 104, DuplicatePolicy.InsertFirst, 0);
FindOnlyKey("b", 102);
InsertValidate("z", 105, DuplicatePolicy.InsertFirst, 0);
InsertValidate("g", 106, DuplicatePolicy.InsertFirst, 0);
InsertValidate("b", 202, DuplicatePolicy.InsertFirst, 102);
FindOnlyKey("g", 106);
InsertValidate("g", 206, DuplicatePolicy.InsertFirst, 106);
InsertValidate("a5", 107, DuplicatePolicy.InsertFirst, 0);
InsertValidate("t", 203, DuplicatePolicy.InsertFirst, 103);
InsertValidate("c", 8, DuplicatePolicy.InsertFirst, 0);
InsertValidate("a2", 9, DuplicatePolicy.InsertFirst, 0);
FindOnlyKey("z", 105);
InsertValidate("a7", 10, DuplicatePolicy.InsertFirst, 0);
InsertValidate("i", 11, DuplicatePolicy.InsertFirst, 0);
InsertValidate("h", 112, DuplicatePolicy.InsertFirst, 0);
InsertValidate("z", 205, DuplicatePolicy.InsertFirst, 105);
InsertValidate("a2", 209, DuplicatePolicy.InsertFirst, 9);
InsertValidate("c", 208, DuplicatePolicy.InsertFirst, 8);
InsertValidate("i", 211, DuplicatePolicy.InsertFirst, 11);
InsertValidate("h", 212, DuplicatePolicy.InsertFirst, 112);
Assert.AreEqual(21, tree.ElementCount, "Wrong number of items in the tree.");
FindLastKey("m", 101);
FindLastKey("b", 102);
FindLastKey("t", 103);
FindLastKey("o", 104);
FindLastKey("z", 105);
FindLastKey("g", 106);
FindLastKey("a5", 107);
FindLastKey("c", 8);
FindLastKey("a2", 9);
FindLastKey("a7", 10);
FindLastKey("i", 11);
FindLastKey("h", 112);
FindFirstKey("m", 201);
FindFirstKey("b", 202);
FindFirstKey("t", 203);
FindFirstKey("o", 104);
FindFirstKey("z", 205);
FindFirstKey("g", 206);
FindFirstKey("a5", 107);
FindFirstKey("c", 208);
FindFirstKey("a2", 209);
FindFirstKey("a7", 10);
FindFirstKey("i", 211);
FindFirstKey("h", 212);
CheckAllIndices();
}
/// <summary>
/// Insert values into tree using insert-last policy and then find values in the tree.
/// </summary>
[Test] public void InsertLastFind() {
tree = new RedBlackTree<TestItem>(new DataComparer());
InsertValidate("m", 101, DuplicatePolicy.InsertLast, 0);
FindOnlyKey("m", 101);
InsertValidate("b", 102, DuplicatePolicy.InsertLast, 0);
InsertValidate("t", 103, DuplicatePolicy.InsertLast, 0);
InsertValidate("m", 201, DuplicatePolicy.InsertLast, 101);
FindOnlyKey("b", 102);
FindOnlyKey("t", 103);
InsertValidate("o", 104, DuplicatePolicy.InsertLast, 0);
FindOnlyKey("b", 102);
InsertValidate("z", 105, DuplicatePolicy.InsertLast, 0);
InsertValidate("g", 106, DuplicatePolicy.InsertLast, 0);
InsertValidate("b", 202, DuplicatePolicy.InsertLast, 102);
FindOnlyKey("g", 106);
InsertValidate("g", 206, DuplicatePolicy.InsertLast, 106);
InsertValidate("a5", 107, DuplicatePolicy.InsertLast, 0);
InsertValidate("t", 203, DuplicatePolicy.InsertLast, 103);
InsertValidate("c", 8, DuplicatePolicy.InsertLast, 0);
InsertValidate("a2", 9, DuplicatePolicy.InsertLast, 0);
FindOnlyKey("z", 105);
InsertValidate("a7", 10, DuplicatePolicy.InsertLast, 0);
InsertValidate("i", 11, DuplicatePolicy.InsertLast, 0);
InsertValidate("h", 112, DuplicatePolicy.InsertLast, 0);
InsertValidate("z", 205, DuplicatePolicy.InsertLast, 105);
InsertValidate("a2", 209, DuplicatePolicy.InsertLast, 9);
InsertValidate("c", 208, DuplicatePolicy.InsertLast, 8);
InsertValidate("i", 211, DuplicatePolicy.InsertLast, 11);
InsertValidate("h", 212, DuplicatePolicy.InsertLast, 112);
Assert.AreEqual(21, tree.ElementCount, "Wrong number of items in the tree.");
FindFirstKey("m", 101);
FindFirstKey("b", 102);
FindFirstKey("t", 103);
FindFirstKey("o", 104);
FindFirstKey("z", 105);
FindFirstKey("g", 106);
FindFirstKey("a5", 107);
FindFirstKey("c", 8);
FindFirstKey("a2", 9);
FindFirstKey("a7", 10);
FindFirstKey("i", 11);
FindFirstKey("h", 112);
FindLastKey("m", 201);
FindLastKey("b", 202);
FindLastKey("t", 203);
FindLastKey("o", 104);
FindLastKey("z", 205);
FindLastKey("g", 206);
FindLastKey("a5", 107);
FindLastKey("c", 208);
FindLastKey("a2", 209);
FindLastKey("a7", 10);
FindLastKey("i", 211);
FindLastKey("h", 212);
CheckAllIndices();
}
/// <summary>
/// Insert values into tree delete values in the tree, making sure first/last works.
/// </summary>
[Test] public void DeleteFirstLast() {
tree = new RedBlackTree<TestItem>(new DataComparer());
InsertValidate("m", 101, DuplicatePolicy.InsertFirst);
InsertValidate("b", 102, DuplicatePolicy.InsertFirst);
InsertValidate("t", 103, DuplicatePolicy.InsertFirst);
InsertValidate("m", 201, DuplicatePolicy.InsertFirst);
InsertValidate("o", 104, DuplicatePolicy.InsertFirst);
InsertValidate("z", 105, DuplicatePolicy.InsertFirst);
InsertValidate("g", 106, DuplicatePolicy.InsertFirst);
InsertValidate("b", 202, DuplicatePolicy.InsertFirst);
InsertValidate("g", 206, DuplicatePolicy.InsertFirst);
InsertValidate("m", 301, DuplicatePolicy.InsertFirst);
InsertValidate("a5", 107, DuplicatePolicy.InsertFirst);
InsertValidate("t", 203, DuplicatePolicy.InsertFirst);
InsertValidate("c", 8, DuplicatePolicy.InsertFirst);
InsertValidate("a2", 9, DuplicatePolicy.InsertFirst);
InsertValidate("a7", 10, DuplicatePolicy.InsertFirst);
InsertValidate("i", 11, DuplicatePolicy.InsertFirst);
InsertValidate("h", 112, DuplicatePolicy.InsertFirst);
InsertValidate("m", 401, DuplicatePolicy.InsertFirst);
InsertValidate("z", 205, DuplicatePolicy.InsertFirst);
InsertValidate("a2", 209, DuplicatePolicy.InsertFirst);
InsertValidate("c", 208, DuplicatePolicy.InsertFirst);
InsertValidate("m", 501, DuplicatePolicy.InsertFirst);
InsertValidate("i", 211, DuplicatePolicy.InsertFirst);
InsertValidate("h", 212, DuplicatePolicy.InsertFirst);
InsertValidate("z", 305, DuplicatePolicy.InsertFirst);
#if DEBUG
tree.Print();
#endif //DEBUG
DeletePrintValidate("m", 101, false);
DeletePrintValidate("m", 501, true);
DeletePrintValidate("m", 201, false);
FindFirstKey("m", 401);
FindLastKey("m", 301);
DeletePrintValidate("m", 401, true);
DeletePrintValidate("m", 301, true);
DeletePrintValidate("z", 305, true);
DeletePrintValidate("z", 205, true);
DeletePrintValidate("z", 105, true);
CheckAllIndices();
}
/// <summary>
/// Delete values in the tree, making sure global first/last works.
/// </summary>
[Test]
public void GlobalDeleteFirstLast()
{
tree = new RedBlackTree<TestItem>(new DataComparer());
InsertValidate("a", 101, DuplicatePolicy.InsertLast);
InsertValidate("b", 102, DuplicatePolicy.InsertLast);
InsertValidate("t", 103, DuplicatePolicy.InsertLast);
InsertValidate("a", 201, DuplicatePolicy.InsertLast);
InsertValidate("o", 104, DuplicatePolicy.InsertLast);
InsertValidate("z", 105, DuplicatePolicy.InsertLast);
InsertValidate("g", 106, DuplicatePolicy.InsertLast);
InsertValidate("b", 202, DuplicatePolicy.InsertLast);
InsertValidate("g", 206, DuplicatePolicy.InsertLast);
InsertValidate("a", 301, DuplicatePolicy.InsertLast);
InsertValidate("a5", 107, DuplicatePolicy.InsertLast);
InsertValidate("t", 203, DuplicatePolicy.InsertLast);
InsertValidate("c", 8, DuplicatePolicy.InsertLast);
InsertValidate("a2", 9, DuplicatePolicy.InsertLast);
InsertValidate("a7", 10, DuplicatePolicy.InsertLast);
InsertValidate("i", 11, DuplicatePolicy.InsertLast);
InsertValidate("h", 112, DuplicatePolicy.InsertLast);
InsertValidate("a", 401, DuplicatePolicy.InsertLast);
InsertValidate("z", 205, DuplicatePolicy.InsertLast);
InsertValidate("a2", 209, DuplicatePolicy.InsertLast);
InsertValidate("c", 208, DuplicatePolicy.InsertLast);
InsertValidate("a", 501, DuplicatePolicy.InsertLast);
InsertValidate("i", 211, DuplicatePolicy.InsertLast);
InsertValidate("h", 212, DuplicatePolicy.InsertLast);
InsertValidate("z", 305, DuplicatePolicy.InsertLast);
GlobalDeletePrintValidate("a", 101, true);
TestItem firstItem;
Assert.IsTrue(tree.FirstItemInRange(tree.EntireRangeTester, out firstItem) == 0);
Assert.AreEqual("a", firstItem.key);
Assert.AreEqual(201, firstItem.data);
GlobalDeletePrintValidate("a", 201, true);
FindFirstKey("a", 301);
GlobalDeletePrintValidate("a", 301, true);
DeletePrintValidate("z", 305, false);
FindLastKey("z", 205);
DeletePrintValidate("z", 205, false);
TestItem lastItem;
Assert.IsTrue(tree.LastItemInRange(tree.EntireRangeTester, out lastItem) == tree.ElementCount - 1);
Assert.AreEqual("z", lastItem.key);
Assert.AreEqual(105, lastItem.data);
DeletePrintValidate("z", 105, false);
CheckAllIndices();
}
private void CheckAllIndices()
{
#if DEBUG
tree.Validate();
#endif //DEBUG
TestItem[] items = new TestItem[tree.ElementCount];
int i = 0;
foreach (TestItem item in tree)
items[i++] = item;
for (i = tree.ElementCount - 1; i >= 0; i -= 2) {
TestItem item = tree.GetItemByIndex(i);
Assert.AreEqual(item.key, items[i].key);
Assert.AreEqual(item.data, items[i].data);
}
for (i = tree.ElementCount - 2; i >= 0; i -= 2) {
TestItem item = tree.GetItemByIndex(i);
Assert.AreEqual(item.key, items[i].key);
Assert.AreEqual(item.data, items[i].data);
}
#if DEBUG
tree.Validate();
#endif //DEBUG
}
const int LENGTH = 400; // length of each random array of values.
const int ITERATIONS = 30; // number of iterations
/// <summary>
/// Create a random array of values.
/// </summary>
/// <param name="seed">Seed for random number generators</param>
/// <param name="length">Length of array</param>
/// <param name="max">Maximum value of number. Should be much
/// greater than length.</param>
/// <param name="allowDups">Whether to allow duplicate elements.</param>
/// <returns></returns>
private int[] CreateRandomArray(int seed, int length, int max, bool allowDups) {
Random rand = new Random(seed);
int[] a = new int[length];
for (int i = 0; i < a.Length; ++i)
a[i] = -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -