0% found this document useful (0 votes)
42 views

LCA Seminar Modified

The document discusses algorithms for solving the range minimum query (RMQ) problem. It first defines the least common ancestor (LCA) and RMQ problems and presents a reduction from LCA to RMQ. This allows solving LCA queries by reducing it to the RMQ problem. The document then presents two trivial O(n^3) and O(n^2) algorithms for RMQ before introducing the O(n log n) preprocessing time and O(1) query time solution using suffix trees (ST) that precomputes range minimum values for blocks of exponentially increasing sizes.

Uploaded by

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

LCA Seminar Modified

The document discusses algorithms for solving the range minimum query (RMQ) problem. It first defines the least common ancestor (LCA) and RMQ problems and presents a reduction from LCA to RMQ. This allows solving LCA queries by reducing it to the RMQ problem. The document then presents two trivial O(n^3) and O(n^2) algorithms for RMQ before introducing the O(n log n) preprocessing time and O(1) query time solution using suffix trees (ST) that precomputes range minimum values for blocks of exponentially increasing sizes.

Uploaded by

Pankesh Bamotra
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 58

The LCA Problem Revisited

Michael A.Bender & Martin Farach-Colton

Presented by: Dvir Halevi


Agenda

 Definitions
 Reduction from LCA to RMQ
 Trivial algorithms for RMQ
 ST algorithm for RMQ
 A faster algorithm for a private RMQ case
 General Solution for RMQ

2
Definitions – Least Common Ancestor
 LCAT(u,v) – given nodes u,v in T, returns the node
furthest from the root that is an ancestor of both u
and v.

Trivial solution: O(n3 )

u
3
Definitions – Range Minimum Query

 Given array A of length n.

 RMQA(i,j) – returns the index of the smallest element in


the subarray A[i..j].

A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

0 1 2 34 7 19 10 12 13 16

RMQ(3,7) = 4
4
Definitions – Complexity Notation
 Suppose an algorithm has:

 Preprocessing time – f ( n)
 Query time – g (n)

 Notation for the overall complexity of an algorithm:

 f (n), g (n) 

5
 Definitions
 Reduction from LCA to RMQ
 Trivial algorithms for RMQ
 ST algorithm for RMQ
 A faster algorithm for a private RMQ case
 General Solution for RMQ

6
Reduction from LCA to RMQ
 In order to solve LCA queries, we will reduce the problem
to RMQ.

 Lemma:
If there is an  f (n), g (n)  solution for RMQ, then
there is an  f (2n  1)  O(n), g (2n  1)  O(1) 
Solution for LCA.

7
Reduction - proof
 Observation:
The LCA of nodes u and v is the shallowest node
encountered between the visits to u and to v during a
depth first search traversal of T.
0
3 Shallowest node
Euler tour:
12
3 8 9
1 3 2 3 1 4 1 7 1 3 5 6 5 3
5
2 1
11
4
7 10
5 6

2 4 7 6
LCAT(1,5) = 3
8
Reduction (cont.)
0
3 Shallowest node
Euler tour:
12
3 8 9
1 3 2 3 1 4 1 7 1 3 5 6 5 3
5
2 1
11
4
7 10
5 6

2 4 7 6
LCA(1,5) = 3
 Remarks:
 Euler tour size: 2n-1

 We will use the first occurrence of i,j for the sake of


concreteness (any occurrence will suffice).
 Shallowest node must be the LCA, otherwise
contradiction to a DFS run.
9
Reduction (cont.)
 On an input tree T, we build 3 arrays.
 Euler[1,..,2n-1] – The nodes visited in an Euler tour of T.
Euler[i] is the label of the i-th node visited in the tour.
 Level[1,..2n-1] – The level of the nodes we got in the tour.
Level[i] is the level of node Euler[i].
(level is defined to be the distance from the root)
 Representative[1,..n] – Representative[i] will hold the index of
the first occurrence of node i in Euler[].
Representative[v] = arg min i {Euler[i]  v}

Mark: Euler – E, Representative – R, Level – L


10
Reduction (cont.)
 Example:
1

6 2 9

10 4 8
3 5

7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

E: 1 6 3 6 5 6 1 2 1 9 10 9 4 7 4 9 8 9 1
L: 0 1 2 1 2 1 0 1 0 1 2 1 2 3 2 1 2 1 0
R: 1 8 3 13 5 2 14 17 10 11 11
Reduction (cont.)
 To compute LCAT(x,y):
 All nodes in the Euler tour between the first visits to x

