Sparse Table
Christopher Samuel
Pelatnas 1
2018
Apa itu sparse table?
Array yang menyimpan informasi dari suatu segmen
Ukuran segmennya pangkat 2
Jadi ukuran sparse
table = [N][log N]
How to compute?
contoh: RMQ
sparse[N][0] = array aslinya
sparse[i][1] = min(sparse[i][0], sparse[i + 2^0][0])
sparse[i][K] = min(sparse[i][K-1], sparse[i + 2^(K-1)][K-1])
jangan lupa cek bila i + 2^(berapapun itu), diluar indeks array. Kalo diluar,
ignore aja :)
How to use?
Bisa di-iterasi pangkat 2 nya
Contoh -> query dari 3 ke 7
lompat 2^3 -> dapat 3 - 10, kelewatan
lompat 2^2 -> dapat 3 - 6, oke ambil, lompat ke 7
lompat 2^1 -> dapat 7 - 8, kelewatan
lompat 2^0 -> dapat 7 - 7, oke ambil, selesai
Bisa pake teknik BIT yang ngilangin least significant bit, agak ribet, hanya
preferensi
Jadi bisa buat apa aja?
1. range query O(log N)
2. RMQ bisa O(1)
3. cari LCA
4. bisa nyari LCA, berarti bisa juga buat beberapa kasus path query on tree
Kenapa sparse table? Kenapa gk segtree/bit aja?
Beberapa alasan
1. Kodingannya pendek (pada umumnya)
2. Bagi beberapa orang, mikirinnya gk ribet
3. Style, preferensi
4. Jika diaplikasikan ke tree, jauh lebih mudah dibandingkan segtree/bit
Kapan pake sparse table?
Syarat yang harus terpenuhi:
1. OFFLINE
2. fungsi query asosiatif
Biasanya saya menggunakan sparse table untuk:
1. LCA
2. Suffix array
Lowest Common Ancestor
atau LCA
Wad is LCA?
Diberikan suatu rooted tree.
LCA dari dua node a dan b adalah node paling rendah(lowest) yang merupakan
buyut(ancestor) dari a dan dari b(common).
Kompleksitas pencarian?
Pertama cari tau kedalaman tiap node dari root, lalu a dan b nya bisa dinaikin satu
per satu -> O(N) per query
Bisa menggunakan sparse table?
Pastinya. Kalo g bisa, kenapa slidenya jadi satu :)
sparse[node (N)][tinggi log(N)]
sparse[N][0] menyimpan direct parent dari suatu node. jika tidak ada parent
(seperti root), isi aja -1 (bebas, handle sendiri)
sparse[N][1] menyimpan parent dari parent dari suatu node
sparse[N][2] menyimpan parent dari parent dari parent dari parent dari suatu
node
sparse[N][K] menyimpan parent level 2^K diatas suatu node
How to compute?
1. DFS treenya, untuk menentukan depth (depth root = 0 atau 1 terserah handle
sendiri, semakin dalam node, depth semakin nambah), simpan di array. Nanti
dibutuhkan. DFS tree sekaligus dapat mengisi parent ke sparse[N][0]
2. sparse[N][0] telah terisi, isi level lainnya
a. kalo sparse[N][K] = -1, sparse[N][K+1] juga -1
b. kalo gk, sparse[N][K+1] = sparse[sparse[N][K]][K]
How to query?
Jika ditanya, parent level ke 5 dari suatu node, bisa la, sama seperti query sparse
table biasa.
Untuk LCA, ada stepsnya
1. a dan b, yang lebih rendah naikin sampai levelnya sama. Untuk mencari
siapa yang lebih rendah dan naikin berapa banyak bisa dengan array depth.
2. kalo a sama dengan b, itu lca nya, return a
3. kalo gk sama, selama kalo dinaikin a dan b gk sama, naikin. Maka, parent
dari a dan b adalah lca nya. return sparse[a][0]
Contoh Soal
Diberikan tree dengan 100 000 node, dan 100 000 query
Untuk setiap query, ada 2 integer a dan b
Cari jarak a dan b