0% found this document useful (0 votes)
67 views13 pages

Sparse Table Lca

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
67 views13 pages

Sparse Table Lca

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

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

You might also like