Skip to content

Commit e1cd366

Browse files
author
Justin Wetherell
committed
Added more unit tests for interval and segment trees
1 parent 0d1ed1d commit e1cd366

File tree

4 files changed

+315
-193
lines changed

4 files changed

+315
-193
lines changed
Binary file not shown.

src/com/jwetherell/algorithms/data_structures/SegmentTree.java

+15-21
Original file line numberDiff line numberDiff line change
@@ -934,10 +934,10 @@ private static <D extends SegmentTree.Data> String getString(Segment<D> segment,
934934
children.add(c);
935935
}
936936
for (int i = 0; i < children.size() - 1; i++) {
937-
builder.append(getString(children.get(i), prefix + (isTail ? " " : " "), false));
937+
builder.append(getString(children.get(i), prefix + (isTail ? " " : "│ "), false));
938938
}
939939
if (children.size() > 1) {
940-
builder.append(getString(children.get(children.size() - 1), prefix + (isTail ? " " : " "), true));
940+
builder.append(getString(children.get(children.size() - 1), prefix + (isTail ? " " : "│ "), true));
941941
}
942942

943943
return builder.toString();
@@ -1069,9 +1069,7 @@ protected static <D extends Data> Segment<D> createFromList(int minLength,
10691069
if (segment.data == null)
10701070
segment.data = ((D) s.data.copy());
10711071
else
1072-
segment.data.combined(s.data); // Update our data to
1073-
// reflect all
1074-
// children's data
1072+
segment.data.combined(s.data); // Update our data to reflect all children's data
10751073
}
10761074

10771075
// If segment is greater or equal to two, split data into
@@ -1089,11 +1087,9 @@ protected static <D extends Data> Segment<D> createFromList(int minLength,
10891087
s2.add(s);
10901088
} else {
10911089
// Need to split across middle
1092-
NonOverlappingSegment<D> ss1 = new NonOverlappingSegment<D>(minLength, s.start, middle - 1,
1093-
s.data);
1090+
NonOverlappingSegment<D> ss1 = new NonOverlappingSegment<D>(minLength, s.start, middle - 1, s.data);
10941091
s1.add(ss1);
1095-
NonOverlappingSegment<D> ss2 = new NonOverlappingSegment<D>(minLength, middle, s.end,
1096-
s.data);
1092+
NonOverlappingSegment<D> ss2 = new NonOverlappingSegment<D>(minLength, middle, s.end, s.data);
10971093
s2.add(ss2);
10981094
}
10991095
}
@@ -1279,6 +1275,9 @@ public D query(long startOfQuery, long endOfQuery) {
12791275
e = root.end;
12801276

12811277
D result = root.query(s, e);
1278+
// reset the start and end, it can change in query
1279+
result.start = startOfQuery;
1280+
result.end = endOfQuery;
12821281
return result;
12831282
}
12841283

@@ -1306,8 +1305,9 @@ public OverlappingSegment(int minLength, long start, long end, D data) {
13061305
}
13071306

13081307
@SuppressWarnings("unchecked")
1309-
protected static <D extends Data> Segment<D> createFromList(int minLength,
1310-
List<OverlappingSegment<D>> segments, long start, int length) {
1308+
protected static <D extends Data> Segment<D> createFromList(int minLength, List<OverlappingSegment<D>> segments,
1309+
long start, int length)
1310+
{
13111311
OverlappingSegment<D> segment = new OverlappingSegment<D>(minLength);
13121312
segment.start = start;
13131313
segment.end = start + (length - 1);
@@ -1325,16 +1325,12 @@ protected static <D extends Data> Segment<D> createFromList(int minLength,
13251325
if (segment.data == null)
13261326
segment.data = ((D) s.data.copy());
13271327
else
1328-
segment.data.combined(s.data); // Update our data
1329-
// to reflect all
1330-
// children's data
1328+
segment.data.combined(s.data); // Update our data to reflect all children's data
13311329
} else if (!segment.hasChildren() && s.start >= segment.start && s.end <= segment.end) {
13321330
if (segment.data == null)
13331331
segment.data = ((D) s.data.copy());
13341332
else
1335-
segment.data.combined(s.data); // Update our data
1336-
// to reflect all
1337-
// children's data
1333+
segment.data.combined(s.data); // Update our data to reflect all children's data
13381334
}
13391335
}
13401336

@@ -1353,16 +1349,14 @@ protected static <D extends Data> Segment<D> createFromList(int minLength,
13531349
s2.add(s);
13541350
} else {
13551351
// Need to split across middle
1356-
OverlappingSegment<D> ss1 = new OverlappingSegment<D>(minLength, s.start, middle - 1,
1357-
s.data);
1352+
OverlappingSegment<D> ss1 = new OverlappingSegment<D>(minLength, s.start, middle - 1, s.data);
13581353
s1.add(ss1);
13591354
OverlappingSegment<D> ss2 = new OverlappingSegment<D>(minLength, middle, s.end, s.data);
13601355
s2.add(ss2);
13611356
}
13621357
}
13631358
Segment<D> sub1 = createFromList(minLength, s1, segment.start, segment.half);
1364-
Segment<D> sub2 = createFromList(minLength, s2, segment.start + segment.half, segment.length
1365-
- segment.half);
1359+
Segment<D> sub2 = createFromList(minLength, s2, segment.start + segment.half, segment.length - segment.half);
13661360
segment.segments = new Segment[] { sub1, sub2 };
13671361
}
13681362