and y are E[R[x],..,R[y]] (assume R[x] < R[y])

 The shallowest node in this subtour is at index


RMQL(R[x],R[y]), since L[i] stores the level of the node
at E[i].

 RMQ will return the index, thus we output the node at


E[RMQL(R[x],R[y])] as LCAT(x,y).

12
Reduction (cont.)
1
 Example:
6 2 9
LCAT(10,7) 10 4 8
3 5

E[11,…,14] 7
LCAT(10,7) = E[12]=9

E: 1 6 3 6 5 6 1 2 1 9 10 9 4 7 4 9 8 9 1
L: 0 1 2 1 2 1 0 1 0 1 2 1 2 3 2 1 2 1 0
R: 1 8 3 13 5 2 14 17 10 11 RMQL(10,7) = 12
13
R[7] R[10]
Reduction (cont.)
 Preprocessing Complexity:
 L,R,E – Each is built in O ( n ) time, during the DFS run.

 Preprocessing L for RMQ - f (2 n  1)

 Query Complexity:
 RMQ query on L – g (2n  1)

 Array references – O (1)

 Overall:  f (2n  1)  O(n), g (2n  1)  O(1) 

 Reduction proof is complete.


 We will only deal with RMQ solutions from this point on.
14
 Definitions
 Reduction from LCA to RMQ
 Trivial algorithms for RMQ
 ST algorithm for RMQ
 A faster algorithm for a private RMQ case
 General Solution for RMQ

15
RMQ

 Solution 1:
Given an array A of size n, compute the RQM for every pair
of indices and store in a table -  O(n3 ), O(1) 

 Solution 2:
To calculate RMQ(i,j) use the already known value of
RMQ(i,j-1) .
Complexity reduced to -  O ( n 2
), O(1) 

16
 Definitions
 Reduction from LCA to RMQ
 Trivial algorithms for RMQ
 ST algorithm for RMQ
 A faster algorithm for a private RMQ case
 General Solution for RMQ

17
ST RMQ
 Preprocess sub arrays of length 2 k
 M(i,j) = index of min value in the sub array starting at index
i having length 2 j

A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 7 34 2 9 12 26 16

M(3,0)=3

M(3,1)=3

M(3,2)=5
18
ST RMQ
 Idea: precompute each query whose length is a power of n.
For every i between 1 and n and every j between 1 and log n 
find the minimum element in the block starting at i and
having length 2 j .

 More precisely we build table M.


M [i, j ]  arg min k i..i  2 j 1{ Array[k ]}

 Table M therefore has size O(nlogn).

19
ST RMQ
 Building M – using dynamic programming we can build M in
O(nlogn) time.
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 7 34 9 2 12 26 16

M(3,1)=3 M(5,1)=6

M(3,2)=6

 A[M[i,j-1]]  A[M[i  2 j-1  1, j  1]] M[i,j-1]



M [i, j ]  
Otherwise M[i  2 j-1  1, j  1]

20
ST RMQ
 Using these blocks to compute arbitrary M[i,j]
 Select two blocks that entirely cover the subrange [i..j]
 Let k  log( j  i)  ( 2 k is the largest block that fits [i..j])
 Compute RMQ(i,j):
 
AMi, k   A M j  2 k  1, k  Mi, k 

RMQ (i, j)  
Otherwise
 
M j  2 k  1, k 
i j
2k elements
a1 ... 2k elements ...

21
ST RMQ
 Query time is O(1).
 This algorithm is known as Sparse Table(ST)
algorithm for RMQ, with complexity:

 O(n log n), O(1) 

 Our target: get rid of the log(n) factor from the


preprocessing.

22
 Definitions
 Reduction from LCA to RMQ
 Trivial algorithms for RMQ
 ST algorithm for RMQ
 A faster algorithm for a private RMQ case
 General Solution for RMQ

23
Faster RMQ
 Use a table-lookup technique to precompute answers on
small subarrays, thus removing the log factor from the
preprocessing.
2n log n
 Partition A into blocks of size .
log n 2

2n
blocks ... ... ... ... ...
log n
log n log n log n
2 2 2

24
Faster RMQ
2n
 A’[1,.., ] – A’[i] is the minimum element in the i-th block of A.
log n
2n
 B[1,.., ] – B’[i] is the position (index) in which value A’[i] occurs.
log n

2n A’[0] A’[i] A’[2n/logn]


blocks ... ... ... ... ...
log n
log n
2

… ...
B[0] B[i] B[2n/logn] 25
 Example:
