Complejidad en el tiempo
7.1 Midiendo la complejidad
7.2 La clase P
a.guzman@acm.org
Medir la complejidad en el tiempo
Voy a manejar solo problemas decidibles.
Un problema es decidible. Pero ¿cuánto
tiempo se tarda?
– La medición es relativa a la longitud de su
entrada.
– ¿Cómo se mide?
– Clasificación de los problemas de acuerdo
con su complejidad (su “tardanza”).
– ¿Cómo determinar si un problema decidible
requiere una gran cantidad de tiempo?
Ejemplo. ¿Cuánto tiempo se tarda una
máquina de Turing en decidir A={0k1k | k0}?
Analizo el algoritmo, veo cuántos pasos toma.
Cuento los pasos (bajo nivel) de la máquina
M1 =“ParaDepende de suw,
la entrada entrada. Cuántos 0s tiene,
cuántos 1’s tiene. Si es una gráfica, cuántos
1. Rechaza si hay un 0 a la derecha de un 1.
nodos tiene, cuándos lados, etc.
2. Repite mientras haya ambos 0s y 1s:
• Por simplicidad: que dependa de la
1. Barre la cinta y cruza un 0 y un 1.
longitud de la entrada.
3. Si sobran 0s y ya todos los 1s se cruzaron, ó si
• Analizo
sobran 1s y yaeltodos
peor caso posible.
los 0s
se cruzaron,
rechaza. Si no sobran 0s ni 1s, acepta.”
• Otro análisis: el caso promedio.
También depende del algoritmo. Uno
puede ser más rápido que otro.
Complejidad de M en el tiempo
Sea M una máquina de Turing determinista que se para en
todas sus entradas. El tiempo de procesamiento ó
complejidad en el tiempo de M es la función f : NN,
donde f(n) es el máximo número de pasos que M usa para
cualquier cadena de longitud n.
Si f(n) es el tiempo de procesamiento de M, digo
que
– M corre en tiempo f(n)
– M es una máquina de Turing de tiempo f(n).
Es costumbre usar n para la longitud de la entrada.
O grande y o pequeña
Es difícil contar exactamente los pasos
que una máquina toma.
Los estimo. Uso análisis asintótico. –El
tiempo para cadenas largas.
– Descarto coeficientes (constantes).
– Solo veo el término de mayor orden de n.
Digo
Para cadenas largas, es el término que vaque
a f es
dominar. El que más rápido crecerá. asintóticamente
cuando mucho n3.
Ejemplo: f(n) = 6n3 + 2n2 + 45.
Cinta de entrada
0 0 0 0 0 0 1 1 1 1 1 þ þ
þ þ þ þ þ þ þ þ þ þ þ þ þ
Cinta de trabajo 1
þ Espacio en blanco
A = {0k1k | k0}
El tiempo que toma M3 para decidir A es O(n).
M3 = “Para la entrada w,
1. Barre¿Habrá otro más
la entrada rápido? si hay 0’s
y rechaza
O(n) despuésEs lo de 1’s.que se puede hacer. Es lo óptimo.
mejor
2. Barre la entrada
Porque hasta nelpasos
se necesitan primer 1. Al mismo
simplemente para
O(n) tiempo, copia los ceros a la cinta 2.
leer la entrada.
3. Barre los 1’s en la entrada, hasta el final.
Por ¿Y
cadasi agrego
1 en laotra cinta? tacha un 0 en la
entrada,
O(n) cintaEs2.loSimejor
todosque
losse0s se han
puede tachado pero
hacer.
sobran 1’s, rechaza.
4. Si noPorque
sobranse0’snecesitan n pasos
ni 1’s, acepta. Si simplemente
sobran
O(n) 0’s, rechaza.”
para leer la entrada.
{0k1k | k0}
ALa=complejidad depende del algoritmo.
Hay algoritmos más rápidos que otros
La complejidad paraen el tiempo
decidir deproblema.
el mismo A.
– El tiempo requerido para decidir A.
– El problema
La complejidad no esdel
depende si modelo
se para.deSiempre
máquina.se para.
Se trata de lenguajes decidibles.
De algoritmos decididores.
No es como en teoría de la computabilidad,
– El problema es cuánto
donde todos tiemporazonables
los modelos tarda en pararse.
de
– Para A,computación
tenía M1 con complejidad O(n 2).
son equivalentes –deciden la misma
– Luego,clase
hallo
de M 2 con .complejidad O(n log n).
lenguajes
Según el problema 7.47, con máquina de una cinta
Afortunadamente, los requerimientos
es lo más rápido posible.
– Con no
de tiempo unadifieren
máquinamucho para cintas,
de dos los M3 es O(n).
modelos deterministas principales.
Relaciones de complejidad entre
modelos de máquinas
Sea t(n) una función, donde t(n) n.
Teorema. Toda máquina multi-cinta de
Turing de tiempo t(n) tiene una máquina
de Turing de una cinta de tiempo O(t2(n)).
– En el Cap. 3 convertí una máquina multicinta
en una unicinta equivalente.
Los contenidos de las cintas se guardan
consecutivos en la única cinta.
Las posiciones de las distintas cabezas se marcan
sobre los casilleros apropiados.
Demostración. Sea M una máquina de
Turing de k cintas que corre en tiempo t(n).
– Construiré una máquina S de Turing de una
cinta que corre en O(t2(n)).
– Inicialmente, S pone su cinta en el formato
apropiado para simular a M (ya lo vi en el Cap. 3) y
empieza a simular los pasos de M.
Para simular un paso, S barre su cinta para ver la
posición de las k cabezas.
Y la vuelve a barrer para actualizar sus contenidos y
mover las k cabezas.
Si alguna cinta ya no tiene espacio, S corre una
porción del contenido de su cinta una celda a la
derecha.
– La longitud de la información en la cinta
determina cuánto tiempo se toma S en barrerla.
¿Qué tan larga es la porción activa de la
cinta de S?
Cada porción activa de una de las k cintas
de M es de longitud t(n).
– Porque ese es el número de celdas que se
pueden escribir en tiempo t(n).
Suponiendo que la cabeza siempre se mueve a la
derecha.
Y ocuparía menos celdas si a veces se mueve a la
izquierda.
– Entonces, la longitud de la porción activa de
la cinta de S es k t(n) o sea O(t(n)).
Para simular cada paso de M, S hace dos
barridas.
– Y posiblemente hasta k corrimientos a la
derecha. (cada uno de complejidad O(t(n)).
– CadaHe supuesto
paso de Mque t(n) esa Sn.
le toma
2O(t(n)) +kO(t(n))
Suposición razonable, = O(t(n))
porque en pasos.
menos tiempo
CadaMpaso
¿Cuántos ni pasos
siquiera tendría
le toma
de la máquina tiempo de le
leer susacintas.
a S simular
multicinta M?
toma a la máquina unicinta O(t(n)) pasos.
– Poner su cinta en el formato apropiado le
toma a S O(t(n)).
– Cada paso de M le toma a S O(t(n))
Y son t(n)) los pasos que toma M en decidir.
= TIEMPO(O(1)) TIEMPO(O(n))
...TIEMPO(O(n2)) TIEMPO(O(n3)) …
P = k
TIEMPO(n )
La clase P juega un papel central en la Teoría de la
Complejidad porque
1. P es invariante para todos los modelos de cómputo
que son polinómicamente equivalentes a una
máquina de Turing determinista de una cinta , y
Cualquieraesdeuna clase
ellos robusta.
puede simularNo
al le afectan cambios
en un
otro con solo el modelo de computación
incremento polinomial a usar.
2. Pencorresponde
el tiempo deaproximadamente
ejecución. a la
clase de problemas que son realistamente
resolubles en una computadora.
Es una clase de utilidad práctica.
Cómo proceder para resolver
un problema
Primero veo si el problema es decidible o indecidible.
2 4
6
3 Propagando la tinta
PATH P
Encuentro un lado (a b) Regreso a los nodos. Veo si a está marcado
Demostración. Este algoritmo:
Voy al lado (a b) a ver cómo se
Q = “Para la entrada <G,s,t>
llama el otrodonde
nodo. SeG esb
llama
una gráfica dirigida, y s y t sonRegreso
nodos a losdenodos
G, Número de nodos de G
i
No se usan
w La celda (2 5) contiene B si B genera c c a b
bccabb La celda (3 5) contiene A C D si A genera
1 2 3 4 5 6 c a b y C genera c a b y D genera c a b
1 2 3 4 5 6 j
1 A EB
2 B
3 ACD
4
5 C
6
i
La celda (5 6) contiene C si C genera b b
No se usan
w Las celdas de longitud 1 corresponden a
reglas de forma A a en la gramática.
bccabb
Porque estándirectamente
Se llenan en forma normal
de de
la Chomsky.
gramática.
1 2 3 4 5 6
1 2 3 4 5 6 j
Son las únicas reglas que 1
pueden generar una terminal.
2
3
4
5
6
i
Nótese que si una de estas celdas está vacía [digamos, la
(4,4)], entonces la gramática no genera w, porque nadie
genera la terminal a que está contenida en la cadena.
w Luego, con la información de las celdas
bccabb de long. 1, lleno las celdas que
1 2 3 4 5 6
corresponden a cadenas de longitud 2.
1 2 3 4 5 6 j
1
2
Primero lleno las celdas3que
4
generan cadenas de longitud 1.
5
6
i
Al terminar de llenar, si la celda (1,n) contiene el símbolo
inicial S, entonces G genera w. Si no, no la genera.
¿Cómo saber cuáles variables generan
qué cadenas?
– Para generar cadenas de longitud 0 y de
longitud 1, miro directamente la gramática.
– Estará quizá la regla S
Entonces sé que S genera .
– O la regla A a. Es la única regla que puede generar .
– Entonces sé que A genera a.
Para saber qué variables generan una
cadena de longitud mayor que 1, parto la
cadena en 2 y veo (en la tabla) qué variable
I genera su mitad izquierda, y cuál otra
variable D su mitad derecha.
Y busco las variables V que digan V I D.
w ¿Por qué en dos? Porque en la forma
bccabb normal de Chomsky (la que uso) las
1 2 3 4 5 6 reglas son de la forma C A B.
Ejemplo. Ya calculé todas las celdas de
longitud 4 y menor.
– Ahora debo llenar las celdas que corresponden
a cadenas de longitud 5.
– En w hay dos cadenas de longitud 5: b c c a b
y c c a b b.
– Tomo una: b c c a b.
– Parto esa cadena en dos, en todas las formas
posibles: b | c c a b — b c | c a b — b c c | a b
bcca|b
w
bccabb
1 2 3 4 5 6
b|ccab—bc|cab—bcc|ab
bcca|b
Repito
Para cada una depara las otras
ellas, veo sicadenas de longitud
hay una
5. En
regla en G de la este
formacasoC hay
otra:
A Bc c a b b.
– Tal que A genere b y B genere c c a b.
– O que A genere b c y B genere c a b.
– O que A genere b c c y B genere a b.
A la celda (1,5), porque
– O que A genere b c c a y b Bc c genere b. (1,5).
a b = subcadena
– Si hay, agrego su lado izq. C a la celda de
longitud 5 que estoy llenando.
Ejemplo. Sea la gramática
S SAB A AA BBC
Aa Bb Cc 1 2 3 4 5
¿Genera S la cadena a a b c c?
(1,1)=a la genera A. 1 2 3 4 5 j
(2,2)=a la genera A. 1 A
(3,3)=b la genera B. 2 A
(4,4)=c la genera C. 3 B
(5,5)=c la genera C. 4 C
5 C
i
Ejemplo. Sea la gramática S e
SAB A AA BBC
Aa Bb Cc 1 2 3 4 5
¿Genera S la cadena a a b c c?
(1,2)=aa la genera AAA 1 2 3 4 5 j
(2,3)=ab la genera SAB 1 A A
(3,4)=bc la genera BBC 2 A S
(4,5)=cc la genera nadie 3 B B
4 C X
5 C
i
Ejemplo. Sea la gramática S e
SAB A AA BBC
Aa Bb Cc 1 2 3 4 5
¿Genera S la cadena a a b c c?
(1,3)=aab: a | ab es AS 1 2 3 4 5 j
es nadie. aa|b es AB es 1 A A S
SAB
2 A S S
(2,4)=abc: a|bc es AB es
3 B B B
S. ab|c es SC es nadie
(3,5)=bcc: b|cc es BB es 4 C
nadie. bc|c es BC es B 5 C
i
Ejemplo. Sea la gramática S e
SAB A AA BBC
Aa Bb Cc 1 2 3 4 5
¿Genera S la cadena a a b c c?
(1,4)=aabc: a | abc es AS 1 2 3 4 5 j
es nadie. aa|bc es AB es 1 A A S S
S. aab|c es SC es nadie.
2 A S S S
(2,5)=abcc: a|bcc es AB
3 B B B
es S. ab|cc es Snadie.
abc|c es SC es nadie. 4 C
5 C
i
Ejemplo. Sea la gramática S e
SAB A AA BBC
Aa Bb Cc 1 2 3 4 5
¿Genera S la cadena a a b c c?
(1,5)=aabcc: a | abcc es 1 2 3 4 5 j
AS es nadie. aa|bcc es AB 1 A A S S S
es S. aab|cc es Snadie.
2 A S S S
aabc|c es SC es nadie.
3 B B B
Como en la casilla (1,5)
aparece S, entonces la 4 C
gramática sí genera aabcc. 5 C
i AABCC aABCC
S AB AAB AABC
aaBCC aabCC aabcC aabcc
Todo lenguaje libre de contexto P
Demostración. Este es el algoritmo decididor:
D= “Para la entrada w, donde w=w1w2…wn
es una cadena, Caso w=.
1. Si w= y S es una regla de G, acepta.
2. Para i=1 a n: Caso
1. Para cada variable A: cadenas de
1. Fíjate si A b es una regla, donde b=wi. longitud 1
2. De ser así, coloca la variable A en tabla(i, i).
H
TRIÁNGULO = {<G>|G es una gráfica
no dirigida y G tiene un triángulo}
Teorema. TRIÁNGULO P.
Demostración.
G = {{A B C D…}{(A B) (A C) (E F) (C D)..}}
El algoritmo que decide TRIÁNGULO es
D = “Para la entrada <G>, donde G es una
gráfica no dirigida,
1. Para cada lado (M N) de G
1. Para cada nodo P al cual M esté conectado,
1. Fíjate si N también está conectado
2. Si existe esa N, acepta. (El clique es M N P)
G = {{A B C D…}{(A B) (A C) (E F) (C D)..}}
El algoritmo que decide TRIÁNGULO es P
D = “Para la entrada <G>, donde G es una P
gráfica no dirigida, P M
O(n)1. Para cada lado (M N) de G
N
O(n)1. Para cada nodo P al cual M esté conectado,
O(n) 1. Fíjate si N también está conectado a ese nodo P
O(1) 2. Si existe esa N, acepta. (El clique es M N P)
3. Si no, toma otro nodo P al cual M esté conectado
y ve a 1.1.1
4. Si ya no hay más nodos P, ve a 1.2
G es de
2. Toma el siguiente lado de G. complejidad
3. Si ya no hay más lados, rechaza.” O(n3)
ALLDFA ={<A>|A es un DFA y
L(A)=*}
Teorema. ALLDFA P.
Demostración. Veo el decididor de ALLDFA.
T= “Para la entrada <A>, donde A es un
DFA,
– Marca el estado inicial de A. Si no es aceptor,
rechaza.
– Repite hasta que ya no haya nuevos estados
marcados.
Marca un estado si es aceptor y tiene una transición
que le llega de un estado marcado.
– Si todos los estados marcados son
aceptores, acepta. Si algún estado marcado
no es aceptor, rechaza.”
F b
b
a b E
A a
a
b a D
a b
a, b B
C
T= “Para la entrada <A>, donde A es un
DFA,
O(1) – Marca el estado inicial de A. Si no es aceptor,
rechaza.
– Repite hasta que ya no haya nuevos estados
n veces
marcados.
O(n2) Marca un estado si es aceptor y tiene una transición
que le llega de un estado marcado.
– Si todos los estados marcados son
O(n) aceptores, acepta. Si algún estado marcado
no es aceptor, rechaza.”