public void RUPQBinaryIndexedTree() { var rand = new Random(); for (int a = 0; a < _sourceArrays.Length; ++a) { int[] sourceArray = _sourceArrays[a]; var rupqBinaryIndexedTree = new RUPQBinaryIndexedTree(sourceArray); for (int r = 0; r < 1000; ++r) { int firstIndex = rand.Next(0, sourceArray.Length); int secondIndex = rand.Next(0, sourceArray.Length); int startIndex = Math.Min(firstIndex, secondIndex); int endIndex = Math.Max(firstIndex, secondIndex); int mode = rand.Next(2); if (mode == 0) { NaiveBinaryIndexedTreeAlternatives.RangeUpdate(sourceArray, startIndex, endIndex, delta: r); rupqBinaryIndexedTree.RangeUpdate(startIndex, endIndex, delta: r); } else { int expected = NaiveBinaryIndexedTreeAlternatives.ValueQuery(sourceArray, firstIndex); Assert.AreEqual(expected, rupqBinaryIndexedTree.ValueQuery(firstIndex)); } } } }
private void NaiveRangeUpdate() { for (int i = 0; i < _randomRangesCount; ++i) { Tuple <int, int> range = _randomRanges[i]; NaiveBinaryIndexedTreeAlternatives.RangeUpdate(_array, range.Item1, range.Item2, 1); } }
private void NaiveSumQuery() { for (int i = 0; i < _randomRangesCount; ++i) { Tuple <int, int> range = _randomRanges[i]; NaiveBinaryIndexedTreeAlternatives.SumQuery(_array, range.Item1, range.Item2); } }
private void NaiveRandomOperation() { for (int i = 0; i < _randomRangesCount; ++i) { Tuple <int, int> range = _randomRanges[i]; if (range.Item1 % 2 == 0) { NaiveBinaryIndexedTreeAlternatives.SumQuery(_array, range.Item1, range.Item2); } else { NaiveBinaryIndexedTreeAlternatives.RangeUpdate(_array, range.Item1, range.Item2, 1); } } }
public void PURQBinaryIndexedTree2D_2() { var rand = new Random(); for (int rowCount = 1; rowCount < 10; ++rowCount) { for (int columnCount = 1; columnCount < 10; ++columnCount) { int[,] sourceArray = new int[rowCount, columnCount]; var purqBinaryIndexedTree2D = new PURQBinaryIndexedTree2D(rowCount, columnCount); for (int r = 0; r < 100; ++r) { int rowIndex1 = rand.Next(0, rowCount); int rowIndex2 = rand.Next(0, rowCount); int columnIndex1 = rand.Next(0, columnCount); int columnIndex2 = rand.Next(0, columnCount); int nearRowIndex = Math.Min(rowIndex1, rowIndex2); int nearColumnIndex = Math.Min(columnIndex1, columnIndex2); int farRowIndex = Math.Max(rowIndex1, rowIndex2); int farColumnIndex = Math.Max(columnIndex1, columnIndex2); int mode = rand.Next(2); if (mode == 0) { NaiveBinaryIndexedTreeAlternatives.PointUpdate(sourceArray, nearRowIndex, farColumnIndex, delta: r); purqBinaryIndexedTree2D.PointUpdate(nearRowIndex, farColumnIndex, delta: r); } else { int expected = NaiveBinaryIndexedTreeAlternatives.SumQuery(sourceArray, nearRowIndex, nearColumnIndex, farRowIndex, farColumnIndex); Assert.AreEqual(expected, purqBinaryIndexedTree2D.SumQuery( nearRowIndex, nearColumnIndex, farRowIndex, farColumnIndex)); } } } } }