Presentation of "Hybrid Page Layout Analysis via Tab-Stop Detection"
Mejora de un problema combinatorio sobre vectores ordenados
1. Mejora de un problema combinatorio sobre
vectores ordenados
Javier de la Rosa, versae@us.es
Universidad de Sevilla
3 de agosto de 2010
Resumen
Dado el vector de vectores ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln )), bus-
camos la manera m´s eficiente en tiempo y espacio de combinar cada
a
uno de los elementos de cada vector con cada uno de los elementos de
los vectores restantes, sin que se repita ninguna combinaci´n y siendo o
importante conservar el orden a fin de obtener la soluci´n k-´sima. o e
Para ello se analiza el conjunto de soluciones modelando el problema
como un ´rbol primero y como un grafo despu´s, obteniendo buenas
a e
cotas de eficiencia. Sin embargo, la soluci´n que se propone, soportada
o
por estructuras de datos auxiliares que tambi´n ser´n descritas, es li-
e a
geramente mejor debido a que consume menos espacio y con un orden
de complejidad en tiempo algo menor, siendo dependiente unicamente ´
del n´mero total de elementos.
u
´
Keywords Optimizaci´n Combinatoria, Grafos, Arboles, Matrices
o
1. Planteamiento.
Como consecuencua de un problema mucho mayor (autocompletado y
combinaci´n de consultas SQL), se presenta la necesidad de, dado un vector
o
de vectores, combinar sus elementos entre s´ de manera muy eficiente, pues
ı
este c´lculo llega a convertirse en cuello de botella. No se trata de obtener
a
una cifra num´rica, para lo que podr´ utilizarse la combinatoria habitual,
e ıa
sino de calcular cada uno de los vectores resultantes.
1
2. 1.1 Modelando el problema como un arbol.
´ 1 PLANTEAMIENTO.
Sea v el vector definido en 1, donde n es el n´mero de vectores de entrada y
u
li el cardinal del vector i.
v = ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln )) (1)
Tenemos que devolver todas las combinaciones ordenadas de cada elemen-
to de cada vector con cada elemento de los vectores restantes, de manera
que nuestra soluci´n venga dada por la expresi´n 2, y el n´mero total de
o o u
soluciones t quede definido por 3.
s1 (a11 , . . . , an1 )
s=.= . .. .
. . .
. . . . (2)
st (a1l1 , . . . , anln )
n
t= (li ) (3)
i=1
Ejemplificando, para el vector de entrada w (4) obtendr´ ıamos el conjunto de
soluciones m (5).
w = ((a1 , a2 ), (b1 , b2 ), (c1 , c2 )) (4)
(a1 , b1 , c1 )
(a1 , b1 , c2 )
(a1 , b2 , c1 )
(a1 , b2 , c2 )
m= (5)
(a2 , b1 , c1 )
(a2 , b1 , c2 )
(a2 , b2 , c1 )
(a2 , b2 , c2 )
Se describen a continuaci´n dos formas de abordar el problema.
o
1.1. Modelando el problema como un ´rbol.
a
Analizando el conjunto de soluciones, puede generarse un arbol a partir
´
de un nodo ra´ que tenga tantas ramas como elementos el primer vector, y
ız
para cada elemento del segundo vector, a˜adir ramas con los elementos del
n
tercero, etc. De manera que recorriendo las hojas del arbol resultante (figura
´
2
3. 1.2 Modelando el problema como un grafo. 1 PLANTEAMIENTO.
1.1) se obtengan en los caminos seguidos desde la ra´ las combinaciones que
ız
conforman la soluci´n.
o
k root RRRR
kkk RRR
kkkkk RRR
RRR
kk kk RRR
kkk
a11 E · · · a1l1
z EE y FFF
zzz EE yyy FF
zz EE yy FF
zz E yy F
an1 ··· anln ··· an1 ··· anln
La unica manera de obtener todas las soluciones usando esta forma de
´
atacar el problema es recorriendo todos los caminos posibles. Usando para
ello un algoritmo simple de b´squeda en profundidad [1] que recorra todos los
u
nodos obtendr´ ıamos un tiempo O(|V | + |E|), con el conocido uso de espacio
de orden O(|V |). Esto que a priori puede parecer una buena aproximaci´n, o
se complica en el momento en que se calculan los valores de |V | y |E|. Para
nuestro caso, en el nivel 1 del ´rbol tenemos l1 nodos; en el 2 habr´ l2 nodos
a ıa
por cada nodo en l1 , esto es, l1 l2 nodos; de esta manera, el n´mero de nodos
u
del nivel i vendr´ definido por 6 y el total queda expresado en 7. Sin necesidad
ıa
de calcular |E| podemos concluir que el orden espacial es demasiado elevado.
n
|V |i =⇒ (li ) (6)
i=1
n j
|V | = ( (li )) (7)
j=1 i=1
1.2. Modelando el problema como un grafo.
Construido el grafo de la figura 1.2 podemos reducir el problema a recorrer
todos sus caminos posibles. Dado que se trata de un grafo dirigido y no
ponderado, pero del que conocemos los nodos de inicio y final, partimos
de cada uno de los elementos de a1 y calculamos los caminos posibles de
longitud n que terminan en alg´n elemento de an . Una simple ponderaci´n
u o
de 1 sobre el conjunto de aristas permite aplicar el algoritmo de Dijsktra [2] l1
veces hasta obtener todos las soluciones, con lo que la complejidad de nuevo
depende del n´mero de v´rtices y aristas. Si bien el primero de estos valores
u e
3
4. ´
2 SOLUCION BASADA EN PATRONES.
se corresponde con lo expresado en 8 (el menor posible), el n´mero de aristas
u
es algo m´s complejo de calcular. Sabemos que s´lo existen aristas entre los
a o
elementos de cada par de vectores ai y ai+1 y que adem´s ´stos forman un
a e
subgrafo bipartido en el que los nodos de ai+1 son sumideros, luego el n´mero
u
de aristas que une cada uno de estos ser´ li li+1 . Si hay n−1 grafos bipartidos,
a
el n´mero total de aristas vendr´ dado por la expresi´n 9.
u a o
HIJK
ONML
a11 O ONML
HIJK
··· ONML
HIJK
a1l1
? ?O O ? o o o ?
? O O o ?
? o o O ?
o ? O
HIJK
ONML ONML
HIJK ONML
HIJK
o
wo O O?
'
an1 ··· anln
n
|V | = (li ) (8)
i=1
n−1
|E| = (li li+1 ) (9)
i=1
De lo que podemos afirmar que se trata de un grafo denso [4] y, por tanto,
susceptible de aplicar la mejora de mont´ ıculos de Fibonacci [3] que nos da
una complejidad en tiempo O(|E|+|V | log |V |). Puede apreciarse la reducci´no
del orden de complejidad, al que en realidad habr´ que a˜adir la creaci´n
ıa n o
de la estructura en grafo necesaria para una correcta estimaci´n del espacio
o
necesario. Sin embargo, estos resultados siguen estando por debajo de la
soluci´n propuesta, por lo que el desarrollo de la obtenci´n de la cota espacial
o o
quedan fuera de este documento.
2. Soluci´n basada en patrones.
o
La soluci´n que proponemos plantea el problema tomando el conjunto de
o
salida como la traspuesta de la matriz S, donde S se define en 10.
a11 . . . an1 a11 . . . a1l1
S = . ... . =⇒ S T = . . . .
. .
. . .. . .
. (10)
a1l1 . . . anln an1 . . . anln
Cada fila de la matriz traspuesta s´lo contiene elementos de un unico vector
o ´
siguiendo el patr´n dado por las expresiones regulares de 11, de forma que ri
o
4
5. 2.1 Conjunto de soluciones. ´
2 SOLUCION BASADA EN PATRONES.
representa el n´mero de veces que se repite cada elemento dentro del grupo
u
y ri indica las veces que el grupo se repite al completo. Al examinar E se
aprecia que la longitud de cada ei es igual al n´mero total de soluciones, por
u
lo que los ´
ındices r y r est´n relacionados con t y li como se expresa en 12.
a
r
e1 (a11 . . . ar11 )r1
1
1l
S T =⇒ E = . = .
. . (11)
. .
rn rn rn
en (an1 . . . anln )
li ri ri = t (12)
Por construcci´n, la defini´n de r es recursiva tal y como se expresa en 13,
o o
pero su formulaci´n nos permite demostrar por inducci´n la validez de las
o o
expresiones 14 y 15 (dadas las ρi como se indican en 16).
1 ⇔i=n
ri = (13)
li−1 ri−1 ⇔i=n
ρi
ri = (14)
li
t
ri = (15)
ρi
n
ρi = (lj ) (16)
j=i
2.1. Conjunto de soluciones.
Una vez hallados los vectores auxiliares r y r , obtener un procedimiento
para generar el conjunto de soluciones de una sola atacada (en una unica ite-
´
raci´n por todos los elementos de v) es relativamente sencillo. Analizando un
o
poco la algoritmia necesaria, en realidad s´lo hay que pre-calcular los valores
o
de n y t y los vectores l y r, ya que en cada iteraci´n los valores de ri se
o
van calculando y eliminando, con el consecuente ahorro que supone no man-
tener otro vector completo en memoria. Finalmente, nuestro procedimiento
quedar´ como se muestra en el algoritmo 1.
ıa
5
6. 2.2 Soluci´n k-´sima.
o e ´
2 SOLUCION BASADA EN PATRONES.
Algorithm 1 Algoritmo para la obtenci´n del conjunto de soluciones
o
Require: v ← ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln ))
Ensure: S ← (s1 , ..., st )
n ← |v|
l ← (|a1 |, . . . , |an |)
t ← n (li )
i=1
r ← {Vector definido en 13}
for i from 1 to n do
f ← {Vector vac´ ıo}
for j from 1 to li do
f ← f ∪ (aij )ri
end for
t
ri ← |f |
k ← |S| + 1
sT ← (f )ri
k
end for
return S T
An´lisis de complejidad. Si obviamos la trasposici´n de la matriz de
a o
resultados S, realmente no necesaria (las soluciones estar´ en las columnas
ıan
en lugar de en las filas), este algoritmo itera por todos los elementos de v,
por lo que su orden de complejidad es el m´ ınimo de los expuestos hasta el
momento tal y como refleja 17.
n
O( li ) (17)
i=1
En cambio, para la estimaci´n es espacio obtenemos 18
o
n n
√
O(nt) = O(n (li )) = O( (li n n)) (18)
i=1 i=1
2.2. Soluci´n k-´sima.
o e
Otra de las ventajas de este planteamiento no contempladas en 1.1 o 1.2,
´
es la obtenci´n de la soluci´n k-´sima, huelga decir que sin calcular previa-
o o e
mente todo el conjunto de soluciones. Observando 11 y aplicando los mismos
conceptos, para un determinado k (equivalente a seleccionar la columna k de
6
7. 2.2 Soluci´n k-´sima.
o e ´
2 SOLUCION BASADA EN PATRONES.
S T , esto es, sT ), existe un vector ι con cardinal n que contiene los ´
k ındices
de cada ai por los cuales se obtienen en orden los elementos implicados en la
k-´sima soluci´n; cada una de las ιi viene expresada en funci´n de k por la
e o o
f´rmula 19.
o
k m´d li ri
o
ιi (k) = (19)
ri
As´ la f´rmula general para la obtenci´n de la k-´sima soluci´n se define en 20
ı, o o e o
y un procedimiento para la obtenci´n del conjunto de soluciones basado en
o
la funci´n ιi (k) se muestra en el algoritmo 2.
o
sk = (a1ι1 (k) , . . . , anιn (k) ) (20)
Algorithm 2 Algoritmo basado en la soluci´n k-´sima o e
Require: v ← ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln ))
Ensure: S ← (s1 , ..., st )
n ← |v|
l ← (|a1 |, . . . , |an |)
t ← n (li )
i=1
r ← {Vector definido en 13}
for k from 1 to t do
for i from 1 to n do
ιi ← k m´d li ri
o
ri
ski ← aiιi
end for
end for
return S
An´lisis de complejidad. No resulta dif´ ver que la cota asint´tica
a ıcil o
superior del algoritmo anterior es, tanto en tiempo como espacio, la expresada
en 21, es decir, peor cota temporal que para el algoritmo 1.
O(nt) (21)
7
8. ´
4 CONCLUSION.
3. Experimentaci´n.
o
Los resultados anteriores son f´cilmente verificables tras la ejecuci´n de
a o
algunos experimentos. De manera no exhaustiva, podemos someter ambos
algoritmos a un conjunto de datos aleatorio que cuente con variedades de v
para determinados valores de n y t. Como muestra el cuadro 3, para valores
peque˜os de n el tiempo necesario para completar el proceso parece fluctuar
n
entre uno y otro, quedando sensiblemente peor puntuado el algoritmo 2. Sin
embargo, a medida que n aumenta y lo hace consecuentemente t, es evidente
que el algoritmo 1 presenta mejores resultados, llegando, para valores de
n 6, a superar a su competidor en m´s del 90 % de las ocasiones, resultado
a
que cuadra perfectamente con el estudio te´rico. No obstante, es evidente que
o
No exp. n Valor medio t ln % m´s r´pido 1
a a % m´s r´pido 2
a a
109 2 46,52 6,78 89,91 % 10,09 %
121 3 275,53 6,59 68,60 % 31,40 %
104 4 1 342,37 6,04 50,96 % 49,04 %
95 5 10 405,91 6,52 56,84 % 43,16 %
113 6 66 496,30 6,45 69,03 % 30,97 %
106 7 485 391,86 6,50 92,45 % 7,55 %
105 8 2 354 423,58 6,38 95,24 % 4,76 %
Cuadro 1: Estad´
ısticas de la experimentaci´n
o
son necesarios m´s experimentos para obtener resultados contundentes, pues
a
en nuestro caso no se han tenido en cuenta vectores de entrada con valores
de ln por encima de 11.
4. Conclusi´n.
o
A lo largo de este documento se han analizado distintas formas de abor-
dar un problema de optimizaci´n combinatoria para, finalmente, proponer
o
una soluci´n satisfactoria a partir de los patrones descritos en la soluci´n.
o o
Adem´s, se ha dado un m´todo general para la obtenci´n de la k-´sima so-
a e o e
luci´n que, si a priori podr´ parecer una mejor aproximaci´n, los c´lculos
o ıa o a
posteriores y la experimentaci´n han demostrado ser peor que el primero de
o
los procedimientos expuestos.
8
9. ´
4 CONCLUSION.
Finalmente, combinando los dos algoritmos, podemos obtener una funci´n o
en el lenguaje de programaci´n Python que sea capaz de, dada una lista de
o
listas en items y un valor opcional en k, devolver una lista de listas con todas
las soluciones o la soluci´n que ocupa el k-´simo lugar si un valor para k es
o e
proporcionado. El resultado se muestra en 4.
def combine ( items , k=None ) :
”””
Create a m a t r i x i n wich each row i s a t u p l e c o n t a i n i n g
one o f s o l u t i o n s or k−esima s o l u t i o n .
”””
length items = len ( items )
l e n g t h s = [ l e n ( i ) for i in i t e m s ]
l e n g t h = r e d u c e (lambda x , y : x ∗ y , l e n g t h s )
r e p e a t s = [ r e d u c e (lambda x , y : x ∗ y , l e n g t h s [ i : ] )
for i in range ( 1 , l e n g t h i t e m s ) ] + [ 1 ]
i f k i s not None :
k = k % length
# Python d i v i s i o n i s i n t e g e r d i v i s i o n by d e f a u l t
indices = [ ( k % ( lengths [ i ] ∗ repeats [ i ] ) ) / repeats [ i ]
for i in range ( l e n g t h i t e m s ) ]
return [ i t e m s [ i ] [ i n d i c e s [ i ] ]
for i in range ( l e n g t h i t e m s ) ]
else :
matrix = [ ]
for i , item in enumerate ( i t e m s ) :
row = [ ]
for s u b s e t in item :
row . extend ( [ s u b s e t ] ∗ r e p e a t s [ i ] )
t i m e s = l e n g t h / l e n ( row )
matrix . append ( row ∗ t i m e s )
# Transpose t h e m a t r i x or r e t u r n columns i n s t e a d rows
return z i p (∗ matrix )
9
10. REFERENCIAS REFERENCIAS
Referencias
[1] Knuth, Donald E. (1997). The Art Of Computer Programming. Vol 1. 3rd
ed., Boston: Addison-Wesley, ISBN 0-201-89683-4, OCLC 155842391
[2] Dijkstra, E. W. (1959). A note on two problems in connexion with graphs.
Numerische Mathematik 1, pp 269-271.
[3] Fredman M. L. Tarjan R. E. (1987). Fibonacci heaps and their uses in
improved network optimization algorithms. Journal of the ACM 34(3), pp
596-615.
[4] Black, P. E. Dictionary of Algorithms and Data Structures, Paul E.
Black (ed.), NIST. http://www.itl.nist.gov/div897/sqg/dads/HTML/
sparsegraph.html Accedido el 1 de agosto de 2010.
10