ν¬μ λ°°μ΄(Sparse Table)
λ°°μ΄ μμμ κ°μκ° λ¬΄μ‘°κ±΄ λ°°μ΄μ length κ°λ³΄λ€ μμ λ°°μ΄
λ°μ΄ν°κ° μ μ₯λμ§ μμ κ²½μ°κ° λ λ§μ ν¬μ νλ ¬κ³Ό κ°μ΄, ν¬μ λ°°μ΄μ λ°°μ΄μ μμ μμΉκ° μ°μμ μ΄μ§ μμ λ°°μ΄μ λ§ν¨
μ΄λ¬ν ν¬μλ°°μ΄μ νΉμ§μ μ΄μ©ν΄ κ·Έλνμ μ¬μ΄ν΄μ νμν΄λκ°λ λ¬Έμ λ₯Ό ν μ μλ€.
ν¬μ λ°°μ΄ μκ³ λ¦¬μ¦
λ€μκ³Ό κ°μ΄ μ¬μ΄ν΄μ΄ μλ κ·Έλνκ° μ‘΄μ¬νκ³ , νΉμ μ μ (v)μμ μμν΄ nκ°μ κ°μ μ μ΄λν΄ λμ°©ν μ μλ μ μ μ ꡬνλ€κ³ μκ°ν΄λ³΄μ.
μΌλ°μ μΌλ‘λ κ°μ 1κ°λ₯Ό nλ²μ© μ΄λνμ¬ λμ°©νλ μ μ μ μ°Ύλ λ°©λ²μ λ μ¬λ¦΄ κ²μ΄λ€.
νμ§λ§ μμ λ¬Έμ λ₯Ό λ°λ³΅μ μΌλ‘ νμ΄μΌ νλ€λ©΄? λͺ¨λ vμ μ μ λν΄ nκ°μ κ°μ λ§νΌμ© μ΄λνλ€λ©΄ μμμ΄ λ§μ΄ μ΄λν΄μΌ νλ€. κ²λ€κ° μ κ·Έλνλ μ¬μ΄ν΄μ΄ μ‘΄μ¬νκΈ°λλ¬Έμ, μ΄λ μκ°λΆν°λ κ°μ μ΄λμ λ°λ³΅νκ²λ κ²μ΄λ€.
μ΄ λ¬Έμ λ₯Ό ν¬μ λ°°μ΄λ‘ ν΄κ²°ν΄λ³΄μ.
λ§μ½ 1λ² μ μ μμ μμν΄ 7κ°μ κ°μ μ μ΄λν΄ λμ°©ν μ μλ μ μ μ ꡬνλ€λ©΄ μ΄λ νμλ λ€μκ³Ό κ°μ κ²μ΄λ€.
7 = 4 + 2 + 1
7κ°μ κ°μ μ μ΄λνλ€κ³ ν΄μ 1λ² μ΄λνλ κ°μ μ 7κ° κ±°μ³κ°λ κ²μ΄ μλλ€.
1λ²μμ 4λ² μ΄λνμ¬ 5λ²μ λμ°©, 5λ²μμ 2λ² μ΄λνμ¬ 4λ²μ λμ°©, λ§μ§λ§μΌλ‘ 4λ²μμ 1λ² μ΄λνμ¬ 2λ²μΌλ‘ λμ°©νλ€λ©΄ μ΄λ νμλ 7λ²μμ 3λ²μΌλ‘ μ€μ΄λ€κ² λλ€.
μ΄μ²λΌ κ°μ μ 1κ°μ© μ΄λνμ§ λ§κ³ , 1κ°, 2κ°, 4κ°, 8κ°, β¦ μκ°μ΄ 1
λΆν° log n
κ°κΉμ§ νλ²μ μ΄λνκ³ , μ΄λ κ² λλ¬ν μ μ μ λ°°μ΄μ μ μ₯νλ€λ©΄ λͺ κ°μ κ°μ λ λΉ λ₯΄κ² μ΄λν μ μλ€.
μ΄λ νμ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1λ² μ΄λ | 4 | 3 | 5 | 2 | 1 | 5 | 3 | 6 | 6 |
2λ² μ΄λ | 2 | 5 | 1 | 3 | 4 | 1 | 5 | 5 | 5 |
4λ² μ΄λ | 5 | 4 | 2 | 1 | 3 | 2 | 4 | 4 | 4 |
μ ν μ΄λΈμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ·Έλνμ μ΄λ λ Έλλ₯Ό ννν κ²μ΄λ―λ‘, κ° νμ μμ κ°μκ° μ΄μ κ°μλ³΄λ€ μμ ν¬μ λ°°μ΄λ‘ ννλλ κ²μ μ μ μλ€.
μ΄λ° νΉμ±μ μ΄μ©ν΄ 1
~ log n
κΉμ§ μ΄λνμ¬ λμ°©νλ μ μ μ ν¬μ λ°°μ΄μ μ μ₯ν΄λ μΌλ‘μ¨ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ·Έλνμμμ κ°μ μ΄λμ λΉ λ₯΄κ³ μ½κ² ν΄κ²°ν μ μλ€.
ν¬μ λ°°μ΄ μκ³ λ¦¬μ¦ κ΅¬ν
// ν¬μ λ°°μ΄
static int[][] sparseTable = new int[logn+1][n+1]; // 1μ°¨μ λ°°μ΄ κΈΈμ΄λ μ΄λ νμλ₯Ό, 2μ°¨μ λ°°μ΄ κΈΈμ΄λ μ΄ μ μ μ κΈΈμ΄λ₯Ό μλ―Έ
// ν¬μ λ°°μ΄ μμ±νμ¬ κ° μ μ μ μ΄λ νμλ³ λμ°© μ μ κΈ°λ‘
public static void makeSparseTable() {
// 1λ² μ΄λν΄μ λμ°©νλ μ μ
for (int i=1; i<=n; i++) {
sparseTable[0][i] = arr[i];
}
// log nλ²κΉμ§ μ΄λν΄μ λμ°©νλ μ μ
for (int k=1; k<logn+1; k++) {
for (int i=1; i<=n; i++) {
int next = sparseTable[k-1][i];
sparseTable[k][i] = sparseTable[k-1][next];
}
}
}
// v μ μ μμ μΆλ°νμ¬ nκ°μ κ°μ μ μ΄λνμ¬ λμ°©ν μ μ μ°ΎκΈ°
public static int query(int n, int v) {
for (bit=size-1; bit>=0; bit--) {
if ((n & (1<<bit)) != 0) {
v = sparseTable[bit][v];
}
}
}
References
BOJ 17435 ν©μ±ν¨μμ 쿼리 Sparse Table - λ¨λ¨μμ λΈλ‘κ·Έ