Let G(V,E) be an undirected, weighted graph, with n = |V| nodes and m = |E| edges. We would like to answer queries of the form "what is the distance between the nodes s and t?".
One way to do this is just run the Dijkstra algorithm. This takes time O ( m + n log n ) , and requires no extra space (besides the graph itself).
In order to answer many queries more efficiently, we can spend some time in pre-processing the graph and creating an auxiliary data structure.
A simple data structure that achieves this goal is a matrix which specifies, for each pair of nodes, the distance between them. This structure allows us to answer queries in constant time O ( 1 ) , but requires O ( n 2 ) extra space. It can be initialized in time O ( n 3 ) using an all-pairs shortest paths algorithm, such as the Floyd–Warshall algorithm.
A DO lies between these two extremes. It uses less than O ( n 2 ) space in order to answer queries in less than O ( m + n log n ) time. Most DOs have to compromise on accuracy, i.e. they don't return the accurate distance but rather a constant-factor approximation of it.
describe more than 10 different DOs. They then suggest a new DO that, for every k, requires space O ( k n 1 + 1 / k ) , such that any subsequent distance query can be approximately answered in time O ( k ) . The approximate distance returned is of stretch at most 2 k − 1 , that is, the quotient obtained by dividing the estimated distance by the actual distance lies between 1 and 2 k − 1 . The initialization time is O ( k m n 1 / k ) .
Some special cases include:
For k = 1 we get the simple distance matrix.For k = 2 we get a structure using O ( n 1.5 ) space which answers each query in constant time and approximation factor at most 3.For k = ⌊ log n ⌋ , we get a structure using O ( n log n ) space, query time O ( log n ) , and stretch O ( log n ) .Higher values of k do not improve the space or preprocessing time.
The oracle is built of a decreasing collection of k+1 sets of vertices:
A 0 = V For every i = 1 , … , k − 1 : A i contains each element of A i − 1 , independently, with probability n − 1 / k . Note that the expected size of A i is n 1 − i / k . The elements of A i are called i-centers. A k = ∅ For every node v, calculate its distance from each of these sets:
For every i = 0 , … , k − 1 : d ( A i , v ) = min ( d ( w , v ) | w ∈ A i and p i ( v ) = arg min ( d ( w , v ) | w ∈ A i . I.e., p i ( v ) is the i-center nearest to v, and d ( A i , v ) is the distance between them. Note that for a fixed v, this distance is weakly increasing with i. Also note that for every v, d ( A 0 , v ) = 0 a n d p 0 ( v ) = v . d ( A k , v ) = ∞ .For every node v, calculate:
For every i = 0 , … , k − 1 : B i ( v ) = { w ∈ A i ∖ A i + 1 | d ( w , v ) < d ( A i + 1 , v ) } . B i ( v ) contains all vertices in A i which are strictly closer to v than all vertices in A i + 1 . The partial unions of B i s are balls in increasing diameter, that contain vertices with distances up to the first vertex of the next level.For every v, compute its bunch:
B ( v ) = ⋃ i = 0 k − 1 B i ( v ) . It is possible to show that the expected size of B ( v ) is at most k n 1 / k .
For every bunch B ( v ) , construct a hash table that holds, for every w ∈ B ( V ) , the distance d ( w , v ) .
The total size of the data structure is O ( k n + Σ | B ( v ) | ) = O ( k n + n k n 1 / k ) = O ( k n 1 + 1 / k )
Having this structure initialized, the following algorithm finds the distance between two nodes, u and v:
w := u , i := 0 while w ∉ B ( v ) : i := i + 1 ( u , v ) := ( v , u ) (swap the two input nodes; this does not change the distance between them since the graph is undirected). w := p i ( u ) return d ( w , u ) + d ( w , v ) It is possible to show that, in each iteration, the distance d ( w , u ) grows by at most d ( v , u ) . Since A k − 1 ⊆ B ( v ) , there are at most k-1 iterations, so finally d ( w , u ) ≤ ( k − 1 ) d ( v , u ) . Now by the triangle inequality, d ( w , v ) ≤ d ( w , u ) + d ( u , v ) ≤ k d ( v , u ) , so the distance returned is at most ( 2 k − 1 ) d ( u , v ) .
The above result was improved by who suggest a DO of size O ( n 4 / 3 m 1 / 3 ) which returns a factor 2 approximation.
If there is a DO with an approximation factor of at most 2, then it is possible to build a set intersection oracle (SIO) with query time O ( 1 ) and space requirements O ( N + n ) , where n is the number of sets and N the sum of their sizes; see set intersection oracle#Reduction to approximate distance oracle.
It is believed that the SIO problem does not have a non-trivial solution. I.e., it requires Ω ( n 2 ) space to answer queries in time O ( 1 ) , e.g. using an n-by-n table with the intersection between each two sets. If this conjecture is true, this implies that there is no DO with an approximation factor of less than 2 and a constant query time.