n=16
A[] : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

10 25 22 7 34 9 2 12 26 33 24 43 5 11 19 27

10 25 22 7 34 9 … 2n
log n
blocks = 8

A’[] : 0 1 2 B[] : 0 1 2

10 7 9 … 0 3 5 …
26
Faster RMQ
 Recall RMQ queries return the position of the
minimum.

 LCA to RMQ reduction uses the position of the


minimum, rather than the minimum itself.

 Use array B to keep track of where minimas in A’


came from.

27
Faster RMQ
 Preprocess A’ for RMQ using ST algorithm.

 ST’s preprocessing time – O(nlogn).

2n
 A’s size –
log n
2n 2n
 ST’s preprocessing on A’: log( )  O ( n)
log n log n

 ST(A’) = O(n), O(1)

28
Faster RMQ
 Having preprocessed A’ for RMQ, how to answer RMQ(i,j)
queries on A?

 i and j might be in the same block -> preprocess every block.

 i < j on different blocks, answer the query as follows:

1. Compute minima from i to end of its block.


2. Compute minima of all blocks in between i’s and j’s blocks.
3. Compute minima from the beginning of j’s block to j.

 Return the index of the minimum of these 3 values.

29
Faster RMQ
 i < j on different blocks, answer the query as follows:

1. Compute minima from i to end of its block.


2. Compute minima of all blocks in between i’s and j’s blocks.
3. Compute minima from the beginning of j’s block to j.

 2 – Takes O(1) time by RMQ on A’.


 1 & 3 – Have to answer in-block RMQ queries

 We need in-block queries whether i and j are in the same block


or not.

30
Faster RMQ
 First Attempt: preprocess every block.
Per block : log n  log n 
log    O(log n log log n)
2  2 
2n
All blocks – O(n log log n)
log n

 Second attempt: recall the LCA to RMQ reduction


 RMQ was performed on array L.
 What can we use to our advantage?

1 restriction
31
Faster RMQ
 Observation:
Let two arrays X & Y such that i X[i]  Y[i]  C
Then i, j RMQ (i, j )  RMQ (i, j )
X Y

A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

3 4 5 6 5 4 5 6 5 4
B[0] B[1] B[2] B[3] B[4] B[5] B[6] B[7] B[8] B[9]

0 1 2 3 2 1 2 3 2 1

+1 +1 +1 -1 -1 +1 +1 -1 -1
 log n 
 1
2  2 
 O( n )

 There are O ( n ) normalized blocks. 32


Faster RMQ
 Preprocess:
 Create O ( n ) tables of size O(log n) to answer all in block
2

 
queries. Overall O n log 2 n  O(n).
 For each block in A compute which normalized block table it
should use – O ( n)
 Preprocess A’ using ST - O ( n)

 Query:
 Query on A’ – O (1)

 Query on in-blocks – O(1)

 Overall RMQ complexity - O(n), O(1)


33
 Definitions
 Reduction from LCA to RMQ
 Trivial algorithms for RMQ
 ST algorithm for RMQ
 A faster algorithm for a private RMQ case
 General Solution for RMQ

34
General O(n) RMQ
 Reduction from RMQ to LCA
 General RMQ is solved by reducing RMQ to LCA, then
reducing LCA to 1 RMQ.

 Lemma:
If there is a O(n), O(1) solution for LCA, then there is a
O(n), O(1) solution to RMQ.

 Proof: build a Cartesian tree of the array, activate LCA on it.

35
General O(n) RMQ
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

 Cartesian tree of an array A:

 Root – minimum element of the array. Root node is


labeled with the position of the minimum.

 Root’s left & right children: the recursively constructed


Cartesian tress of the left & right subarrays, respectively.
36
General O(n) RMQ
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

0 6

2 5 7

1 3 9

8
37
Build Cartesian tree in O(n)
 Move from left to right in the array
 Suppose Ci is the Cartesian tree of A[1,..,i]
 Node i+1 (v) has to belong in the rightmost path of Ci
 Climb the rightmost path, find the first node (u) smaller than v
 Make v the right son of u, and previous right subtree of u left son
of v.

u
v
u
v
x
x
... ... 38
Build Cartesian tree in O(n)
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

10
0

39
Build Cartesian tree in O(n)
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

10
0
25
1

40
Build Cartesian tree in O(n)
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

10
0
22
2
25
1

41
Build Cartesian tree in O(n)
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34
34 77 19 9 12 26 16

10
0
22
2
25 34
1 3

