Saltar al contenido principal

Unir dos listas ordenadas

¿Cuántas comparaciones se necesitan para unir dos listas ordenadas, de largo nn y mm, con m<nm<n? Una cota inferior está dada por el número de formas en que los elementos de una lista se pueden insertar en la otra, log2(m+nm)\log_2 { m+n \choose m}. Esto ocurre porque todo algoritmo que haga la unión debe realizar acciones distintas para cada una de las (m+nm){ m+n \choose m} formas en que puede presentarse el input, y por lo tanto las respuestas a sus comparaciones pueden usarse para codificar ese aspecto del input.

Note que, si pqp \ge q,

(pq)  =  i=0q1piqi    i=0q1pq  =  (pq)q{p \choose q} ~~=~~ \prod_{i=0}^{q-1} \frac{p-i}{q-i} ~~\ge~~ \prod_{i=0}^{q-1} \frac{p}{q} ~~=~~ \left( \frac{p}{q} \right)^q

debido a que piqipq\frac{p-i}{q-i} \ge \frac{p}{q} pues (pi)q=pqiqpqip=p(qi)(p-i)q = pq - iq \ge pq - ip = p(q-i). De esto obtenemos la cota inferior log2(m+nm)log2((m+nm)m)=mlog2(1+nm)\log_2 { m+n \choose m} \ge \log_2 ((\frac{m+n}{m})^m) = m\log_2(1+\frac{n}{m}).

Asintóticamente, esta cota inferior es Ω(mlognm)\Omega(m\log\frac{n}{m}) si m=o(n)m = o(n) y Ω(m)\Omega(m) si no. Un algoritmo que alcanza esta cota inferior asintótica es el que toma la lista más corta y avanza en la más larga buscándolo mediante búsqueda exponencial (es decir, comparando el elemento en las posiciones 1, 2, 4, \ldots hacia adelante hasta pasarse y luego completando con búsqueda binaria). Para cada elemento xix_i de la lista más corta, sea yiy_i el primer elemento xi\ge x_i de la lista más larga. Si la distancia entre yiy_i e yi1y_{i-1} es de did_i posiciones (en la lista más larga), entonces el costo total será O(ilogdi)O(\sum_i \log d_i).

Unir listas óptimo

Como idin\sum_i d_i \le n, el peor caso se da cuando son todos di=nmd_i = \frac{n}{m} (por la desigualdad de Jensen), en cuyo caso el algoritmo toma tiempo O(m(1+lognm))O(m(1+\log\frac{n}{m})).

Cuando m=nm=n, la cota inferior es log2(2nn)2nO(logn)\log_2 { 2n \choose n} \ge 2n - O(\log n) (por la aproximación de Stirling), cuyo término principal exacto se alcanza con el método típico de recorrer ambas listas secuencialmente e ir tomando el menor (2n12n-1 comparaciones).