package org.sglj.util.struct; import java.util.Random; import org.junit.Test; import org.sglj.util.struct.ImmutableFenwickTree; public class FenwickTreeSpeedTest { static Random RANDOM = new Random(); @Test public void testLeft1() { randomTest(1000, 1000, false); } @Test public void testLeft2() { randomTest(10000, 10000, false); } @Test public void testLeft3() { randomTest(100000, 100000, false); } @Test public void testLeft4() { randomTest(200000, 200000, false); } @Test public void testLeft5() { randomTest(400000, 400000, false); } @Test public void testRight1() { randomTest(1000, 1000, true); } @Test public void testRight2() { randomTest(10000, 10000, true); } @Test public void testRight3() { randomTest(100000, 100000, true); } @Test public void testRight4() { randomTest(200000, 200000, true); } @Test public void testRight5() { randomTest(400000, 400000, true); } static void randomTest(final int n, int q, boolean rightToLeft) { Integer[] arr = new Integer[n]; for (int i = 0; i < n; ++i) { arr[i] = RANDOM.nextInt(); } FTMin ft = new FTMin(arr, rightToLeft); while (q-- > 0) { int to = RANDOM.nextInt(n + 1); ft.retrieveQuery(to); } } private static class FTMin extends ImmutableFenwickTree<Integer, Integer> { public FTMin(int size, boolean rightToLeft) { super(size, rightToLeft); } public FTMin(Integer[] elements, boolean rightToLeft) { super(elements, rightToLeft); } @Override public Integer mergeCodomains(Integer a, Integer b) { return Math.min(a, b); } @Override protected Integer createData(Integer element) { return element != null ? element : Integer.MAX_VALUE; } } }