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