이 질문에 segment tree을 사용할 수 있습니다. This은 세그먼트 트리 및 범위 최소 쿼리에 대한 최고의 자습서 중 하나입니다.
JAVA 구현을 제공하고 있으며 코드는 자명하다. 의문 사항이 있으면 알려 주시기 바랍니다.
public class SegmentTree {
private int[] array;
private int length;
public static SegmentTree initialize(int[] a) {
return new SegmentTree(a);
}
private SegmentTree(int[] a) {
length = a.length - 1;
int l = (int) (Math.log(a.length)/Math.log(2));
l = (int) (Math.pow(2, l + 1) * 2 - 1);
array = new int[l];
initialize(a, 0, a.length - 1, 0);
}
private int initialize(int[] a, int p, int r, int index) {
if (p == r) {
array[index] = a[p];
return a[p];
}
int q = p + (r - p)/2;
array[index] = Math.min(initialize(a, p, q, 2 * index + 1), initialize(a, q + 1, r, 2 * index + 2));
return array[index];
}
public int findMin(int p, int r) {
return _findMin(p, r, 0, length, 0);
}
private int _findMin(int qs, int qe, int ss, int se, int i) {
if (qs <= ss && se <= qe) {
return array[i];
}
if (qs > se || qe < ss) {
return Integer.MAX_VALUE;
}
int q = ss + (se - ss)/2;
return Math.min(_findMin(qs, qe, ss, q, 2 * i + 1), _findMin(qs, qe, q + 1, se, 2 * i + 2));
}
private void print() {
int index = 0;
for (int k : array) {
System.out.println(index + ":" + k);
index++;
}
}
public static void main(String[] args) {
int[] a = {1, 34, 5, 6, 78, 5, 67, 89};
SegmentTree s = initialize(a);
System.out.println(s.findMin(2, 4));
}
}
루프가 필요해 보이는 것 같습니다. – LeeNeverGup
더 빨리 진행할 수 있습니까? –
'O (N^2)'시간에 가능한 모든 범위에 대해 결과를 한 번 미리 계산할 수 있습니다. 그 후에, 조회는 일정한 시간이 될 것입니다. 동일한 데이터를 얼마나 자주 찾아야하는지에 따라 초기 비용을 할부 상환 할 수 있습니다. –