.c
om
an
co
ng
THUẬT TOÁN ỨNG DỤNG
cu
u
du
o
ng
th
QUY HOẠCH ĐỘNG
Range Minimum Query
Phạm Quang Dũng
Bộ môn KHMT
1
CuuDuongThanCong.com
/>
.c
om
Bài toán Range Minimum Query
RMQ
Cho dãy a[0], a[1], …, a[N-1]. Với mỗi bộ chỉ số 0 ≤ i < j
2
6
3
1
4
6
5
8
6
7
th
1
4
7
3
8
3
9
5
10 11 12
8 9 1
du
o
ng
0
2
an
co
ng
≤ N -1, hãy thực hiện truy vấn RMQ(i, j) tìm và trả về
chỉ số của phần tử nhỏ nhất trong dãy con a[i],
a[i+1],…, a[j].
cu
u
RMQ(1,7) = 3
RMQ(6,11) = 7
2
CuuDuongThanCong.com
/>
.c
om
Bài toán Range Minimum Query
RMQ
Ký hiệu M[j, i] là chỉ số phần tử nhỏ nhất của dãy a[i],
7
8
9
10
11
12
13
14
15
3
an
3
5
8
9
1
2
6
4
ng
6
7
8
9
10
11
12
13
14
15
5
6
7
8
9
10
11
12
13
14
15
cu
1
2
3
4
5
6
2
4
6
1
6
8
0
1
2
3
4
5
0
0
1
2
3
4
1
0
1
3
3
4
6
7
8
8
9
10
12
12
13
15
-
2
3
3
3
3
7
8
8
8
8
12
12
12
12
-
-
-
3
3
3
3
3
8
12
12
12
12
-
-
-
-
-
-
-
4
12
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
7
u
du
o
th
0
co
ng
a[i+2],…, a[i+2j -1] (dãy bắt đầu từ chỉ số i và có độ dài
là 2j).
3
CuuDuongThanCong.com
/>
.c
om
Bài toán Range Minimum Query
RMQ
Bài toán con nhỏ nhất M[0,i] = i, i = 0,…, N-1
co
M[j-1,i] nếu a[M[j-1,i]] < a[M[j-1,i+2j-1]
M[j-1,i+2j-1], ngược lại
th
an
M[j,i] =
ng
Công thức truy hồi
i
i + 2j-1
i + 2j - 1
cu
u
du
o
ng
i+2j-1 -1
M[j-1,i + 2j-1]
M[j-1,i]
4
M[j, i]
CuuDuongThanCong.com
/>
preprocessing(){
ng
for (i = 0; i < N; i++) M[0,i] = i;
.c
om
Bài toán Range Minimum Query
RMQ
co
for (j = 0; 2j ≤ N; j++){
an
for(i = 0; i + 2j -1 < N; i++){
ng
M[j,i] = M[j-1,i];
th
if a[M[j-1,i]] < a[M[j-1,i+2j-1]] then{
du
o
}else{
}
cu
}
u
M[j,i] = M[j-1,i+2j-1];
}
}
5
CuuDuongThanCong.com
/>
.c
om
Bài toán Range Minimum Query
RMQ
Truy vấn RMQ(i,j)
ng
k = [log(j-i+1)]
co
RMQ(i,j) = M[k,i] nếu a[M[k,i]] ≤ a[M[k, j-2k+1]]
ng
th
an
M[k, j-2k+1]], ngược lại
RMQ(4,14) = ?
du
o
k = [log(14-4+1)]=3
a[7] > a[12] RMQ(4,14) = 12
0
1
cu
u
M[3,7] = 12
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
4
6
1
6
8
7
3
3
5
8
9
1
2
6
4
6
M[3,4] = 7
CuuDuongThanCong.com
/>