The Kitchen Sink and Other Oddities

Atabey Kaygun

Generating Uniformly Random Trees

Description of the Problem

Today, I would like to write an algorithm that would generate a random tree on n vertices so that every such randomly created tree shows up equally likely among all possible trees on n vertices.

The Algorithm

I will construct the tree as a topologically ordered directed graph and then remove the direction information.

I will call an undirected graph topologically ordered if there is an orientation of the edges such that the resulting directed graph is topologically ordered. In other words, if G is a topologically ordered undirected graph if there is a topologically ordered directed graph H such that when we forget about the directions of the edges of H we get G.

Assume we already have a random tree T on n1 vertices. Pick a vertex i uniformly random, and connect an edge (i,n) to form a new graph S. Since T was a tree, it does not contain any cycles. Since n is a new vertex added to T, the new graph S does not contain a cycle either.

As for the likelihood of our trees: There is only one tree on 2 vertices. So, picking a topologically ordered tree on 2 vertices by our algorithm is uniformly random with probability 1. Now, assume by induction that picking a topologically ordered tree on n1 vertices with the algorithm we described above is uniformly random. Assume on the contrary that there is a topologically ordered tree S on n+1 vertices which is more likely to appear from our algorithm. We know that S is obtained from a topologically ordered tree T on n vertices by adding a single vertex n+1 and a single edge (i,n+1) where i=1,,n. We also know that picking an edge (i,n+1) is uniformly random for i=1,,n with probability 1n. This means that P(S)=P(T)n and T would have to appear more likely among all topologically ordered trees on n vertices. This is a contradiction.

The Lisp Code

The lisp code is pretty straightforward.

(defun random-tree (n)
   (loop for i from 1 below n 
         collect (list (random i) i)))

RANDOM-TREE

(random-tree 7)

((0 1) (0 2) (1 3) (0 4) (1 5) (2 6))