src/com/jwetherell/algorithms/data_structures/test/IntervalTreeTests.java

+51-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ private static boolean collectionsEqual(Collection<?> c1, Collection<?> c2) {
2020
}
2121

2222
@Test
23-
public void testIntervalTree() {
23+
public void testLifespanIntervalTree() {
2424
// Lifespan Interval tree
2525
final String stravinsky = "Stravinsky";
2626
final String schoenberg = "Schoenberg";
@@ -51,7 +51,7 @@ public void testIntervalTree() {
5151
}
5252

5353
@Test
54-
public void testIntervalTree2() {
54+
public void testIntervalTree1() {
5555
final String RED = "RED";
5656
final String ORANGE = "ORANGE";
5757
final String GREEN = "GREEN";
@@ -89,7 +89,7 @@ public void testIntervalTree2() {
8989
}
9090

9191
@Test
92-
public void testIntervalTree3() {
92+
public void testIntervalTree2() {
9393
List<IntervalTree.IntervalData<String>> intervals = new ArrayList<IntervalTree.IntervalData<String>>();
9494
intervals.add((new IntervalTree.IntervalData<String>(1, 5, "a")));
9595
intervals.add((new IntervalTree.IntervalData<String>(2, 6, "b")));
@@ -114,4 +114,52 @@ public void testIntervalTree3() {
114114
query = tree.query(8); // Stabbing query
115115
assertTrue("Interval Tree query error. returned=" + query, collectionsEqual(query.getData(), Arrays.asList("e")));
116116
}
117+
118+
@Test
119+
public void testIntervalTree3() {
120+
List<IntervalTree.IntervalData<String>> intervals = new ArrayList<IntervalTree.IntervalData<String>>();
121+
intervals.add((new IntervalTree.IntervalData<String>(5, 20, "a")));
122+
intervals.add((new IntervalTree.IntervalData<String>(10, 30, "b")));
123+
intervals.add((new IntervalTree.IntervalData<String>(12, 15, "c")));
124+
intervals.add((new IntervalTree.IntervalData<String>(15, 20, "d")));
125+
intervals.add((new IntervalTree.IntervalData<String>(17, 19, "e")));
126+
intervals.add((new IntervalTree.IntervalData<String>(30, 40, "f")));
127+
128+
IntervalTree<String> tree = new IntervalTree<String>(intervals);
129+
130+
IntervalTree.IntervalData<String> query = tree.query(6,7); // Range query
131+
assertTrue("Interval Tree query error. returned=" + query, collectionsEqual(query.getData(), Arrays.asList("a")));
132+
}
133+
134+
@Test
135+
public void testIntervalTree4() {
136+
List<IntervalTree.IntervalData<String>> intervals = new ArrayList<IntervalTree.IntervalData<String>>();
137+
intervals.add((new IntervalTree.IntervalData<String>(15, 20, "a")));
138+
intervals.add((new IntervalTree.IntervalData<String>(4, 25, "b")));
139+
intervals.add((new IntervalTree.IntervalData<String>(3, 30, "c")));
140+
141+
IntervalTree<String> tree = new IntervalTree<String>(intervals);
142+
143+
IntervalTree.IntervalData<String> query = tree.query(26,27); // Range query
144+
assertTrue("Interval Tree query error. returned=" + query, collectionsEqual(query.getData(), Arrays.asList("c")));
145+
}
146+
147+
@Test
148+
public void testIntervalTree5() {
149+
List<IntervalTree.IntervalData<String>> intervals = new ArrayList<IntervalTree.IntervalData<String>>();
150+
intervals.add((new IntervalTree.IntervalData<String>(17, 19, "a")));
151+
intervals.add((new IntervalTree.IntervalData<String>(5, 11, "b")));
152+
intervals.add((new IntervalTree.IntervalData<String>(23, 23, "c")));
153+
intervals.add((new IntervalTree.IntervalData<String>(4, 8, "d")));
154+
intervals.add((new IntervalTree.IntervalData<String>(15, 18, "e")));
155+
intervals.add((new IntervalTree.IntervalData<String>(7, 10, "f")));
156+
157+
IntervalTree<String> tree = new IntervalTree<String>(intervals);
158+
159+
IntervalTree.IntervalData<String> query = tree.query(14,16); // Range query
160+
assertTrue("Interval Tree query error. returned=" + query, collectionsEqual(query.getData(), Arrays.asList("e")));
161+
162+
query = tree.query(12,14); // Range query
163+
assertTrue("Interval Tree query error. returned=" + query, query==null);
164+
}
117165
}

0 commit comments

Comments
 (0)