static void RandomRangeInsert(btree bt, int[] range, System.Diagnostics.Stopwatch sw, bool recursv = false) { int constthread = 4; if (range.Length > (2 ^ 8) && !recursv) { for (int i = 1, cnt = 1; cnt <= constthread; cnt++) { int start = i; int end = (range.Length / constthread) * cnt; i = end; var t = new Task(() => { int[] rng = Enumerable.Range(start, end - start).ToArray(); RandomRangeInsert(bt, rng, sw, true); }); t.Start(); wh.Add(t); } } else { var sw2 = new System.Diagnostics.Stopwatch(); var rand = new Random(); for (int j = 0; j < range.Length; j++) { int rnd = rand.Next(range.First(), range.Last()); sw2.Start(); bt.Insert(rnd); sw2.Stop(); } //Console.WriteLine("Time taken to randomly insert {0} nodes: {1}ms", range.Length, sw2.Elapsed.TotalMilliseconds); } }
static void UnBalancedRangeInsert(btree bt, int[] range, bool recursv = false) { int constthread = 4; if (range.Length > (2 ^ 12) && !recursv) { for (int i = 2, count = 1; count < 5; i *= 2, count++) { for (int j = (range.Length / i); j < range.Length; j += (range.Length / i)) { bt.Insert(range[j]); } } System.Collections.Generic.List<Task> wh = new List<Task>(); for (int i = 1, cnt = 1; cnt <= constthread; i += (range.Length / constthread), cnt++) { int start = i; int end = (range.Length / constthread) * cnt; var t = new Task(() => { int[] rng = Enumerable.Range(start, end).ToArray(); UnBalancedRangeInsert(bt, rng, true); }); t.Start(); wh.Add(t); } //Task.WaitAll(wh.ToArray()); } else { for (int i = 1; i < range.Length; i++) { bt.Insert(range[i]); } } }
static void BalancedRangeInsert(btree bt, int[] range, System.Diagnostics.Stopwatch sw, bool recursv = false) { int constthread = 4; if (range.Length > (2 ^ 8) && !recursv) { for (int i = 2, count = 1; count < 5; i *= 2, count++) { for (int j = (range.Length / i); j < range.Length; j += (range.Length / i)) { bt.Insert(range[j]); } } for (int i = 1, cnt = 1; cnt <= constthread; cnt++) { int start = i; int end = (range.Length / constthread) * cnt; i = end; var t = new Task(() => { int[] rng = Enumerable.Range(start, end - start).ToArray(); BalancedRangeInsert(bt, rng, sw, true); }); t.Start(); wh.Add(t); } } else { var sw2 = new System.Diagnostics.Stopwatch(); for (int i = 2; i < range.Length; i *= 2) { for (int j = (range.Length / i); j < range.Length; j += (range.Length / i)) { int skip = 0; if (i > 2) { // Skip the previous round skip = (range.Length / (i / 2)); } if (j != skip) { sw2.Start(); bt.Insert(range[j]); sw2.Stop(); } } //Console.WriteLine("Time taken to balance insert {0} nodes: {1}ms", range.Length, sw2.Elapsed.TotalMilliseconds); } } }