public static void DeleteTest(SequentialRBTree <long, Data> rbTree, int totalNodesToDelete, int nodesMaxKeyValue) { Console.WriteLine("************* Delete Test ***************"); Console.WriteLine(); Console.WriteLine($"We will perform {totalNodesToDelete} delete operations"); Console.WriteLine(); // generate valid deletable items var count = 0; var deleteItems = new HashSet <long>(); var rand = new Random(); while (true) { long target; while (true) { target = 1 + (long)(rand.NextDouble() * nodesMaxKeyValue); if (!deleteItems.Contains(target)) { break; } } var data = rbTree.GetData(target); if (data != null) { deleteItems.Add(data.Item1); count++; } if (count == totalNodesToDelete) { break; } } // delete test var watch = new Stopwatch(); watch.Start(); foreach (var key in deleteItems) { rbTree.Remove(key); } watch.Stop(); Console.WriteLine($"Total time spent in deletion: {watch.ElapsedMilliseconds} ms"); Console.WriteLine(); Console.WriteLine($"Node count after deletion: {rbTree.Count()}"); Console.WriteLine(); Console.WriteLine(); }
public static void InsertDeleteTest(SequentialRBTree <long, Data> rbTree, int totalNodesInTree, int totalNodesToInsert, int totalNodesToDelete, int nodesMaxKeyValue) { Console.WriteLine("************* Create Tree ***************"); Console.WriteLine(); InsertTest(rbTree, totalNodesInTree, nodesMaxKeyValue, false); Console.WriteLine($"Node count of tree: {(rbTree.Count())}"); Console.WriteLine(); Console.WriteLine($"Tree depth: {rbTree.MaxDepth()}"); Console.WriteLine(); Console.WriteLine(); // generate valid deletable items var deleteCount = 0; var deleteItems = new HashSet <long>(); var rand = new Random(); while (true) { long target; while (true) { target = 1 + (long)(rand.NextDouble() * nodesMaxKeyValue); if (!deleteItems.Contains(target)) { break; } } var data = rbTree.GetData(target); if (data != null) { deleteItems.Add(data.Item1); deleteCount++; } if (deleteCount == totalNodesToDelete) { break; } } var keysToDelete = deleteItems.ToArray(); // generate valid insertable items var insertCount = 0; var insertItems = new HashSet <long>(); while (true) { long target; while (true) { target = 1 + (long)(rand.NextDouble() * nodesMaxKeyValue); if (!insertItems.Contains(target)) { break; } } var data = rbTree.GetData(target); if (data == null) { insertItems.Add(target); insertCount++; } if (insertCount == totalNodesToInsert) { break; } } var values = insertItems.Select(i => new Tuple <long, Data>(i, new Data { Value = i.ToString() })).ToArray(); Console.WriteLine("************* Insert-Delete Test ***************"); Console.WriteLine(); Console.WriteLine($"Total nodes to insert: {totalNodesToInsert}"); Console.WriteLine($"Total nodes to delete: {totalNodesToDelete}"); Console.WriteLine(); // starting inserts var watch = new Stopwatch(); watch.Start(); foreach (var value in values) { rbTree.Add(value.Item1, value.Item2); } foreach (var key in deleteItems) { rbTree.Remove(key); } watch.Stop(); Console.WriteLine($"Total time spent in simultaneous insertion & deletion: {watch.ElapsedMilliseconds} ms"); Console.WriteLine(); Console.WriteLine($"Node count after insertion: {(rbTree.Count())}"); Console.WriteLine(); Console.WriteLine($"Tree depth: {rbTree.MaxDepth()}"); Console.WriteLine(); Console.WriteLine(); }