Skip to content

Commit 3f3242b

Browse files
committed
[IndexedTree] Indexed Tree example
1 parent 19597ce commit 3f3242b

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package IndexedTree;
2+
3+
import java.util.Arrays;
4+
5+
public class IndexedTreeTest {
6+
7+
public static void main(String[] args) {
8+
int[] inputs = {0, 3, 2, 4, 5, 1, 6, 2, 7};
9+
// depth 3 => leaf 8๊ฐœ
10+
11+
IndexedTree it = new IndexedTree(inputs);
12+
System.out.println(it);
13+
14+
it.makeTree(1, 1, it.leafSize);
15+
System.out.println(it);
16+
17+
System.out.println(it.query(1, 1, it.leafSize, 3, 7));
18+
19+
// index 3์„ 4 -> 3์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
20+
int targetIndex = 3;
21+
int targetValue = 3;
22+
int diff = targetValue - it.nums[targetIndex];
23+
it.update(1, 1, it.leafSize, 3, diff);
24+
it.nums[targetIndex] = targetValue;
25+
System.out.println(it);
26+
}
27+
}
28+
29+
class IndexedTree {
30+
int[] tree;
31+
int[] nums;
32+
int leafSize, depth;
33+
34+
public IndexedTree(int[] nums){
35+
this.nums = nums;
36+
this.depth = 0;
37+
while (Math.pow(2, depth) < nums.length - 1) {
38+
this.depth ++;
39+
}
40+
this.leafSize = (int) Math.pow(2, depth);
41+
this.tree = new int[(int) Math.pow(2, depth + 1)];
42+
}
43+
44+
// ๋‚ด๋ถ€ ๋…ธ๋“œ์— ๊ฐ’์„ ์ฑ„์›Œ์ค€๋‹ค.
45+
public int makeTree(int node, int left, int right){
46+
// leaf์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ
47+
if (left == right) {
48+
if (left <= nums.length - 1) {
49+
return tree[node] = nums[left];
50+
} else {
51+
return tree[node] = 0;
52+
}
53+
}
54+
// ๋‚ด๋ถ€ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
55+
int mid = (left + right) / 2;
56+
tree[node] = makeTree(node * 2, left, mid);
57+
tree[node] += makeTree(node * 2 + 1, mid + 1, right);
58+
return tree[node];
59+
}
60+
61+
// ์›ํ•˜๋Š” ๊ตฌ๊ฐ„์˜ ํ•ฉ or ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ตฌํ•œ๋‹ค.
62+
public int query(int node, int left, int right, int qLeft, int qRight){
63+
if (qRight < left || qLeft > right){ // ๊ด€๋ จ์ด ์—†๋Š” ๊ฒฝ์šฐ
64+
return 0;
65+
} else if (qLeft <= left && right <= qRight) { // ์ฟผ๋ฆฌ์— ์™„์ „ํžˆ ์†ํ•˜๋Š” ๊ฒฝ์šฐ
66+
return tree[node];
67+
} else { // ๊ทธ ์™ธ : ์• ๋งคํ•˜๊ฒŒ ๊ฑธ์ณ์žˆ๋Š” ๊ฒฝ์šฐ
68+
int mid = (left + right) / 2;
69+
return query(node * 2, left, mid, qLeft, qRight)
70+
+ query(node * 2 + 1,mid + 1, right, qLeft, qRight);
71+
}
72+
}
73+
74+
// ํŠน์ •๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
75+
public void update(int node, int left, int right, int index, int diff){
76+
if (index < left || right < index) {
77+
return;
78+
} else {
79+
tree[node] += diff;
80+
if (left != right) {
81+
int mid = (left + right) / 2;
82+
update(node * 2, left, mid, index, diff);
83+
update(node * 2 + 1, mid + 1, right, index, diff);
84+
}
85+
}
86+
}
87+
88+
@Override
89+
public String toString() {
90+
return "IndexedTree{" +
91+
"tree=" + Arrays.toString(tree) +
92+
", nums=" + Arrays.toString(nums) +
93+
", leafSize=" + leafSize +
94+
", depth=" + depth +
95+
'}';
96+
}
97+
}

0 commit comments

Comments
ย (0)