42
Build Cartesian tree in O(n)
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

7
4
10
0
22
2
25 34
1 3

43
Build Cartesian tree in O(n)
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

0 6

2 5 7

1 3 9

8
44
General O(n) RMQ
 How to answer RMQ queries on A?
 Build Cartesian tree C of array A.
 RMQA(i,j) = LCAC(i,j)

 Proof:
 let k = LCAC(i,j).
 In the recursive description of a Cartesian tree k is the first
element to split i and j.
 k is between i,j since it splits them and is minimal because it
is the first element to do so.

45
General O(n) RMQ

 Build Complexity:

 Every node enters the rightmost path once. Once it


leaves, will never return.

 O(n).

46
General O(n) RMQ
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

10 25 22 34 7 19 9 12 26 16

0 6

2 5 7

1 3 9

8
47
The Level-Ancestor Problem simplified

Michael A.Bender & Martin Farach-Colton


LA defined
 Depth(u) – distance from the root.
 Height(u) - # of nodes from u to its deepest descendant.

 LA(u,d) = v iff v is an ancestor of u where depth(v)=d.


 LA(u,0) = root LA(u,depth(u)) = u

 Natural solutions:
 Climbing up the tree from u – O(n) query time.
 Precompute all answers – O(n^2) preprocessing.

49
Table Algorithm
 Build a table storing answers to all n 2 possible queries.

 The lookup table can be filled in O(n 2 ) time.

 Queries require 1 table lookup.

 Overall complexity:  O(n2 ), O(1) 

50
Jump Pointer algorithm
 Keep logn pointers in each vertex to ancestors having
distance of length power of 2.

 Follow these pointers each time narrowing the distance by a


power of 2, making query time O (log n)
 Use the same building technique as in ST to achieve
preprocessing time O(n log n)

 O(n log n), O(log n)  51


The Ladder Algorithm
 Motivation: LA problem on a path is easily solved in
 O(n), O(1)  using an array.

 Greedily decompose T into disjoint paths, removing a


longest root-leaf path recursively.

 To locate LA(u,d) we jump long paths from u, each time


jumping to a lengthier path.

 We may end up jumping O( n ) long paths.

52
The Ladder Algorithm
 Jumping to top of paths yields O( n )
 Extend long paths to Ladders

 Ladder = path + length(path) immediate ancestors of the


top of the path.

 Ladders can overlap.

 A vertex’s ladder is the ladder derived from the path


containing it.

53
The Ladder Algorithm
 If v is of height h then v has at least h ancestors in its
ladder.

 Finding long path decomposition of T take O ( n) time.


(compute the height of every node, each node picks one of its maximal
height children as its child on the long path.
Extending long paths to ladders take O(n) too)

 Queries: if u is of height h then vertex at the top of u’s


ladder is of height at least 2h. After I ladders we reach a
node of height at least 2i , thus we travel O (log n) ladders.

 O(n), O(log n) 
54
Jump Pointers + Ladder
 Jump pointer makes exponentially decreasing hops.
 Ladder makes exponentially increasing hops.

 Preprocess T for both jump pointers and ladder – O(n log n)

 Query – follow a single jump pointer + climb a single


ladder. (reason: the jump pointer gets us more than halfway
there(node v), v’s ladder must contain the ancestor ).

 O(n log n), O(1) 


55
Macro-Micro Tree Algorithm

 The bottleneck is computing jump pointers.


 No need for each and every node to contain jump pointers.
 If w is a descendant of v then v can use w’s jump pointers.

 Jump nodes – vertices having jump pointers.

n
 We designate O(
log n
) nodes to be jump nodes.

56
Macro-Micro Tree Algorithm
 Macro node – any ancestor of a jump node.
 Micro node – a node which is not a macro node.

 Macro tree – The macro nodes form a connected subtree.


 Micro trees – The connected components obtained from T
after removing macro nodes.

 Jump node – the maximally deep vertices having at least


log(n/4) descendants.

 There are at most O(n/logn) jump nodes.


57
Macro-Micro Tree Algorithm
 Computing all jump nodes pointers now takes O(n), leading
to an overall preprocess time O(n).

 By running a DFS we can find the jump node for every


macro node, making queries on macro nodes O(1).

 There are O( n ) canonical forms of micro trees (very similar


to normalized blocks on the 1 RMQ)

 Preprocessing all canonical forms – O(n).


 Micro trees queries take only O(1) too.

 Making an overall of:  (O(n), O(1) 


58

You might also like