]> mj.ucw.cz Git - saga.git/blob - adv.tex
More abstract art.
[saga.git] / adv.tex
1 \ifx\endpart\undefined
2 \input macros.tex
3 \fi
4
5 \chapter{Advanced MST Algorithms}
6
7 \section{Minor-closed graph classes}\id{minorclosed}%
8
9 The contractive algorithm given in Section~\ref{contalg} has been found to perform
10 well on planar graphs, but in the general case its time complexity was not linear.
11 Can we find any broader class of graphs where this algorithm is still efficient?
12 The right context turns out to be the minor-closed graph classes, which are
13 closed under contractions and have bounded density.
14
15 \defn\id{minordef}%
16 A~graph~$H$ is a \df{minor} of a~graph~$G$ (written as $H\minorof G$) iff it can be obtained
17 from a~subgraph of~$G$ by a sequence of simple graph contractions (see \ref{simpcont}).
18
19 \defn
20 A~class~$\cal C$ of graphs is \df{minor-closed}, when for every $G\in\cal C$ and
21 every minor~$H$ of~$G$, the graph~$H$ lies in~$\cal C$ as well. A~class~$\cal C$ is called
22 \df{non-trivial} if at least one graph lies in~$\cal C$ and at least one lies outside~$\cal C$.
23
24 \example
25 Non-trivial minor-closed classes include:
26 \itemize\ibull
27 \:planar graphs,
28 \:graphs embeddable in any fixed surface (i.e., graphs of bounded genus),
29 \:graphs embeddable in~${\bb R}^3$ without knots or without interlocking cycles,
30 \:graphs of bounded tree-width or path-width.
31 \endlist
32
33 \para
34 Many of the nice structural properties of planar graphs extend to
35 minor-closed classes, too (see Lov\'asz \cite{lovasz:minors} for a~nice survey
36 of this theory and Diestel \cite{diestel:gt} for some of the deeper results).
37 The most important property is probably the characterization
38 of such classes in terms of their forbidden minors.
39
40 \defn
41 For a~class~$\cal H$ of graphs we define $\Forb({\cal H})$ as the class
42 of graphs that do not contain any of the graphs in~$\cal H$ as a~minor.
43 We will call $\cal H$ the set of \df{forbidden (or excluded) minors} for this class.
44 We will often abbreviate $\Forb(\{M_1,\ldots,M_n\})$ to $\Forb(M_1,\ldots,M_n)$.
45
46 \obs
47 For every~${\cal H}\ne\emptyset$, the class $\Forb({\cal H})$ is non-trivial
48 and closed on minors. This works in the opposite direction as well: for every
49 minor-closed class~$\cal C$ there is a~class $\cal H$ such that ${\cal C}=\Forb({\cal H})$.
50 One such~$\cal H$ is the complement of~$\cal C$, but smaller ones can be found, too.
51 For example, the planar graphs can be equivalently described as the class $\Forb(K_5, K_{3,3})$
52 --- this follows from the Kuratowski's theorem (the theorem speaks of forbidden
53 subdivisions, but while in general this is not the same as forbidden minors, it
54 is for $K_5$ and $K_{3,3}$). The celebrated theorem by Robertson and Seymour
55 guarantees that we can always find a~finite set of forbidden minors:
56
57 \thmn{Excluded minors, Robertson \& Seymour \cite{rs:wagner}}
58 For every non-trivial minor-closed graph class~$\cal C$ there exists
59 a~finite set~$\cal H$ of graphs such that ${\cal C}=\Forb({\cal H})$.
60
61 \proof
62 This theorem has been proven in a~long series of papers on graph minors
63 culminating with~\cite{rs:wagner}. See this paper and follow the references
64 to the previous articles in the series.
65 \qed
66
67 \para
68 For analysis of the contractive algorithm,
69 we will make use of another important property --- the bounded density of
70 minor-closed classes. The connection between minors and density dates back to
71 Mader in the 1960's and it can be proven without use of the Robertson-Seymour
72 theory.
73
74 \defn\id{density}%
75 Let $G$ be a~graph and $\cal C$ be a class of graphs. We define the \df{edge density}
76 $\varrho(G)$ of~$G$ as the average number of edges per vertex, i.e., $m(G)/n(G)$. The
77 edge density $\varrho(\cal C)$ of the class is then defined as the infimum of $\varrho(G)$ over all $G\in\cal C$.
78
79 \thmn{Mader \cite{mader:dens}}\id{maderthm}%
80 For every $k\in{\bb N}$ there exists $h(k)\in{\bb R}$ such that every graph
81 of average degree at least~$h(k)$ contains a~subdivision of~$K_{k}$ as a~subgraph.
82
83 \proofsketch
84 (See Lemma 3.5.1 in \cite{diestel:gt} for a~complete proof in English.)
85
86 Let us fix~$k$ and prove by induction on~$m$ that every graph of average
87 degree at least~$2^m$ contains a~subdivision of some graph with $k$~vertices
88 and $m$~edges (for $k\le m\le {k\choose 2}$). When we reach $m={k\choose 2}$, the theorem follows
89 as the only graph with~$k$ vertices and~$k\choose 2$ edges is~$K_k$.
90
91 The base case $m=k$: Let us observe that when the average degree
92 is~$a$, removing any vertex of degree less than~$a/2$ does not decrease the
93 average degree. A~graph with $a\ge 2^k$ therefore has a~subgraph
94 with minimum degree $\delta\ge a/2=2^{k-1}$. Such subgraph contains
95 a~cycle on more than~$\delta$ vertices, in other words a~subdivision of
96 the cycle~$C_k$.
97
98 Induction step: Let~$G$ be a~graph with average degree at least~$2^m$ and
99 assume that the theorem already holds for $m-1$. Without loss of generality,
100 $G$~is connected. Consider a~maximal set $U\subseteq V$ such that the subgraph $G[U]$
101 induced by~$U$ is connected and the graph $G\sgc U$ ($G$~with $U$~contracted to
102 a~single vertex) has average degree at least~$2^m$ (such~$U$ exists, because
103 $G=G\sgc U$ whenever $\vert U\vert=1$). Now consider the subgraph~$H$ induced
104 in~$G$ by the neighbors of~$U$. Every $v\in V(H)$ must have $\deg_H(v) \ge 2^{m-1}$,
105 as otherwise we can add this vertex to~$U$, contradicting its
106 maximality. By the induction hypothesis, $H$ contains a~subdivision of some
107 graph~$R$ with $k$~vertices and $m-1$ edges. Any two non-adjacent vertices
108 of~$R$ can be connected in the subdivision by a~path lying entirely in~$G[U]$,
109 which reveals a~subdivision of a~graph with $m$~edges. \qed
110
111 \thmn{Density of minor-closed classes, Mader~\cite{mader:dens}}
112 Every non-trivial minor-closed class of graphs has finite edge density.
113
114 \proof
115 Let~$\cal C$ be any such class, $X$~its excluded minor with the smallest number
116 of vertices~$x$.
117 As $X\minorof K_x$, the class $\cal C$ is entirely contained in ${\cal C}'=\Forb(K_x)$, so
118 $\varrho({\cal C}) \le \varrho({\cal C}')$ and therefore it suffices to prove the
119 theorem for classes excluding a~single complete graph~$K_x$.
120
121 We will show that $\varrho({\cal C})\le 2h(x)$, where $h$~is the function
122 from the previous theorem. If any $G\in{\cal C}$ had more than $2h(x)\cdot n(G)$
123 edges, its average degree would be at least~$h(x)$, so by the previous theorem
124 $G$~would contain a~subdivision of~$K_x$ and hence $K_x$ as a~minor.
125 \qed
126
127 Let us return to the analysis of our algorithm.
128
129 \thmn{MST on minor-closed classes, Mare\v{s} \cite{mm:mst}}\id{mstmcc}%
130 For any fixed non-trivial minor-closed class~$\cal C$ of graphs, the Contractive Bor\o{u}vka's
131 algorithm (\ref{contbor}) finds the MST of any graph of this class in time
132 $\O(n)$. (The constant hidden in the~$\O$ depends on the class.)
133
134 \proof
135 Following the proof for planar graphs (\ref{planarbor}), we denote the graph considered
136 by the algorithm at the beginning of the $i$-th Bor\o{u}vka step by~$G_i$ and its number of vertices
137 and edges by $n_i$ and $m_i$ respectively. Again the $i$-th phase runs in time $\O(m_i)$
138 and we have $n_i \le n/2^i$, so it remains to show a linear bound for the $m_i$'s.
139
140 Since each $G_i$ is produced from~$G_{i-1}$ by a sequence of edge contractions,
141 all $G_i$'s are minors of the input graph.\foot{Technically, these are multigraph contractions,
142 but followed by flattening, so they are equivalent to contractions on simple graphs.}
143 So they also belong to~$\cal C$ and by the Density theorem $m_i\le \varrho({\cal C})\cdot n_i$.
144 The time complexity is therefore $\sum_i \O(m_i) = \sum_i \O(n_i) = \O(\sum_i n/2^i) = \O(n)$.
145 \qed
146
147 \paran{Local contractions}\id{nobatch}%
148 The contractive algorithm uses ``batch processing'' to perform many contractions
149 in a single step. It is also possible to perform them one edge at a~time,
150 batching only the flattenings. A~contraction of an edge~$uv$ can be done
151 in time~$\O(\deg(u))$ by removing all edges incident with~$u$ and inserting them back
152 with $u$ replaced by~$v$. Therefore we need to find a lot of vertices with small
153 degrees. The following lemma shows that this is always the case in minor-closed
154 classes.
155
156 \lemman{Low-degree vertices}\id{lowdeg}%
157 Let $\cal C$ be a graph class with density~$\varrho$ and $G\in\cal C$ a~graph
158 with $n$~vertices. Then at least $n/2$ vertices of~$G$ have degree at most~$4\varrho$.
159
160 \proof
161 Assume the contrary: Let there be at least $n/2$ vertices with degree
162 greater than~$4\varrho$.  Then $\sum_v \deg(v) > n/2
163 \cdot 4\varrho = 2\varrho n$, which is in contradiction with the number
164 of edges being at most $\varrho n$.
165 \qed
166
167 \rem
168 The proof can be also viewed
169 probabilistically: let $X$ be the degree of a vertex of~$G$ chosen uniformly at
170 random. Then $\E X \le 2\varrho$, hence by the Markov's inequality
171 ${\rm Pr}[X > 4\varrho] < 1/2$, so for at least $n/2$ vertices~$v$ we have
172 $\deg(v)\le 4\varrho$.
173
174 \algn{Local Bor\o{u}vka's Algorithm, Mare\v{s} \cite{mm:mst}}%
175 \algo
176 \algin A~graph~$G$ with an edge comparison oracle and a~parameter~$t\in{\bb N}$.
177 \:$T\=\emptyset$.
178 \:$\ell(e)\=e$ for all edges~$e$.
179 \:While $n(G)>1$:
180 \::While there exists a~vertex~$v$ such that $\deg(v)\le t$:
181 \:::Select the lightest edge~$e$ incident with~$v$.
182 \:::Contract~$e$.
183 \:::$T\=T + \ell(e)$.
184 \::Flatten $G$, removing parallel edges and loops.
185 \algout Minimum spanning tree~$T$.
186 \endalgo
187
188 \thm
189 When $\cal C$ is a minor-closed class of graphs with density~$\varrho$, the
190 Local Bor\o{u}vka's Algorithm with the parameter~$t$ set to~$4\varrho$ 
191 finds the MST of any graph from this class in time $\O(n)$. (The constant
192 in the~$\O$ depends on~the class.)
193
194 \proof
195 Let us denote by $G_i$, $n_i$ and $m_i$ the graph considered by the
196 algorithm at the beginning of the $i$-th iteration of the outer loop,
197 and the number of its vertices and edges respectively. As in the proof
198 of the previous algorithm (\ref{mstmcc}), we observe that all the $G_i$'s
199 are minors of the graph~$G$ given as the input.
200
201 For the choice $t=4\varrho$, the Lemma on low-degree vertices (\ref{lowdeg})
202 guarantees that at the beginning of the $i$-th iteration, at least $n_i/2$ vertices
203 have degree at most~$t$. Each selected edge removes one such vertex and
204 possibly increases the degree of another one, so at least $n_i/4$ edges get selected.
205 Hence $n_i\le 3/4\cdot n_{i-1}$ and $n_i\le n\cdot (3/4)^i$, so the
206 algorithm terminates after $\O(\log n)$ iterations.
207
208 Each selected edge belongs to $\mst(G)$, because it is the lightest edge of
209 the trivial cut $\delta(v)$ (see the Blue rule, Lemma \ref{rbma}).
210 The steps 6 and~7 therefore correspond to the operation
211 described by the Contraction Lemma (\ref{contlemma}) and when
212 the algorithm stops, $T$~is indeed the minimum spanning tree.
213
214 It remains to analyse the time complexity of the algorithm. Since $G_i\in{\cal C}$, we know that
215 $m_i\le \varrho n_i \le \varrho n/2^i$.
216 We will show that the $i$-th iteration is carried out in time $\O(m_i)$.
217 Steps 5 and~6 run in time $\O(\deg(v))=\O(t)$ for each~$v$, so summed
218 over all $v$'s they take $\O(tn_i)$, which is $\O(n_i)$ for a fixed class~$\cal C$.
219 Flattening takes $\O(m_i)$ as already noted in the analysis of the Contracting
220 Bor\o{u}vka's Algorithm (see \ref{contiter}).
221
222 The whole algorithm therefore runs in time $\O(\sum_i m_i) = \O(\sum_i n/2^i) = \O(n)$.
223 \qed
224
225 \paran{Back to planar graphs}%
226 For planar graphs, we can obtain a sharper version of the low-degree lemma
227 showing that the algorithm works with $t=8$ as well (we had $t=12$ from
228 $\varrho=3$). While this does not change the asymptotic time complexity
229 of the algorithm, the constant-factor speedup can still delight the hearts of
230 its practical users.
231
232 \lemman{Low-degree vertices in planar graphs}%
233 Let $G$ be a planar graph with $n$~vertices. Then at least $n/2$ vertices of~$v$
234 have degree at most~8.
235
236 \proof
237 It suffices to show that the lemma holds for triangulations (if there
238 are any edges missing, the situation can only get better) with at
239 least 4 vertices. Since $G$ is planar, we have $\sum_v \deg(v) < 6n$.
240 The numbers $d(v):=\deg(v)-3$ are non-negative and $\sum_v d(v) < 3n$,
241 so by the same argument as in the proof of the general lemma, for at least $n/2$
242 vertices~$v$ it holds that $d(v) < 6$, and thus $\deg(v) \le 8$.
243 \qed
244
245 \rem\id{hexa}%
246 The constant~8 in the previous lemma is the best we can have.
247 Consider a $k\times k$ triangular grid. It has $n=k^2$ vertices, $\O(k)$ of them
248 lie on the outer face and they have degree at most~6, the remaining $n-\O(k)$ interior
249 vertices have degree exactly~6. Therefore the number of faces~$f$ is $6/3\cdot n=2n$,
250 ignoring terms of order $\O(k)$. All interior triangles can be properly colored with
251 two colors, black and white. Now add a~new vertex inside each white face and connect
252 it to all three vertices on the boundary of that face (see the picture). This adds $f/2 \approx n$
253 vertices of degree~3 and it increases the degrees of the original $\approx n$ interior
254 vertices to~9, therefore about a~half of the vertices of the new planar graph
255 has degree~9.
256
257 \figure{hexangle.eps}{\epsfxsize}{The construction from Remark~\ref{hexa}}
258
259 \rem
260 The observation in~Theorem~\ref{mstmcc} was also independently made by Gustedt \cite{gustedt:parallel},
261 who studied a~parallel version of the Contractive Bor\o{u}vka's algorithm applied
262 to minor-closed classes.
263
264 \rem
265 The bound on the average degree needed to enforce a~$K_k$ minor, which we get from Theorem \ref{maderthm},
266 is very coarse. Kostochka \cite{kostochka:lbh} and independently Thomason \cite{thomason:efc}
267 have proven that an~average degree $\Omega(k\sqrt{\log k})$ is sufficient and that this
268 is the best what we can get.
269
270 \rem
271 Minor-closed classes share many other interesting properties, for example bounded chromatic
272 numbers of various kinds, as shown by Theorem 6.1 of \cite{nesetril:minors}. We can expect
273 that many algorithmic problems will turn out to be easy for them.
274
275 %--------------------------------------------------------------------------------
276
277 \section{Iterated algorithms}\id{iteralg}%
278
279 We have seen that the Jarn\'\i{}k's Algorithm \ref{jarnik} runs in $\Theta(m\log n)$ time.
280 Fredman and Tarjan \cite{ft:fibonacci} have shown a~faster implementation
281 using their Fibonacci heaps. In this section, we will convey their results and we
282 will show several interesting consequences.
283
284 The previous implementation of the algorithm used a binary heap to store all edges
285 separating the current tree~$T$ from the rest of the graph, i.e., edges of the cut~$\delta(T)$.
286 Instead of that, we will remember the vertices adjacent to~$T$ and for each such vertex~$v$ we
287 will maintain the lightest edge~$uv$ such that $u$~lies in~$T$. We will call these edges \df{active edges}
288 and keep them in a~Fibonacci heap, ordered by weight.
289
290 When we want to extend~$T$ by the lightest edge of~$\delta(T)$, it is sufficient to
291 find the lightest active edge~$uv$ and add this edge to~$T$ together with the new vertex~$v$.
292 Then we have to update the active edges as follows. The edge~$uv$ has just ceased to
293 be active. We scan all neighbors~$w$ of the vertex~$v$. When $w$~is already in~$T$, no action
294 is needed. If $w$~is outside~$T$ and it was not adjacent to~$T$ (there is no active edge
295 remembered for it so far), we set the edge~$vw$ as active. Otherwise we check the existing
296 active edge for~$w$ and replace it by~$vw$ if the new edge is lighter.
297
298 The following algorithm shows how these operations translate to insertions, decreases
299 and deletions in the heap.
300
301 \algn{Active Edge Jarn\'\i{}k; Fredman and Tarjan \cite{ft:fibonacci}}\id{jarniktwo}%
302 \algo
303 \algin A~graph~$G$ with an edge comparison oracle.
304 \:$v_0\=$ an~arbitrary vertex of~$G$.
305 \:$T\=$ a tree containing just the vertex~$v_0$.
306 \:$H\=$ a~Fibonacci heap of active edges stored as pairs $(u,v)$ where $u\in T,v\not\in T$, ordered by the weights $w(uv)$, and initially empty.
307 \:$A\=$ a~mapping of vertices outside~$T$ to their active edges in the heap; initially all elements undefined.
308 \:\<Insert> all edges incident with~$v_0$ to~$H$ and update~$A$ accordingly.
309 \:While $H$ is not empty:
310 \::$(u,v)\=\<DeleteMin>(H)$.
311 \::$T\=T+uv$.
312 \::For all edges $vw$ such that $w\not\in T$:
313 \:::If there exists an~active edge~$A(w)$:
314 \::::If $vw$ is lighter than~$A(w)$, \<Decrease> $A(w)$ to~$(v,w)$ in~$H$.
315 \:::If there is no such edge, then \<Insert> $(v,w)$ to~$H$ and set~$A(w)$.
316 \algout Minimum spanning tree~$T$.
317 \endalgo
318
319 \paran{Analysis}%
320 To analyse the time complexity of this algorithm, we will use the standard
321 theorem on~complexity of the Fibonacci heap:
322
323 \thmn{Fibonacci heaps, Fredman and Tarjan \cite{ft:fibonacci}} The~Fibonacci heap performs the following operations
324 with the indicated amortized time complexities:
325 \itemize\ibull
326 \:\<Insert> (insertion of a~new element) in $\O(1)$,
327 \:\<Decrease> (decreasing the value of an~existing element) in $\O(1)$,
328 \:\<Merge> (merging of two heaps into one) in $\O(1)$,
329 \:\<DeleteMin> (deletion of the minimal element) in $\O(\log n)$,
330 \:\<Delete> (deletion of an~arbitrary element) in $\O(\log n)$,
331 \endlist
332 \>where $n$ is the number of elements present in the heap at the time of
333 the operation.
334
335 \proof
336 See Fredman and Tarjan \cite{ft:fibonacci} for both the description of the Fibonacci
337 heap and the proof of this theorem.
338 \qed
339
340 \thm
341 Algorithm~\ref{jarniktwo} with the Fibonacci heap finds the MST of the input graph in time~$\O(m+n\log n)$.
342
343 \proof
344 The algorithm always stops, because every edge enters the heap~$H$ at most once.
345 As it selects exactly the same edges as the original Jarn\'\i{}k's algorithm,
346 it gives the correct answer.
347
348 The time complexity is $\O(m)$ plus the cost of the heap operations. The algorithm
349 performs at most one \<Insert> or \<Decrease> per edge and exactly one \<DeleteMin>
350 per vertex. There are at most $n$ elements in the heap at any given time,
351 thus by the previous theorem the operations take $\O(m+n\log n)$ time in total.
352 \qed
353
354 \cor
355 For graphs with edge density $\Omega(\log n)$, this algorithm runs in linear time.
356
357 \remn{Other heaps}%
358 We can consider using other kinds of heaps that have the property that inserts
359 and decreases are faster than deletes. Of course, the Fibonacci heaps are asymptotically
360 optimal (by the standard $\Omega(n\log n)$ lower bound on sorting by comparisons, see
361 for example \cite{clrs}), so the other data structures can improve only
362 multiplicative constants or offer an~easier implementation.
363
364 A~nice example is the \df{$d$-regular heap} --- a~variant of the usual binary heap
365 in the form of a~complete $d$-regular tree. \<Insert>, \<Decrease> and other operations
366 involving bubbling the values up spend $\O(1)$ time at a~single level, so they run
367 in~$\O(\log_d n)$ time. \<Delete> and \<DeleteMin> require bubbling down, which incurs
368 comparison with all~$d$ sons at every level, so they spend $\O(d\log_d n)$.
369 With this structure, the time complexity of the whole algorithm
370 is $\O(nd\log_d n + m\log_d n)$, which suggests setting $d=m/n$, yielding $\O(m\log_{m/n}n)$.
371 This is still linear for graphs with density at~least~$n^{1+\varepsilon}$.
372
373 Another possibility is to use the 2-3-heaps \cite{takaoka:twothree} or Trinomial
374 heaps \cite{takaoka:trinomial}. Both have the same asymptotic complexity as Fibonacci
375 heaps (the latter even in the worst case, but it does not matter here) and their
376 authors claim faster implementation. For integer weights, we can use Thorup's priority
377 queues described in \cite{thorup:sssp} which have constant-time \<Insert> and \<Decrease>
378 and $\O(\log\log n)$ time \<DeleteMin>. (We will however omit the details since we will
379 show a~faster integer algorithm soon.)
380
381 \paran{Combining MST algorithms}%
382 As we already noted, the improved Jarn\'\i{}k's algorithm runs in linear time
383 for sufficiently dense graphs. In some cases, it is useful to combine it with
384 another MST algorithm, which identifies a~part of the MST edges and contracts
385 them to increase the density of the graph. For example, we can perform several Bor\o{u}vka
386 steps  and then find the rest of the MST by the Active Edge Jarn\'\i{}k's algorithm.
387
388 \algn{Mixed Bor\o{u}vka-Jarn\'\i{}k}
389 \algo
390 \algin A~graph~$G$ with an edge comparison oracle.
391 \:Run $\log\log n$ Bor\o{u}vka steps (\ref{contbor}), getting a~MST~$T_1$.
392 \:Run the Active Edge Jarn\'\i{}k's algorithm (\ref{jarniktwo}) on the resulting
393   graph, getting a~MST~$T_2$.
394 \:Combine $T_1$ and~$T_2$ to~$T$ as in the Contraction lemma (\ref{contlemma}).
395 \algout Minimum spanning tree~$T$.
396 \endalgo
397
398 \thm
399 The Mixed Bor\o{u}vka-Jarn\'\i{}k algorithm finds the MST of the input graph in time $\O(m\log\log n)$.
400
401 \proof
402 Correctness follows from the Contraction lemma and from the proofs of correctness of the respective algorithms.
403 As~for time complexity: The first step takes $\O(m\log\log n)$ time
404 (by Lemma~\ref{contiter}) and it gradually contracts~$G$ to a~graph~$G'$ of size
405 $m'\le m$ and $n'\le n/\log n$. The second step then runs in time $\O(m'+n'\log n') = \O(m)$
406 and both trees can be combined in linear time, too.
407 \qed
408
409 \paran{Iterating Jarn\'\i{}k's algorithm}%
410 Actually, there is a~much better choice of the algorithms to combine: use the
411 Active Edge Jarn\'\i{}k's algorithm multiple times, each time stopping it after a~while.
412 A~good choice of the stopping condition is to place a~limit on the size of the heap.
413 We start with an~arbitrary vertex, grow the tree as usually and once the heap gets too large,
414 we conserve the current tree and start with a~different vertex and an~empty heap. When this
415 process runs out of vertices, it has identified a~sub-forest of the MST, so we can
416 contract the edges of~this forest and iterate.
417
418 \algn{Iterated Jarn\'\i{}k; Fredman and Tarjan \cite{ft:fibonacci}}\id{itjar}%
419 \algo
420 \algin A~graph~$G$ with an edge comparison oracle.
421 \:$T\=\emptyset$. \cmt{edges of the MST}
422 \:$\ell(e)\=e$ for all edges~$e$. \cmt{edge labels as usually}
423 \:$m_0\=m$.
424 \:While $n>1$: \cmt{We will call iterations of this loop \df{phases}.}
425 \::$F\=\emptyset$. \cmt{forest built in the current phase}
426 \::$t\=2^{\lceil 2m_0/n \rceil}$. \cmt{the limit on heap size}
427 \::While there is a~vertex $v_0\not\in F$:
428 \:::Run the Active Edge Jarn\'\i{}k's algorithm (\ref{jarniktwo}) from~$v_0$, stop when:
429 \::::all vertices have been processed, or
430 \::::a~vertex of~$F$ has been added to the tree, or
431 \::::the heap has grown to more than~$t$ elements.
432 \:::Denote the resulting tree~$R$.
433 \:::$F\=F\cup R$.
434 \::$T\=T\cup \ell[F]$. \cmt{Remember MST edges found in this phase.}
435 \::Contract all edges of~$F$ and flatten~$G$.
436 \algout Minimum spanning tree~$T$.
437 \endalgo
438
439 \nota
440 For analysis of the algorithm, let us denote the graph entering the $i$-th
441 phase by~$G_i$ and likewise with the other parameters. Let the trees from which
442 $F_i$~has been constructed be called $R_i^1, \ldots, R_i^{z_i}$. The
443 non-indexed $G$, $m$ and~$n$ will correspond to the graph given as~input.
444
445 \para
446 However the choice of the parameter~$t$ can seem mysterious, the following
447 lemma makes the reason clear:
448
449 \lemma\id{ijphase}%
450 Each phase of the Iterated Jarn\'\i{}k's algorithm runs in time~$\O(m)$.
451
452 \proof
453 During the $i$-th phase, the heap always contains at most~$t_i$ elements, so it takes
454 time~$\O(\log t_i)=\O(m/n_i)$ to delete an~element from the heap. The trees~$R_i^j$
455 are edge-disjoint, so there are at most~$n_i$ \<DeleteMin>'s over the course of the phase.
456 Each edge is considered at most twice (once per its endpoint), so the number
457 of the other heap operations is~$\O(m_i)$. Together, it equals $\O(m_i + n_i\log t_i) = \O(m_i+m) = \O(m)$.
458 \qed
459
460 \lemma\id{ijsize}%
461 Unless the $i$-th phase is final, the forest~$F_i$ consists of at most $2m_i/t_i$ trees.
462
463 \proof
464 As every edge of~$G_i$ is incident with at most two trees of~$F_i$, it is sufficient
465 to establish that there are at least~$t_i$ edges incident with every such tree, including
466 edges connecting two vertices of the same tree.
467
468 The forest~$F_i$ evolves by additions of the trees~$R_i^j$. Let us consider the possibilities
469 how the algorithm could have stopped growing the tree~$R_i^j$:
470 \itemize\ibull
471 \:the heap had more than~$t_i$ elements (step~10): since the each elements stored in the heap
472   corresponds to a~unique edge incident with~$R_i^j$, we have enough such edges;
473 \:the algorithm just added a~vertex of~$F_i$ to~$R_i^j$ (step~9): in this case, an~existing
474   tree of~$F_i$ is extended, so the number of edges incident with it cannot decrease;\foot{%
475   This is the place where we needed to count the interior edges as well.}
476 \:all vertices have been processed (step~8): this can happen only in the final phase.
477 \qeditem
478 \endlist
479
480 \thm\id{itjarthm}%
481 The Iterated Jarn\'\i{}k's algorithm finds the MST of the input graph in time
482 $\O(m\timesbeta(m,n))$, where $\beta(m,n):=\min\{ i \mid \log^{(i)}n \le m/n \}$.
483
484 \proof
485 Phases are finite and in every phase at least one edge is contracted, so the outer
486 loop is eventually terminated. The resulting subgraph~$T$ is equal to $\mst(G)$, because each $F_i$ is
487 a~subgraph of~$\mst(G_i)$ and the $F_i$'s are glued together according to the Contraction
488 lemma (\ref{contlemma}).
489
490 Let us bound the sizes of the graphs processed in the individual phases. As the vertices
491 of~$G_{i+1}$ correspond to the components of~$F_i$, by the previous lemma $n_{i+1}\le
492 2m_i/t_i$. Then $t_{i+1} = 2^{\lceil 2m/n_{i+1} \rceil} \ge 2^{2m/n_{i+1}} \ge 2^{2m/(2m_i/t_i)} = 2^{(m/m_i)\cdot t_i} \ge 2^{t_i}$,
493 therefore:
494 $$
495 \left. \vcenter{\hbox{$\displaystyle t_i \ge 2^{2^{\scriptstyle 2^{\scriptstyle\rddots^{\scriptstyle m/n}}}} $}}\;\right\}
496 \,\hbox{a~tower of~$i$ exponentials.}
497 $$
498 As soon as~$t_i\ge n$, the $i$-th phase is final, because at that time
499 there is enough space in the heap to process the whole graph without stopping. So~there are
500 at most~$\beta(m,n)$ phases and we already know that each phase runs in linear
501 time (Lemma~\ref{ijphase}).
502 \qed
503
504 \cor
505 The Iterated Jarn\'\i{}k's algorithm runs in time $\O(m\log^* n)$.
506
507 \proof
508 $\beta(m,n) \le \beta(1,n) \le \log^* n$.
509 \qed
510
511 \cor\id{ijdens}%
512 When we use the Iterated Jarn\'\i{}k's algorithm on graphs with edge density
513 at least~$\log^{(k)} n$ for some $k\in{\bb N}^+$, it runs in time~$\O(km)$.
514
515 \proof
516 If $m/n \ge \log^{(k)} n$, then $\beta(m,n)\le k$.
517 \qed
518
519 \paran{Integer weights}%
520 The algorithm spends most of the time in phases which have small heaps. Once the
521 heap grows to $\Omega(\log^{(k)} n)$ for any fixed~$k$, the graph gets dense enough
522 to guarantee that at most~$k$ phases remain. This means that if we are able to
523 construct a~heap of size $\Omega(\log^{(k)} n)$ with constant time per operation,
524 we can get a~linear-time algorithm for MST. This is the case when the weights are
525 integers:
526
527 \thmn{MST for integer weights, Fredman and Willard \cite{fw:transdich}}\id{intmst}%
528 MST of a~graph with integer edge weights can be found in time $\O(m)$ on the Word-RAM.
529
530 \proof
531 We will combine the Iterated Jarn\'\i{}k's algorithm with the Q-heaps from Section \ref{qheaps}.
532 We modify the first pass of the algorithm to choose $t=\log n$ and use the Q-heap tree instead
533 of the Fibonacci heap. From Theorem \ref{qh} and Remark \ref{qhtreerem} we know that the
534 operations on the Q-heap tree run in constant time, so the modified first phase takes time~$\O(m)$.
535 Following the analysis of the original algorithm in the proof of Theorem \ref{itjarthm} we obtain
536 $t_2\ge 2^{t_1} = 2^{\log n} = n$, so the algorithm stops after the second phase.\foot{%
537 Alternatively, we can use the Q-heaps directly with $k=\log^{1/4}n$ and then the algorithm stops
538 after the third phase.}
539 \qed
540
541 \paran{Further improvements}%
542 Gabow et al.~\cite{gabow:mst} have shown how to speed up the Iterated Jarn\'\i{}k's algorithm to~$\O(m\log\beta(m,n))$.
543 They split the adjacency lists of the vertices to small buckets, keep each bucket
544 sorted and consider only the lightest edge in each bucket until it is removed.
545 The mechanics of the algorithm is complex and there is a~lot of technical details
546 which need careful handling, so we omit the description of this algorithm.
547 A~better algorithm will be shown in Chapter~\ref{optchap}.
548
549 %--------------------------------------------------------------------------------
550
551 \section{Verification of minimality}\id{verifysect}%
552
553 Now we will turn our attention to a~slightly different problem: given a~spanning
554 tree, how to verify that it is minimum? We will show that this can be achieved
555 in linear time and it will serve as a~basis for a~randomized linear-time
556 MST algorithm in Section~\ref{randmst}.
557
558 MST verification has been studied by Koml\'os \cite{komlos:verify}, who has
559 proven that $\O(m)$ edge comparisons are sufficient, but his algorithm needed
560 super-linear time to find the edges to compare. Dixon, Rauch and Tarjan \cite{dixon:verify}
561 have later shown that the overhead can be reduced
562 to linear time on the RAM using preprocessing and table lookup on small
563 subtrees. Later, King has given a~simpler algorithm in \cite{king:verifytwo}.
564
565 In this section, we will follow Koml\'os's steps and study the comparisons
566 needed, saving the actual efficient implementation for later.
567
568 \para
569 To verify that a~spanning tree~$T$ is minimum, it is sufficient to check that all
570 edges outside~$T$ are $T$-heavy (by the Minimality Theorem, \ref{mstthm}). In fact, we will be
571 able to find all $T$-light edges efficiently. For each edge $uv\in E\setminus T$,
572 we will find the heaviest edge of the tree path $T[u,v]$ and compare its weight
573 to $w(uv)$. It is therefore sufficient to solve the following problem:
574
575 \problem
576 Given a~weighted tree~$T$ and a~set of \df{query paths} $Q \subseteq \{ T[u,v] \mid u,v\in V(T) \}$
577 specified by their endpoints, find the heaviest edge \df{(peak)} of every path in~$Q$.
578
579 \paran{Bor\o{u}vka trees}%
580 Finding the peaks can be burdensome if the tree~$T$ is degenerated,
581 so we will first reduce it to the same problem on a~balanced tree. We run
582 the Bor\o{u}vka's algorithm on~$T$, which certainly produces $T$ itself, and we
583 record the order, in which the subtrees have been merged, in another tree~$B(T)$.
584 The peak queries on~$T$ can be then easily translated to peak queries on~$B(T)$.
585
586 \defn
587 For a~weighted tree~$T$ we define its \df{Bor\o{u}vka tree} $B(T)$ as a~rooted tree which records
588 the execution of the Bor\o{u}vka's algorithm run on~$T$. The leaves of $B(T)$
589 are all the vertices of~$T$, an~internal vertex~$v$ at level~$i$ from the bottom
590 corresponds to a~component tree~$C(v)$ formed in the $i$-th iteration of the algorithm. When
591 a~tree $C(v)$ selects an adjacent edge~$e$ and gets merged with some other trees to form
592 a~component $C(u)$, we add an~edge $uv$ to~$B(T)$ and set its weight to $w(e)$.
593
594 \figure{bortree.eps}{\epsfxsize}{An octipede and its Bor\o{u}vka tree}
595
596 \obs
597 As the algorithm finishes with a~single component in the last phase, the Bor\o{u}vka tree
598 is really a~tree. All its leaves are on the same level and each internal vertex has
599 at least two sons. Such trees will be called \df{complete branching trees.}
600
601 \lemma
602 For every tree~$T$ and every pair of its vertices $x,y\in V(T)$, the peak
603 of the path $T[x,y]$ has the same weight as the peak of~the path $B(T)[x,y]$.
604
605 \proof
606 Let us denote the path $T[x,y]$ by~$P$ and its heaviest edge by~$h=ab$. Similarly,
607 let us use $P'$ for $B(T)[x,y]$ and $h'$ for the heaviest edge of~$P'$.
608
609 We will first prove that~$h$ has its counterpart of the same weight in~$P'$,
610 so $w(h') \ge w(h)$. Consider the lowest vertex $u$ of~$B(T)$ such that the
611 component $C(u)$ contains both $a$ and~$b$, and consider the sons $v_a$ and $v_b$ of~$u$
612 for which $a\in C(v_a)$ and $b\in C(v_b)$. As the edge~$h$ must have been
613 selected by at least one of these components, we assume without loss of generality that
614 it was $C(v_a)$, and hence we have $w(uv_a)=w(h)$. We will show that the
615 edge~$uv_a$ lies in~$P'$, because exactly one of the vertices $x$, $y$ lies
616 in~$C(v_a)$. Both cannot lie there, since it would imply that $C(v_a)$,
617 being connected, contains the whole path~$P$, including~$h$. On the other hand,
618 if $C(v_a)$ contained neither~$x$ nor~$y$, it would have to be incident with
619 another edge of~$P$ different from~$h$, so this lighter edge would be selected
620 instead of~$h$.
621
622 In the other direction: for any edge~$uv\in P'$, the tree~$C(v)$ is incident
623 with at least one edge of~$P$, so the selected edge must be lighter or equal
624 to this edge and hence also to~$h$.
625 \qed
626
627 \para
628 We will simplify the problem even further: For an~arbitrary tree~$T$, we split each
629 query path $T[x,y]$ to two half-paths $T[x,a]$ and $T[a,y]$ where~$a$ is the
630 \df{lowest common ancestor} of~$x$ and~$y$ in~$T$. It is therefore sufficient to
631 consider only paths that connect a~vertex with one of its ancestors.
632
633 When we combine the two transforms, we get:
634
635 \lemman{Balancing of trees}\id{verbranch}%
636 For each tree~$T$ on $n$~vertices and a~set~$Q$ of $q$~query paths on~$T$, it is possible
637 to find a~complete branching tree~$T'$, together with a~set~$Q'$ of paths on~$T'$,
638 such that the weights of the heaviest edges of the paths in~$Q$ can be deduced from
639 the same of the paths in~$Q'$. The tree $T'$ has at most $2n$ vertices and $\O(\log n)$
640 levels. The set~$Q'$ contains at most~$2q$ paths and each of them connects a~vertex of~$T'$
641 with one of its ancestors. The construction of~$T'$ involves $\O(n)$ comparisons
642 and the transformation of the answers takes $\O(q)$ comparisons.
643
644 \proof
645 The tree~$T'$ will be the Bor\o{u}vka tree for~$T$, obtained by running the
646 contractive version of the Bor\o{u}vka's algorithm (Algorithm \ref{contbor})
647 on~$T$. The algorithm runs in linear time, for example because trees are planar
648 (Theorem \ref{planarbor}). We therefore spend $\O(n)$ comparisons in it.
649
650 As~$T'$ has~$n$ leaves and it is a~complete branching tree, it has at most~$n$ internal vertices,
651 so~$n(T')\le 2n$ as promised. Since the number of iterations of the Bor\o{u}vka's
652 algorithm is $\O(\log n)$, the depth of the Bor\o{u}vka tree must be logarithmic as well.
653
654 For each query path $T[x,y]$ we find the lowest common ancestor of~$x$ and~$y$
655 and split the path by the two half-paths. This produces a~set~$Q'$ of at most~$2q$ half-paths.
656 The peak of every original query path is then the heavier of the peaks of its halves.
657 \qed
658
659 \paran{Bounding comparisons}%
660 We will now describe a~simple variant of the depth-first search which finds the
661 peaks of all query paths of the balanced problem. As we promised,
662 we will take care of the number of comparisons only, as long as all other operations
663 are well-defined and they can be performed in polynomial time.
664
665 \defn
666 For every edge~$e=uv$, we consider the set $Q_e$ of all query paths containing~$e$.
667 The vertex of a~path, that is closer to the root, will be called the \df{top} of the path,
668 the other vertex its \df{bottom.}
669 We define arrays $T_e$ and~$P_e$ as follows: $T_e$~contains
670 the tops of the paths in~$Q_e$ in order of their increasing depth (we
671 will call them \df{active tops} and each of them will be stored exactly once). For
672 each active top~$t=T_e[i]$, we define $P_e[i]$ as the peak of the path $T[v,t]$.
673
674 \obs
675 As for every~$i$ the path $T[v,T_e[i+1]]$ is contained within $T[v,T_e[i]]$,
676 the edges of~$P_e$ must have non-increasing weights, that is $w(P_e[i+1]) \le
677 w(P_e[i])$.
678 This leads to the following algorithm:
679
680 \alg $\<FindPeaks>(u,p,T_p,P_p)$ --- process all queries located in the subtree rooted
681 at~$u$ entered from its parent via an~edge~$p$.
682 \id{findpeaks}
683
684 \algo
685 \:Process all query paths whose bottom is~$u$ and record their peaks.
686 This is accomplished by finding the index~$i$ of each path's top in~$T_p$ and reading
687 the desired edge from~$P_p[i]$.
688
689 \:For every son~$v$ of~$u$, process the edge $e=uv$:
690
691 \::Construct the array of tops~$T_e$ for the edge~$e$: Start with~$T_p$, remove
692    the tops of the paths that do not contain~$e$ and add the vertex~$u$ itself
693    if there is a~query path which has~$u$ as its top and whose bottom lies somewhere
694    in the subtree rooted at~$v$.
695
696 \::Prepare the array of the peaks~$P_e$: Start with~$P_p$, remove the entries
697    corresponding to the tops that are no longer active. If $u$ became an~active
698    top, append~$e$ to the array.
699
700 \::Finish~$P_e$:
701    Since the paths leading to all active tops have been extended by the
702    edge~$e$, compare $w(e)$ with weights of the edges recorded in~$P_e$ and replace
703    those edges which are lighter by~$e$.
704    Since $P_p$ was sorted, we can use binary search
705    to locate the boundary between the lighter and heavier edges in~$P_e$.
706
707 \::Recurse on~$v$: call $\<FindPeaks>(v,e,T_e,P_e)$.
708 \endalgo
709
710 \>As we need a~parent edge to start the recursion, we add an~imaginary parent
711 edge~$p_0$ of the root vertex~$r$, for which no queries are defined. We can
712 therefore start with $\<FindPeaks>(r,p_0,\emptyset,\emptyset)$.
713
714 Let us account for the comparisons:
715
716 \lemma\id{vercompares}%
717 When the procedure \<FindPeaks> is called on the balanced problem, it
718 performs $\O(n+q)$ comparisons, where $n$ is the size of the tree and
719 $q$ is the number of query paths.
720
721 \proof
722 We will calculate the number of comparisons~$c_i$ performed when processing the edges
723 going from the $(i+1)$-th to the $i$-th level of the tree.
724 The levels are numbered from the bottom, so leaves are at level~0 and the root
725 is at level $\ell\le \lceil \log_2 n\rceil$. There are $n_i\le n/2^i$ vertices
726 at the $i$-th level, so we consider exactly $n_i$ edges. To avoid taking a~logarithm\foot{All logarithms are binary.}
727 of zero, we define $\vert T_e\vert=1$ for $T_e=\emptyset$.
728 \def\eqalign#1{\null\,\vcenter{\openup\jot
729   \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
730       \crcr#1\crcr}}\,}
731 $$\vcenter{\openup\jot\halign{\strut\hfil $\displaystyle{#}$&$\displaystyle{{}#}$\hfil&\quad#\hfil\cr
732 c_i &\le \sum_e \left( 1 + \log \vert T_e\vert \right)&(Total cost of the binary searches.)\cr
733     &\le n_i + \sum_e \log\vert T_e\vert&(We sum over $n_i$ edges.)\cr
734     &\le n_i + n_i \cdot {\sum_e \log\vert T_e\vert \over n_i}&(Consider the average of logarithms.) \cr
735     &\le n_i + n_i \cdot \log{\sum_e \vert T_e\vert \over n_i}&(Logarithm is concave.) \cr
736     &\le n_i + n_i \cdot \log{q+n\over n_i}&(Bound the number of tops by queries.) \cr
737     &= n_i \cdot \left( 1 + \log\left({q+n\over n}\cdot{n\over n_i}\right) \right)\cr
738     &= n_i + n_i\log{q+n\over n} + n_i\log{n\over n_i}.\cr
739 }}$$
740 Summing over all levels, we estimate the total number of comparisons as:
741 $$
742 c = \sum_i c_i = \left( \sum_i n_i \right) + \left( \sum_i n_i \log{q+n\over n}\right) + \left( \sum_i n_i \log{n\over n_i}\right).
743 $$
744 The first part is equal to~$n$, the second one to $n\log((q+n)/n)\le q+n$. For the third
745 one, we would like to plug in the bound $n_i \le n/2^i$, but we unfortunately have one~$n_i$
746 in the denominator. We save the situation by observing that the function $f(x)=x\log(n/x)$
747 is decreasing\foot{We can easily check the derivative: $f(x)=(x\ln n-x\ln x)/\ln 2$, so $f'(x)\cdot \ln2 =
748 \ln n - \ln x - 1$. We want $f'(x)<0$ and therefore $\ln x > \ln n - 1$, i.e., $x > n/e$.}
749 for $x > n/e$, so for $i\ge 2$ it holds that:
750 $$
751 n_i\log{n\over n_i} \le {n\over 2^i}\cdot\log{n\over n/2^i} = {n\over 2^i} \cdot i.
752 $$
753 We can therefore rewrite the third part as:
754 $$\eqalign{
755 \sum_i n_i\log{n\over n_i} &\le n_0\log{n\over n_0} + n_1\log{n\over n_1} + n\cdot\sum_{i\ge 2}{i\over 2^i} \le\cr
756 &\le n\log1 + n_1\cdot {n\over n_1} + n\cdot\O(1) = \O(n).\cr
757 }$$
758 Putting all three parts together, we conclude that:
759 $$
760 c \le n + (q+n) + \O(n) = \O(n+q). \qedmath
761 $$
762
763 \para
764 When we combine this lemma with the above reduction from general trees to balanced trees, we get the following theorem:
765
766 \thmn{Verification of the MST, Koml\'os \cite{komlos:verify}}\id{verify}%
767 For every weighted graph~$G$ and its spanning tree~$T$, it is sufficient to
768 perform $\O(m)$ comparisons of edge weights to determine whether~$T$ is minimum
769 and to find all $T$-light edges in~$G$.
770
771 \proof
772 We first transform the problem to finding all peaks of a~set
773 of query paths in~$T$ (these are exactly the paths covered by the edges
774 of $G\setminus T$). We use the reduction from Lemma \ref{verbranch} to get
775 an~equivalent problem with a~full branching tree and a~set of parent-descendant
776 paths. The reduction costs $\O(m+n)$ comparisons.
777 Then we run the \<FindPeaks> procedure (Algorithm \ref{findpeaks}) to find
778 the tops of all query paths. According to Lemma \ref{vercompares}, this spends another $\O(m+n)$
779 comparisons. Since we (as always) assume that~$G$ is connected, $\O(m+n)=\O(m)$.
780 \qed
781
782 \paran{Other applications}%
783 The problem of computing path maxima or minima in a~weighted tree has several other interesting
784 applications. One of them is computing minimum cuts separating given pairs of vertices in a~given
785 weighted undirected graph~$G$. We construct a~Gomory-Hu tree~$T$ for the graph as described in \cite{gomoryhu}
786 (see also \cite{bhalgat:ght} for a~more efficient algorithm running in time
787 $\widetilde\O(mn)$ for unit-cost graphs). The crucial property of this tree is that for every two
788 vertices $u$, $v$ of the graph~$G$, the minimum-cost edge on $T[u,v]$ has the same cost
789 as the minimum cut separating $u$ and~$v$ in~$G$. Since the construction of~$T$ generally
790 takes $\Omega(n^2)$ time, we could of course invest this time in precomputing the minima for
791 all pairs of vertices. This would however require quadratic space, so we can better use
792 the method of this section which fits in $\O(n+q)$ space for $q$~queries.
793
794 \paran{Dynamic verification}%
795 A~dynamic version of the problem is also often considered. It calls for a~data structure
796 representing a~weighted forest with operations for modifying the structure of the forest
797 and querying minima or maxima on paths. Sleator and Tarjan have shown in \cite{sleator:trees}
798 how to do this in $\O(\log n)$ time amortized per operation, which leads to
799 an~implementation of the Dinic's maximum flow algorithm \cite{dinic:flow}
800 in time $\O(mn\log n)$.
801
802 %--------------------------------------------------------------------------------
803
804 \section{Verification in linear time}\id{verifysect}%
805
806 We have proven that $\O(m)$ edge weight comparisons suffice to verify minimality
807 of a~given spanning tree. Now we will show an~algorithm for the RAM
808 which finds the required comparisons in linear time. We will follow the idea
809 of King from \cite{king:verifytwo}, but as we have the power of the RAM data structures
810 from Section~\ref{bitsect} at our command, the low-level details will be easier,
811 especially the construction of vertex and edge labels.
812
813 \para
814 First of all, let us make sure that the reduction to fully branching trees
815 in the Balancing lemma (\ref{verbranch}) can be made run in linear time. As already noticed
816 in the proof, the Bor\o{u}vka's algorithm runs in linear time. Constructing
817 the Bor\o{u}vka tree in the process adds at most a~constant overhead to every
818 step of the algorithm.
819
820 Finding the common ancestors is not trivial, but Harel and Tarjan have shown
821 in \cite{harel:nca} that linear time is sufficient on the RAM. Several more
822 accessible algorithms have been developed since then (see the Alstrup's survey
823 paper \cite{alstrup:nca} and a~particularly elegant algorithm described by Bender
824 and Falach-Colton in \cite{bender:lca}). Any of them implies the following
825 theorem:
826
827 \thmn{Lowest common ancestors}\id{lcathm}%
828 On the RAM, it is possible to preprocess a~tree~$T$ in time $\O(n)$ and then
829 answer lowest common ancestor queries presented online in constant time.
830
831 \cor
832 The reductions in Lemma \ref{verbranch} can be performed in time $\O(m)$.
833
834 \para
835 Having the balanced problem at hand, it remains to implement the procedure \<FindPeaks>
836 of Algorithm \ref{findpeaks} efficiently. We need a~compact representation of
837 the arrays $T_e$ and~$P_e$, which will allow to reduce the overhead of the algorithm
838 to time linear in the number of comparisons performed. To achieve
839 this goal, we will encode the arrays in RAM vectors (see Section \ref{bitsect}
840 for the vector operations).
841
842 \defn
843
844 \em{Vertex identifiers:} Since all vertices processed by the procedure
845 lie on the path from the root to the current vertex~$u$, we modify the algorithm
846 to keep a~stack of these vertices in an~array. We will often refer to each vertex by its
847 index in this array, i.e., by its depth. We will call these identifiers \df{vertex
848 labels} and we note that each label requires only $\ell=\lceil \log\lceil\log n\rceil\rceil$
849 bits. As every tree edge is uniquely identified by its bottom vertex, we can
850 use the same encoding for \df{edge labels.}
851
852 \em{Slots:} As we are going to need several operations which are not computable
853 in constant time on the RAM, we precompute tables for these operations
854 like we did in the Q-heaps (cf.~Lemma \ref{qhprecomp}). A~table for word-sized
855 arguments would take too much time to precompute, so we will generally store
856 our data structures in \df{slots} of $s=\lceil 1/3\cdot\log n\rceil$ bits each.
857 We will soon show that it is possible to precompute a~table of any reasonable
858 function whose arguments fit in two slots.
859
860 \em{Top masks:} The array~$T_e$ will be represented by a~bit mask~$M_e$ called the \df{top mask.} For each
861 of the possible tops~$t$ (i.e., the ancestors of the current vertex), we store
862 a~single bit telling whether $t\in T_e$. Each top mask fits in $\lceil\log n\rceil$
863 bits and therefore in a~single machine word. If needed, it can be split to three slots.
864 Unions and intersections of sets of tops then translate to $\band$/$\bor$
865 on the top masks.
866
867 \em{Small and big lists:} The heaviest edge found so far for each top is stored
868 by the algorithm in the array~$P_e$. Instead of keeping the real array,
869 we store the labels of these edges in a~list encoded in a~bit string.
870 Depending on the size of the list, we use one of two possible encodings:
871 \df{Small lists} are stored in a~vector that fits in a~single slot, with
872 the unused fields filled by a~special constant, so that we can easily infer the
873 length of the list.
874
875 If the data do not fit in a~small list, we use a~\df{big list} instead. It
876 is stored in $\O(\log\log n)$ words, each of them containing a~slot-sized
877 vector. Unlike the small lists, we use the big lists as arrays. If a~top~$t$ of
878 depth~$d$ is active, we keep the corresponding entry of~$P_e$ in the $d$-th
879 field of the big list. Otherwise, we keep that entry unused.
880
881 We want to perform all operations on small lists in constant time,
882 but we can afford spending time $\O(\log\log n)$ on every big list. This
883 is true because whenever we use a~big list, $\vert T_e\vert = \Omega(\log n/\log\log n)$,
884 hence we need $\log\vert T_e\vert = \Omega(\log\log n)$ comparisons anyway.
885
886 \em{Pointers:} When we need to construct a~small list containing a~sub-list
887 of a~big list, we do not have enough time to see the whole big list. To handle
888 this, we introduce \df{pointers} as another kind of edge identifiers.
889 A~pointer is an~index to the nearest big list on the path from the small
890 list containing the pointer to the root. As each big list has at most $\lceil\log n\rceil$
891 fields, the pointer fits in~$\ell$ bits, but we need one extra bit to distinguish
892 between regular labels and pointers.
893
894 \lemman{Precomputation of tables}
895 When~$f$ is a~function of up to two arguments computable in polynomial time, we can
896 precompute a~table of the values of~$f$ for all values of arguments that fit
897 in a~single slot. The precomputation takes $\O(n)$ time.
898
899 \proof
900 Similar to the proof of Lemma \ref{qhprecomp}. There are $\O(2^{2s}) = \O(n^{2/3})$
901 possible values of arguments, so the precomputation takes time $\O(n^{2/3}\cdot\poly(s))
902 = \O(n^{2/3}\cdot\poly(\log n)) = \O(n)$.
903 \qed
904
905 \example
906 As we can afford spending $\O(n)$ time on preprocessing,
907 we can assume that we can compute the following functions in constant time:
908
909 \itemize\ibull
910 \:$\<Weight>(x)$ --- the Hamming weight of a~slot-sized number~$x$
911 (we already considered this operation in Algorithm \ref{lsbmsb}, but we needed
912 quadratic word size for it). We can easily extend this function to $\log n$-bit numbers
913 by splitting the number in three slots and adding their weights.
914
915 \:$\<FindKth>(x,k)$ --- the $k$-th set bit from the top of the slot-sized
916 number~$x$. Again, this can be extended to multi-slot numbers by calculating
917 the \<Weight> of each slot first and then finding the slot containing the
918 $k$-th~\1.
919
920 \:$\<Bits>(m)$ --- for a~slot-sized bit mask~$m$, it returns a~small list
921 of the positions of the bits set in~$\(m)$.
922
923 \:$\<Select>(x,m)$ --- constructs a~slot containing the substring of $\(x)$
924 selected by the bits set in~$\(m)$.
925
926 \:$\<SubList>(x,m)$ --- when~$x$ is a~small list and~$m$ a bit mask, it returns
927 a~small list containing the elements of~$x$ selected by the bits set in~$m$.
928 \endlist
929
930 \para
931 We will now show how to perform all parts of the procedure \<FindPeaks>
932 in the required time. We will denote the size of the tree by~$n$ and the
933 number of query paths by~$q$.
934
935 \lemma
936 Depths of all vertices and all top masks can be computed in time $\O(n+q)$.
937
938 \proof
939 Run depth-first search on the tree, assign the depth of a~vertex when entering
940 it and construct its top mask when leaving it. The top mask can be obtained
941 by $\bor$-ing the masks of its sons, excluding the level of the sons and
942 including the tops of all query paths that have their bottoms at the current vertex
943 (the depths of the tops are already assigned).
944 \qed
945
946 \lemma\id{verth}%
947 The arrays $T_e$ and~$P_e$ can be indexed in constant time.
948
949 \proof
950 Indexing~$T_e$ is exactly the operation \<FindKth> applied on the corresponding
951 top mask~$M_e$.
952
953 If $P_e$ is stored in a~big list, we calculate the index of the particular
954 slot and the position of the field inside the slot. This field can be then
955 extracted using bit masking and shifts.
956
957 If it is a~small list, we extract the field directly, but we have to
958 dereference it in case it is a pointer. We modify the recursion in \<FindPeaks>
959 to pass the depth of the lowest edge endowed with a~big list and when we
960 encounter a~pointer, we index this big list.
961 \qed
962
963 \lemma\id{verhe}%
964 For an~arbitrary active top~$t$, the corresponding entry of~$P_e$ can be
965 extracted in constant time.
966
967 \proof
968 We look up the precomputed depth~$d$ of~$t$ first.
969 If $P_e$ is stored in a~big list, we extract the $d$-th entry of the list.
970 If the list is small, we find the position of the particular field
971 by counting bits of the top mask~$M_e$ at position~$d$ and higher
972 (this is \<Weight> of $M_e$ with the lower bits masked out).
973 \qed
974
975 \lemma\id{verfh}%
976 \<FindPeaks> processes an~edge~$e$ in time $\O(\log \vert T_e\vert + q_e)$,
977 where $q_e$~is the number of query paths having~$e$ as its bottom edge.
978
979 \proof
980 The edge is examined in steps 1, 3, 4 and~5 of the algorithm. We will show how to
981 perform each of these steps in constant time if $P_e$ is a~small list or
982 $\O(\log\log n)$ if it is big.
983
984 \em{Step~1} looks up $q_e$~tops in~$P_e$ and we already know from Lemma \ref{verhe}
985 how to do that in constant time per top.
986
987 \em{Step~3} is trivial as we have already computed the top masks and we can
988 reconstruct the entries of~$T_e$ in constant time according to Lemma \ref{verth}.
989
990 \em{Step~5} involves binary search on~$P_e$ in $\O(\log\vert T_e\vert)$ comparisons,
991 each of them indexes~$P_e$, which is $\O(1)$ again by Lemma \ref{verth}. Rewriting the
992 lighter edges is $\O(1)$ for small lists by replication and bit masking, for a~big
993 list we do the same for each of its slots.
994
995 \em{Step~4} is the only non-trivial one. We already know which tops to select
996 (we have the top masks $M_e$ and~$M_p$ precomputed), but we have to carefully
997 extract the sublist.
998 We need to handle these four cases:
999
1000 \itemize\ibull
1001 \:\em{Small from small:} We use $\<Select>(T_e,T_p)$ to find the fields of~$P_p$
1002 that shall be deleted by a~subsequent call to \<SubList>. Pointers
1003 can be retained as they still refer to the same ancestor list.
1004
1005 \:\em{Big from big:} We can copy the whole~$P_p$, since the layout of the
1006 big lists is fixed and the items, which we do not want, simply end up as unused
1007 fields in~$P_e$.
1008
1009 \:\em{Small from big:} We use the operation \<Bits> to construct a~list
1010 of pointers (we use bit masking to add the ``this is a~pointer'' flags).
1011
1012 \:\em{Big from small:} First we have to dereference the pointers in the
1013 small list~$S$. For each slot~$B_i$ of the ancestor big list, we construct
1014 a~subvector of~$S$ containing only the pointers referring to that slot,
1015 adjusted to be relative to the beginning of the slot (we use \<Compare>
1016 and \<Replicate> from Algorithm \ref{vecops} and bit masking). Then we
1017 use a~precomputed table to replace the pointers by the fields of~$B_i$
1018 they point to. We $\bor$ together the partial results and we again have
1019 a~small list.
1020
1021 Finally, we have to spread the fields of this small list to the whole big list.
1022 This is similar: for each slot of the big list, we find the part of the small
1023 list keeping the fields we want (we call \<Weight> on the sub-words of~$M_e$ before
1024 and after the intended interval of depths) and we use a~tabulated function
1025 to shift the fields to the right locations in the slot (controlled by the
1026 sub-word of~$M_e$ in the intended interval).
1027 \qeditem
1028 \endlist
1029
1030 \>We now have all the necessary ingredients to prove the following theorem
1031 and thus conclude this section:
1032
1033 \thmn{Verification of MST on the RAM}\id{ramverify}%
1034 There is a~RAM algorithm which for every weighted graph~$G$ and its spanning tree~$T$
1035 determines whether~$T$ is minimum and finds all $T$-light edges in~$G$ in time $\O(m)$.
1036
1037 \proof
1038 Implement the Koml\'os's algorithm from Theorem \ref{verify} with the data
1039 structures developed in this section.
1040 According to Lemma \ref{verfh}, the algorithm runs in time $\sum_e \O(\log\vert T_e\vert + q_e)
1041 = \O(\sum_e \log\vert T_e\vert) + \O(\sum_e q_e)$. The second sum is $\O(m)$
1042 as there are $\O(1)$ query paths per edge, the first sum is $\O(\#\hbox{comparisons})$,
1043 which is $\O(m)$ by Theorem \ref{verify}.
1044 \qed
1045
1046 \>In Section \ref{kbestsect}, we will need a~more specialized statement:
1047
1048 \cor\id{rampeaks}%
1049 There is a~RAM algorithm which for every weighted tree~$T$ and a~set~$P$ of
1050 paths in~$T$ calculates the peaks of these paths in time $\O(n(T) + \vert P\vert)$.
1051
1052 \paran{Verification on the Pointer Machine}\id{pmverify}%
1053 Buchsbaum et al.~\cite{buchsbaum:verify} have recently shown that linear-time
1054 verification can be achieved even on the Pointer Machine. They first solve the
1055 problem of finding the lowest common ancestors for a~set of pairs of vertices
1056 by batch processing: They combine an~algorithm of time complexity $\O(m\timesalpha(m,n))$
1057 based on the Disjoint Set Union data structure with the framework of topological graph
1058 computations described in Section \ref{bucketsort}. Then they use a~similar
1059 technique for finding the peaks themselves.
1060
1061 \paran{Online verification}%
1062 The online version of this problem has turned out to be more difficult. It calls for an~algorithm
1063 that preprocesses the tree and then answers queries for peaks of paths presented online. Pettie
1064 \cite{pettie:onlineverify} has proven an~interesting lower bound based on the inverses of the
1065 Ackermann's function. If we want to answer queries within $t$~comparisons, we
1066 have to invest $\Omega(n\log\lambda_t(n))$ time into preprocessing.\foot{$\lambda_t(n)$ is the
1067 $t$-th row inverse of the Ackermann's function, $\alpha(n)$ is its diagonal inverse. See
1068 \ref{ackerinv} for the exact definitions.} This implies that with
1069 preprocessing in linear time, the queries require $\Omega(\alpha(n))$ time.
1070
1071 %--------------------------------------------------------------------------------
1072
1073 \section{A randomized algorithm}\id{randmst}%
1074
1075 When we analysed the Contractive Bor\o{u}vka's algorithm in Section~\ref{contalg},
1076 we observed that while the number of vertices per iteration decreases exponentially,
1077 the number of edges generally does not, so we spend $\Theta(m)$ time on every phase.
1078 Karger, Klein and Tarjan \cite{karger:randomized} have overcome this problem by
1079 combining the Bor\o{u}vka's algorithm with filtering based on random sampling.
1080 This leads to a~randomized algorithm which runs in linear expected time.
1081
1082 The principle of the filtering is simple: Let us consider any spanning tree~$T$
1083 of the input graph~$G$. Each edge of~$G$ that is $T$-heavy is the heaviest edge
1084 of some cycle, so by the Red lemma (\ref{redlemma}) it cannot participate in
1085 the MST of~$G$. We can therefore discard all $T$-heavy edges and continue with
1086 finding the MST on the reduced graph. Of course, not all choices of~$T$ are equally
1087 good, but it will soon turn out that when we take~$T$ as the MST of a~randomly selected
1088 subgraph, only a~small expected number of edges remains.
1089
1090 Selecting a~subgraph at random will unavoidably produce disconnected subgraphs
1091 at occasion, so we will drop the implicit assumption that all graphs are
1092 connected for this section and we will always search for the minimum spanning forest.
1093 As we already noted (\ref{disconn}), with a~little bit of care our
1094 algorithms and theorems keep working.
1095
1096 Since we need the MST verification algorithm for finding the $T$-heavy edges,
1097 we will assume that we are working on the RAM.
1098
1099 \lemman{Random sampling, Karger \cite{karger:sampling}}\id{samplemma}%
1100 Let $H$~be a~subgraph of~$G$ obtained by including each edge independently
1101 with probability~$p$. Let further $F$~be the minimum spanning forest of~$H$. Then the
1102 expected number of $F$-nonheavy\foot{That is, $F$-light edges and also edges of~$F$ itself.}
1103 edges in~$G$ is at most $n/p$.
1104
1105 \proof
1106 Let us observe that we can obtain the forest~$F$ by running the Kruskal's algorithm
1107 (\ref{kruskal}) combined with the random process producing~$H$ from~$G$. We sort all edges of~$G$
1108 by their weights and we start with an~empty forest~$F$. For each edge, we first
1109 flip a~biased coin (that gives heads with probability~$p$) and if it comes up
1110 tails, we discard the edge. Otherwise we perform a~single step of the Kruskal's
1111 algorithm: We check whether $F+e$ contains a~cycle. If it does, we discard~$e$, otherwise
1112 we add~$e$ to~$F$. At the end, we have produced the subgraph~$H$ and its MSF~$F$.
1113
1114 When we  exchange the check for cycles with flipping the coin, we get an~equivalent
1115 algorithm which will turn out to be more convenient to analyse:
1116 \algo
1117 \:If $F+e$ contains a~cycle, we immediately discard~$e$ (we can flip
1118 the coin, but we need not to, because the edge will be discarded regardless of
1119 the outcome). We note that~$e$ is $F$-heavy with respect to both the
1120 current state of~$F$ and the final MSF.
1121 \:If $F+e$ is acyclic, we flip the coin:
1122 \::If it comes up heads, we add~$e$ to~$F$. In this case, $e$~is neither $F$-light
1123    nor $F$-heavy.
1124 \::If it comes up tails, we discard~$e$. Such edges are $F$-light.
1125 \endalgo
1126
1127 The number of $F$-nonheavy edges is therefore equal to the total number of the coin
1128 flips in step~2 of this algorithm. We also know that the algorithm stops before
1129 it adds $n$~edges to~$F$. Therefore it flips at most as many coins as a~simple
1130 random process that repeatedly flips until it gets~$n$ heads. As waiting for
1131 every occurrence of heads takes expected time~$1/p$, waiting for~$n$ heads
1132 must take $n/p$. This is the bound we wanted to achieve.
1133 \qed
1134
1135 \para
1136 We will formulate the algorithm as a~doubly-recursive procedure. It alternatively
1137 performs steps of the Bor\o{u}vka's algorithm and filtering based on the above lemma.
1138 The first recursive call computes the MSF of the sampled subgraph, the second one
1139 finds the MSF of the original graph, but without the heavy edges.
1140
1141 As in all contractive algorithms, we use edge labels to keep track of the
1142 original locations of the edges in the input graph. For the sake of simplicity,
1143 we do not mention it in the algorithm explicitly.
1144
1145 \algn{MSF by random sampling --- the KKT algorithm}\id{kkt}%
1146 \algo
1147 \algin A~graph $G$ with an~edge comparison oracle.
1148 \:Remove isolated vertices from~$G$. If no vertices remain, stop and return an~empty forest.
1149 \:Perform two Bor\o{u}vka steps (iterations of Algorithm \ref{contbor}) on~$G$ and
1150   remember the set~$B$ of the edges having been contracted.
1151 \:Select a~subgraph~$H\subseteq G$ by including each edge independently with
1152   probability $1/2$.
1153 \:$F\=\msf(H)$ calculated recursively.
1154 \:Construct $G'\subseteq G$ by removing all $F$-heavy edges of~$G$.
1155 \:$R\=\msf(G')$ calculated recursively.
1156 \:Return $R\cup B$.
1157 \algout The minimum spanning forest of~$G$.
1158 \endalgo
1159
1160 \nota
1161 Let us analyse the time complexity of this algorithm by studying properties of its \df{recursion tree.}
1162 This tree describes the subproblems processed by the recursive calls. For any vertex~$v$
1163 of the tree, we denote the number of vertices and edges of the corresponding subproblem~$G_v$
1164 by~$n_v$ and~$m_v$ respectively.
1165 If $m_v>0$, the recursion continues: the left son of~$v$ corresponds to the
1166 call on the sampled subgraph~$H_v$, the right son to the reduced graph~$G^\prime_v$.
1167 (Similarly, we use letters subscripted with~$v$ for the state of the other variables
1168 of the algorithm.)
1169 The root of the recursion tree is obviously the original graph~$G$, the leaves are
1170 trivial graphs with no edges.
1171
1172 \obs
1173 The Bor\o{u}vka steps together with the removal of isolated vertices guarantee that the number
1174 of vertices drops at least by a~factor of four in every recursive call. The size of a~subproblem~$G_v$
1175 at level~$i$ is therefore at most $n/4^i$ and the depth of the tree is at most $\lceil\log_4 n\rceil$.
1176 As there are no more than~$2^i$ subproblems at level~$i$, the sum of all~$n_v$'s
1177 on that level is at most $n/2^i$, which is at most~$2n$ when summed over the whole tree.
1178
1179 We are going to show that the worst case of the KKT algorithm is not worse than
1180 of the plain contractive algorithm, while the average case is linear.
1181
1182 \lemma
1183 For every subproblem~$G_v$, the KKT algorithm spends $\O(m_v+n_v)$ time plus the cost
1184 of the recursive calls.
1185
1186 \proof
1187 We know from Lemma \ref{contiter} that each Bor\o{u}vka step takes time $\O(m_v+n_v)$.\foot{We
1188 need to add $n_v$, because the graph could be disconnected.}
1189 The selection of the edges of~$H_v$ is straightforward.
1190 Finding the $F_v$-heavy edges is not, but we have already shown in Theorem \ref{ramverify}
1191 that linear time is sufficient on the RAM.
1192 \qed
1193
1194 \thmn{Worst-case complexity of the KKT algorithm}
1195 The KKT algorithm runs in time $\O(\min(n^2,m\log n))$ in the worst case on the RAM.
1196
1197 \proof
1198 The argument for the $\O(n^2)$ bound is similar to the analysis of the plain
1199 contractive algorithm. As every subproblem~$G_v$ is a~simple graph, the number
1200 of its edges~$m_v$ is less than~$n_v^2$. By the previous lemma, we spend time
1201 $\O(n_v^2)$ on it. Summing over all subproblems yields $\sum_v \O(n_v^2) =
1202 \O((\sum_v n_v)^2) = \O(n^2)$.
1203
1204 In order to prove the $\O(m\log n)$ bound, it is sufficient to show that the total time
1205 spent on every level of the recursion tree is $\O(m)$. Suppose that $v$~is a~vertex
1206 of the recursion tree with its left son~$\ell$ and right son~$r$. Some edges of~$G_v$
1207 are removed in the Bor\o{u}vka steps, let us denote their number by~$b_v$.
1208 The remaining edges fall either to~$G_\ell = H_v$, or to $G_r = G^\prime_v$, or possibly
1209 to both.
1210
1211 We can observe that the intersection $G_\ell\cap G_r$ cannot be large: The edges of~$H_v$ that
1212 are not in the forest~$F_v$ are $F_v$-heavy, so they do not end up in~$G_r$. Therefore the
1213 intersection can contain only the edges of~$F_v$. As there are at most $n_v/4$ such edges,
1214 we have $m_\ell + m_r + b_v \le m_v + n_v/4$.
1215
1216 On the other hand, the first Bor\o{u}vka step selects at least $n_v/2$ edges,
1217 so $b_v \ge n_v/2$. The duplication of edges between $G_\ell$ and~$G_r$ is therefore
1218 compensated by the loss of edges by contraction and $m_\ell + m_r \le m_v$. So the total
1219 number of edges per level does not decrease and it remains to apply the previous lemma.
1220 \qed
1221
1222 \thmn{Expected complexity of the KKT algorithm}\id{kktavg}%
1223 The expected time complexity of the KKT algorithm on the RAM is $\O(m)$.
1224
1225 \proof
1226 The structure of the recursion tree depends on the random choices taken,
1227 but as its worst-case depth is at most~$\lceil \log_4 n\rceil$, the tree
1228 is always a~subtree of the complete binary tree of that depth. We will
1229 therefore prove the theorem by examining the complete tree, possibly with
1230 empty subproblems in some vertices.
1231
1232 The left edges of the tree (edges connecting a~parent with its left
1233 son) form a~set of \df{left paths.} Let us consider the expected time spent on
1234 a~single left path. When walking the path downwards from its top vertex~$r$,
1235 the expected size of the subproblems decreases exponentially: for a~son~$\ell$
1236 of a~vertex~$v$, we have $n_\ell \le n_v/4$ and $\E m_\ell = \E m_v/2$. The
1237 expected total time spend on the path is therefore $\O(n_r+m_r)$ and it remains
1238 to sum this over all left paths.
1239
1240 With the exception of the path going from the root of the tree,
1241 the top~$r$ of a~left path is always a~right son of a~unique parent vertex~$v$.
1242 Since the subproblem~$G_r$ has been obtained from its parent subproblem~$G_v$
1243 by filtering out all heavy edges, we can use the Sampling lemma (\ref{samplemma}) to show that
1244 $\E m_r \le 2n_v$. The sum of the expected sizes of all top subproblems is
1245 then $\sum_r n_r + m_r \le \sum_v 3n_v = \O(n)$. After adding the exceptional path
1246 from the root, we get $\O(m+n)=\O(m)$.
1247 \qed
1248
1249 \paran{High probability}%
1250 There is also a~high-probability version of the above theorem. According to
1251 Karger, Klein and Tarjan \cite{karger:randomized}, the time complexity
1252 of the algorithm is $\O(m)$ with probability $1-\exp(-\Omega(m))$. The proof
1253 again follows the recursion tree and it involves applying the Chernoff bound
1254 \cite{chernoff} to bound the tail probabilities.
1255
1256 \paran{Different sampling}%
1257 We could also use a~slightly different formulation of the Sampling lemma
1258 suggested by Chan \cite{chan:backward}. He changes the selection of the subgraph~$H$
1259 to choosing an~$mp$-edge subset of~$E(G)$ uniformly at random. The proof is then
1260 a~straightforward application of the backward analysis method. We however preferred
1261 the Karger's original version, because generating a~random subset of a~given size
1262 requires an~unbounded number of random bits in the worst case.
1263
1264 \paran{On the Pointer Machine}%
1265 The only place where we needed the power of the RAM is finding the heavy edges,
1266 so we can employ the pointer-machine verification algorithm mentioned in \ref{pmverify}
1267 to bring the results of this section to the~PM.
1268
1269 \endpart