You are on page 1of 24

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO - CEUNES

ALGORITMOS E FUNDAMENTOS DA TEORIA DE


COMPUTAÇÃO

LISTAS DE EXERCÍCIOS

Professor: Luís Otávio Rigo


Alunos: André de Mattos Ferraz
Eliezer de Souza da Silva
Lucas Dias Serqueira
Mateus Vieira Costa
Algoritmos e Fundamentos da Teoria de Computação
Lista 01

1) Suponha que R = {(a; c), (c; e), (e; e), (e; b), (d; b), (d; d)}. Desenhe grafos orientados
representando cada uma das seguintes relações:

a) R

b) R-1

c) R  R-1
d) R  R-1

2) Sejam R e S relações binárias sobre A = {1, ... ,7} com as representações gráficas mostradas a
seguir.

a) Indique se R e S são (i) simétricas, (ii) reflexivas e (iii) transitivas;


b) b) Repita (a) para a relação R união S.

R S RS
Simétrico Não Sim Não
Reflexivo Não Não Sim
Transitivo Não Não Não
3) Desenhe gráficos orientados representando relações dos seguintes tipos:
a) Reflexiva, transitiva e anti-simétrica.

b) Reflexiva, transitiva e nem simétrica nem anti-simétrica.

4) Seja A um conjunto não-vazio, e que      seja o conjunto vazio. Quais são as


propriedades de R?

Por definição (

    

Reflexividade: R não é reflexiva.

1)

,
 , por hipótese de R ser reflexiva
Prova (por contradição):

2)

,
, def de .
3)
,
 , Particularização Universal (PU) de 1
4)
,
, PU de 2
5)
,
 
,
 , conjunção 3 e 4
6) contradição
Simetria: R é simétrica.

1)
, 
,    
,
  , hipótese de contradição, R não é simétrica
Prova (por contradição):

2) 
,  
,    ,
 , neg 1
3) ,
, def de .
4)
,    ,
 , Particularização Existencial (PE) de 2
5)
,    ,
   ,
, conjunção 3 e 4
6) contradição
Transitividade: R é transitiva.

1)
, , 
   
 , hipótese de contradição, R não é transitiva
Prova (por contradição):

2) 
, ,  
   
 , Eq da implicação 1
3) 
, ,   
   

4)  
   
 , PE 3
5)
    
, DeMorgan 4
6)
, Simplificação 5
7) 
, def de .
8)
  
, conj 6, 7
9) contradição
Anti-Simetria: R é anti-simétrica.

1)
, 
  

  , hipótese de contradição, R não é anti-simétrica
Prova (por contradição):

2) 
, ,  
  

  , Eq da implicação 1
3) 
, ,   
  

  , neg 2
4)  
  

  , PE 3
5)
   
 , DeMorgan 4
6)
, Simplificação 5
7) 
, def de .
8)
  
, conj 6, 7
9) contradição

5) Seja f: A -> B. Demonstre que a seguinte relação R é de equivalência em A : (a; b)  R, se, e


somente se f(a) = f(b).

Reflexiva: f(a) = f(a);


Simétrica: f(a) = f(b)f(b) = f(a)

 f(a) = f(c)
Transitiva: f(a) = f(b) e f(b) = f(c)

 aRb e bRc
 aRc

6) Seja R  A x A uma relação binária, conforme definida abaixo. Em que casos R é uma relação de

a) A = os inteiros positivos; (a, b)  R se, e somente se, b é divisível por a. Não é ordem total por
ordem parcial? Em que casos R _e uma relação de ordem total?

não apresentar a relação de totalidade sobre os inteiros: nem (2,3), nem (3,2) pertencem a R.
(a,a) pertence a R, portanto é reflexiva. Se a é divisível por b, então a>b ou a=b, se temos aRb e
bRa, significa que (a>b ou a=b) e (b>a ou b=a), ou seja a=b, portanto R é anti-simétrico. A transitividade
neste caso é trivial. Portanto R é uma ordem parcial.

que R1  R2 é uma relação de ordem parcial.


7) Sejam R1 e R2 duas relações de ordem parcial quaisquer sobre o mesmo conjunto A. Demonstre

Suponhamos  e  ordens parciais.


    !
,  |
,    #
,    $


,
  e
,
  portanto
,
   
- Reflexividade:

Seja dois pares (x,y) e (y,x) pertencentes a    . Comos eles pertencem a intersecção de dois
- Anti-Simetria

conjuntos eles pertencem aos conjuntos individualmente, ou seja,


,    ,
,    ,
,
  , ,
  . Como tanto  quanto  são antissimétricos, concluimos que x=y, o
que prova que    é antissimétrico.

1.
,      , hipotese
- Transitividade:

2. ,      , hipotese
3.
,    , simp 1
4.
,    , simp 1
5. ,    , simp 2
6. ,    , simp 2
7.
,    , transitividade de R1, 3, 5
8.
,    , transitividade de R2, 4, 6
9.
,      , conj, 7,8 (c.q.d.)

a) Prove que, se S for uma coleção qualquer de conjuntos, então RS = {(A;B) : A;B  S, e A  B} é
8)

uma relação de ordem parcial.

i) Reflexividade
A Rs A porque A%A

A % B e B % A (A,B  S)
ii) Anti-Simétrica

x  A  x  B ou x  B  x  A
A = B Rs é anti-simétrica

A%BeB%C
iii) Transitividade

xAxB
xBxC
xAxC
A%C
Rs é transtiva

Rs é uma relação de ordem parcial.

b) Seja S = &!',&,($ . Desenhe um grafo orientado que represente a relação de ordem


parcial RS definida em (a). Quais são os elementos mínimos de RS?
9) Em que circunstâncias um grafo orientado representa uma função?


, , 
 )*
 
 
Uma função pode ser definida como uma relação R com a seguinte propriedade.

Ou seja, x só pode se relacionar (ou ser mapeado) a um e somente um elemento.


Em termos do dígrafo que representa esta relação quer dizer que o grau de saída de todos os nós
do dígrafo é no máximo um.

10) Demonstre que qualquer função de um conjunto finito para ele próprio contém um ciclo.

Prova por indução no tamanho do conjunto. Seja A o conjunto e B = {f | f: A  A} o conjunto das

i) A = {a}, card(A) = 1  Tem ciclo


funções de A em A.

B={ {(a,a)} }

ii) A = {a,b}, card(A) = 2  Tem ciclo


B={ {(a,a),(b,b)}, {(b,a),(a,b)} }

+  !, , , , … , ,. $
iii) Suponha que card(A) = n e que B tenha n! funções de A em A, todas contendo ciclos.

/  !0 , 0 , … , 0.! $

Seja +2  +  !,.3 $, 4,56 +2  7 8 1

do domínio A para +  !,.3 $.


E as funções de A’ em A’, pertencentes ao conjunto B’, são feitas estendendo as funções

Seja f  B, temos n+1 maneiras de estender f: A A essa função para :: +  !,.3 $ <
+  !,.3 $.
1- Podemos fazer g: A’  A’
2- Ou podemos trocar um elemento de f: tome ak  A com f(ak) = aj, faremos a seguinte

g: A’  A’
extensão.

g(a) = f(a), se a  A e a  ak

g(a) = a , se a  A e a  ak
.3

g(a) = aj , se a A e a  a ,
.3

! a $, caso contrário teríamos elementos de A’ que não seriam cobertos por estas
Repare que só tenho estas duas opções para gerar as funções de A’ = A U
.3
funções.

g( a ) = a .
Afirmação1: Na construção (i) temos ciclos
.3 .3
Prova: f: A -> A tem ciclos, e a construção (i) não alterou f, só adicionou

Afirmação2: Na construção (ii) temos ciclos. Neste caso há dois casos a considerar.
a) Ak não pertence a um ciclo: o mesmo caso da afirmação 1.
b) Ak pertence a um ciclo: neste caso aparentemente quebramos o ciclo, mas a
transformação que fizemos mantém o ciclo adicionando um caminho indireto entra ak
e aj.

Isto completa a prova por indução.


Algoritmos e Fundamentos da Teoria de Computação
Lista 02
1) Demonstre que os seguintes conjuntos são contáveis:
a) União de três conjuntos contáveis quaisquer, não necessariamente finitos ou disjuntos.
Prova:

+  /  >  +  /  >  +  /  >


A união de conjuntos é associativa.

Um conjunto A é contável se ele é finito (i.e 0 0: !1,2, … , 7$  + # 0 é ABCDE)5, ), ou existe


Ou seja, só preciso mostrar que a união de dois conjuntos contáveis quaisquer é contável.

uma bijeção entre o conjunto A e F.

Fato: Se A e B são contáveis +  / também é.


Devemos dividir esta demonstração em três partes.

Card(A)=n e card(B)=m, card(+  /) =n’


i) A e B são finitos.

Seja G.  !1,2, … , 7$, 0: G.  + e :: GH  /, funções bijetivas respectivamente a A e B. Sem


perda de generalidade supomos m>n e m-n´>0.

:2 : GHI.J  / K +  /
Vamos criar a função g’ definida da seguinte forma

g’, é uma bijeção que mapeia os elementos da parte de B que não tem elementos em comum

prova que / K +  / também é finito).


com A. É construida como uma restrição da função g, ou seja, continua sendo uma bijeção (o que

Iremos construir uma função que mapeia todos os elementos de +  /, esta função mapeia
inicialmente todos elementos de A, e depois inclui os elementos de B que não pertencem a A,
usando a função g’.

L: G.3HI.J  +  /
Seja

0
, ND
O 7 R
L
 M
:P
K 7 , ND
Q 7
h é uma bijeção, pela própria construção, pois ela mapeia conjuntos disjuntos (A , B menos os
elementos de A) usando funções bijeções. O fato de h ser uma bijeção completa a prova de A
união B ser finito e portanto contável para o caso que consideramos.

- para A(bijeção): 0: G.  +
Ii) A finitos e B infinitamente contável.

- para B(bijeção): :: F  /
Seja :2 : F  / K +  / , g’ construido da mesma forma que no caso anterior, como uma
restrição ao domínio de g, mas lembrando que este dominio é infinito, então uma restrição de um
número finito (os elementos de A) não altera o domínio (ele continua sendo infinito) e a função g’

Iremos construir a função h como um mapeamente entre os naturais e +  /.


continua sendo uma bijeção, pois não acrescentou novos elementos, só retirou alguns.

L: F  +  /
0
, ND
O 7 R
L
 M
:P
K 7 , ND
Q 7
h é uma bijeção, pela própria construção, como no item i). O fato de h ser uma bijeção completa a
prova de A união B ser infinitamente contável.
Sejam as bijeções 0: F  + e :: F  /
iii) A e B infinitamente contáveis.

Vamos construir mais uma vez g’ como uma restrição na imagem de g, tal que ela não contenha
nenhum elemento que pertença a B e a A simultaneamente, função esta que é bijetora pelas
mesmas razões dos itens anteriores.

L: F  +  /
Prossigamos para a construção de h. Seja:

L 27  0 7
L 27 K 1  :P 7
Ou seja, dividimos o dominio de F em números pares e ímpares, e fizemos cada um destes
subconjuntos serem mapeados para A ou B\A.

pertence a A. Ou seja, com h F cobre todo o conjunto +  /. Portanto +  / é infinitamente


h é bijetora, pois cada par é mapeado em um de A, e cada ímpar em um elemento de B que não

contável.
Assim provamos que para três conjuntos contáveis quaisquer, a união dos três é contável, porque
a união de dois deles é contável e o resultado deste união com o terceiro conjunto é contável
também, ou seja, pela propriedade associativa a união dos três é contável sse a união de dois
deles é.

b) União de todos os conjuntos finitos de F.


Seja X o conjunto de todos os subconjuntos finitos de F.
S  !+|0: G.  + e A V F$
Podemos visualizar X na seguinte tabela


n Xn

!!1$, !2$, … , !7$, … $


0

!!1,2$, !1,3$, … , !1, 7$, … , !2,3$, … , !7, X$, … $


1
2

S  Y SZ
Podemos facilmente verificar o seguinte fato: se
 SZ então
 !7$  SZ3 , para um n qualquer

Fato 1: S. é contável (para cada n pertencente aos naturais)


que não pertença a x.

- S[ é contável: trivial.
Prova: por indução

- Suponha S. contável e seja 0: F  S.


Vamos construir uma função 0P: S.3  F  F usando a função f.
Seja \  0 I
] , ou seja k é a ordem de um dado elemento (o k-ésimo) de S. .
se
 SZ então
 !7$  SZ3
Podemos gerar os elementos de S.3 usando os elementos de S. .
0 2
]  !7$  0 I
] , 7
Reparem que f’ gera uma tabela F  F, onde nenhum dos elementos são iguais (sem a diagonal
principal), e portanto é bijetora, por existe uma bijeção entre F e F  F. O prova que S.3

Como S   SZ e como acabamos de mostrar que para cada i, SZ é contável, então união de
também é contável, terminando assim a prova por indução.

vários conjuntos contável também é contável, ainda mais que estes são disjuntos.
2) Utilizando fórmulas que envolvam somente operações elementares apresente bijeções

a. F e os números naturais ímpares.


explícitas para os seguintes pares de conjuntos:

0: F  GX^,5DN
0 7  27 K 1
b. F e conjunto de todos inteiros.
0: F  _
7
K , ND 7 é ^,5 )* D5)
2 R
0 7  ` 7 K 1
, ND 7 é íX^,5
2
c. F e F  F  F.
Vamos construir uma função L: F  F  F bijetora.
0, ND 7  \  1
L 7, \  b L 7 K 1, \ 8 7, ND \  1 D 7 Q 1 R
L 7, \ K 1 8 \ K 1, 4,N) 4)7E5á5B)
Vamos usar a função anterior para gerar a bijeção de F e F  F  F.
L2 7, \, e  L 7, L \, e

n\k 1 2 3 4 5
1 0 1 3 6 10
2 2 4 7 11 16
3 5 8 12 17
4 10 13 18
5 14 19
Algoritmos e Fundamentos da Teoria de Computação
Lista 03

1) Desenhe um fluxograma que corresponde a cada um dos seguintes programas:


c) P2 = ({r1 : faça ; vá_para r2}; r1).

d) Composições enquanto e até, em um mesmo programa.

e) Programa sem instrução alguma.

Não existe tal programa.

f) Programa sem instrução de parada.

2) Caracterize e diferencie computação e função computada.

Uma computação é um histórico do funcionamento de uma máquina específica para um


determinado programa, de acordo com um valor inicial. Já uma função computada, é o resultado
que foi obtido no final de uma computação sendo esta computação finita.

3) Defina computação de programas iterativos em uma máquina.


Seja M uma máquina e P um programa iterativo para a máquina M.
Uma computação para o programa P em M é uma cadeia de pares do tipo:
(I0,V0)(I1,V1)(I2,V2) ...
Sendo uma cadeia finita ou infinita, onde I0 é o programa iterativo inicial e V0 é o valor inicial da
memória. Para cada (Ik,Vk), onde k={0,1,2,...}, F sendo uma operação, T sendo um teste e V, V1, V2
programas iterativos, temos:
Caso: Ik = F;V
Então: (Ik+1,Vk+1) = (V,πf(vk))

Caso: Ik = V;V1 (Seqüencial)


Então (Ik+1,Vk+1) = (V;V1,Vk)

Caso: Ik = (se T então V senão V1);V2 (Condicional)


Então: (Ik+1,Vk+1) = (V;V2,vk) se πt(vk) = verdadeiro
= (V1;V2,vk) se πt(vk) = falso

Caso Ik = (enquanto T faça V);V1


Então (Ik+1,Vk+1) = (V;(enquanto T faça V);V1,vk) se πt(vk) = verdadeiro
= (V1;até T faça V;V1,vk) se πt(vk) = falso

4) Defina computação finita para programas iterativos.

Mesma definição do exercício anterior, porém considerando que a cadeia de pares é finita.
(I0,V0)(I1,V1)(I2,V2) ... (In,Vn) Sendo n o tamanho da cadeia.

5) Escreva um programa iterativo onde a computação seja infinita.

enquanto( x = x ) faça V

6) Por que é possível afirmar que a computação de um programa monolítico em uma máquina,
para um dado valor inicial da memória, é determinística?

Dado um valor inicial, para uma mesma máquina, a computação não muda, ou seja, a seqüência
de instruções executadas e os valores intermediários de memória em várias execuções do
programa não muda.

7) Traduza o programa recursivo definido abaixo em um programa iterativo.


P é R1 onde
R1 def (se T então F; R2 senão R1),
R2 def G;(se T então F;R1 senão ∅;)

até T faça V
enquanto T faça (F;G(se T então (F;até T faça ∅) senão faça ∅))
8) Suponha que na definição de uma máquina, seja admitido funções parciais na especificação dos
identificadores de operações e testes. Dê a definição apropriada da função computada por um
programa em uma máquina em tal caso.

Como as operações e testes são funções parciais, estes não são definidos para alguns valores,
fazendo-se necessário mapear estas funções em algum símbolo (Exemplo |).
Caso a computação termine e as operações e testes estão definidos para todos os valores de
memória, então: <P,M>(X) = πy(vn).
Caso a computação entre em loop, a função computada deve ser mapeada em um símbolo
(Exemplo *).

9) Verifique se W1 e W2 definidos a seguir, são equivalentes fortemente.


Programa Iterativo W1:
enquanto T faça (F;(se T então faça ∅; senão faça G))
Programa Iterativo W2:
enquanto T faça (F; enquanto T faça (F); G)

10) Qual a importância da relação de equivalência forte de programas?

A importância se dá pelo fato de podermos classificar programas diferentes em um mesmo


conjunto de acordo com as funcionalidades. Além disso, abstraindo o significado de cada função
ou teste, a mesma ordem de execução será observada.
Algoritmos e Fundamentos da Teoria de Computação
Lista 04

1) Qual a importância do estudo da Máquina de Turing na Ciência da Computação?

Segundo a tese de Alonzo Church, percebemos que a Máquina de Turing é o dispositivo


computacional mais genérico possível, capaz de processar qualquer função. Como a Ciência da
Computação visa o estudo das funções computáveis, é imprescindível estudar a Máquina de
Turing.

2) Sobre a Hipótese de Church:


a) Qual seu signicado, implicações e importância na Teoria de Computação?

A hipótese permitiu fazer uma equivalência formal ao conceito informal de computação, ou seja,
o conceito informal de computação pode ser formalizado utilizando a Máquina de Turing. Depois
dessa formalização foi possível o desenvolvimento da Teoria de Computação.

b) Por que ela é chamada de Hipótese ao invés de Teorema de Church?

Pelo fato de não ser possível descrever matematicamente o conceito de computação, logo, não se
pode ter uma prova formal.

3) Sobre não-determinismo:
a) O que é e quais suas principais características?

Não-determinismo é a possibilidade de tomar alternativas diferentes para uma mesma entrada.


No caso da Máquina de Turing, após a leitura de um símbolo, é permitido mais de um estado
possível. O resultado obtido pela máquina é um conjunto de estados alternativos.

b) Qual o seu efeito, em termos de poder computacional, nas máquinas apresentadas?

O não-determinismo não acrescenta poder computacional, uma vez que uma Maquina de Turing
não-determinística pode ser simulada como uma Máquina de Turing determinística.

4) Qual a diferença fundamental entre a Classe das Linguagens Recursivas e a das Linguagens
Enumeráveis Recursivamente? Qual a importância de se distinguir essas duas classes?

As linguagens recursivas são aquelas onde existe uma Máquina de Turing que reconhece a
linguagem e sempre para (aceitando ou rejeitando todas as entradas). Já uma linguagem
enumerável recursivamente não necessita que a Máquina de Turing pare para todas as entradas,
podendo entrar em loop para algumas.

5) Demonstre que a Classe de Linguagens Recursivas é fechada para as operações de união,


intersecção e diferença. Demonstre inicialmente para a operação sobre duas linguagens
recursivas. Após, amplie a demonstração para n linguagens recursivas (demonstre por indução
em n).
Considerando as linguagens L1 e L2 que pertençam à Classe das Linguagens Recursivas e uma
Máquina de Turing M definida como:
aceita(L) = L
rejeita(L) = Σ* - L
loop(L) = ∅ (vazio)

União:
aceita(L1) ∪ aceita(L2) = L1 ∪ L2 = aceita(L1 ∪ L2)
rejeita(L1) ∪ rejeita(L2) = (Σ* - L1) ∪ (Σ* - L2) = Σ* - (L1 ∪ L2) = rejeita (L1 ∪ L2)
loop(L1) ∪ loop(L2) = ∅ ∪ ∅ = ∅

Intersecção:
aceita(L1) ∩ aceita(L2) = L1 ∩ L2 = aceita(L1 ∩ L2)
rejeita(L1) ∩ rejeita(L2) = (Σ* - L1) ∩ (Σ* - L2) = rejeita (L1 ∩ L2)
loop(L1) ∩ loop(L2) = ∅ ∩ ∅ = ∅

Diferença:
aceita(L1) – aceita(L2) = L1 – L2 = aceita(L1 – L2)
rejeita(L1) – rejeita(L2) = (Σ* - L1) – (Σ* - L2) = Σ* - (L1 – L2) = rejeita (L1 – L2)
loop(L1) - loop(L2) = ∅ - ∅ = ∅

Para a demonstração para n linguagens, podemos usar o método da indução matemática onde a
base para a indução é a própria demonstração para duas linguagens.
A hipótese de indução é como se segue a seguir: (k = numero de linguagens)
aceita(L1) ∪ ... ∪ aceita(Lk) = aceita(L1 ∪ ... ∪ Lk)
rejeita(L1) ∪ ... ∪ rejeita(Lk) = rejeita (L1 ∪ ... ∪ Lk)
loop(L1) ∪ ... ∪ loop(Lk) = ∅

Considerando o elemento k+1:


(aceita(L1) ∪ ... ∪ aceita(Lk)) ∪ aceita(Lk+1) = aceita (L1 ∪ ... ∪ Lk ∪ Lk+1)
(rejeita(L1) ∪ ... ∪ rejeita(Lk)) ∪ rejeita(Lk+1) = rejeita (L1 ∪ ... ∪ Lk ∪ Lk+1)
(loop(L1) ∪ ... ∪ loop(Lk)) ∪ Lk+1 = ∅

Analogamente podemos demonstrar, por meio da indução matemática, a validade para a


intersecção e a diferença.
6) Desenvolva Máquinas de Turing que aceitem as seguintes linguagens:
a) L1 = {w | w tem o mesmo número de símbolos a e b}
b) L2 = {w | w o décimo símbolo da direita para a esquerda é a}

c) L4 = {w | w = anbn ou w = bnan}

d) L5 = {w | w = aibjck, onde ou i = j ou j = k}
7) Desenvolva Maquinas de Turing que processem as funções:

a) Subtração, definida por:


m – n, se m > n;
0, caso contráro.
b) Fatorial de n, para n Є N

8) Elabore uma Máquina de Turing M sobre o alfabeto {a; b} tal que:

ACEITA(M) = {w | w inicia com a e, após cada a, existe pelo menos um b}


LOOP(M) = {w | w !Є ACEITA(M) e existe pelo menos um b entre dois a}
REJEITA(M) = {a; b}* - (ACEITA(M) U LOOP(M))

9) Desenvolva os programas, em Norma, que realizam as operações abaixo nos inteiros:

a) A <- B + C
b) A <- B x C
c) A <- B – C
d) A <- B / C
Algoritmos e Fundamentos da Teoria de Computação
Lista 05

Pesquisar sobre variações da Máquina de Turing:

MT de Múltiplas Fitas (MTMF): é uma MT que ao invés de ter somente uma fita e uma cabeça de leitura,
tem várias k fitas, cada uma com sua cabeça de leitura e seu alfabeto Γi, i œ {1,2,..., k}.
A cada passo a máquina lê um símbolo sob cada cabeça e baseando-se neste k símbolos lido a máquina
escreve um novo símbolo em cada fita, move a cabeça de leitura para esquerda ou direito, podendo
também permanecer no mesmo lugar (k’ § k fitas são processadas por vez) e vai para um novo estado.
Inicialmente a entrada é escrita na primeira fita e as outras fitas devem estar em branco, e a medida que
o processamento avança as outras fitas são utilizadas.
Deste modo a função de transição de MTMF recebe um estado e k símbolos lido e retorna um estado, k
símbolos escritos e k direções (E,D ou P).
Apesar de aparentemente mais poderosa que a MT de fita única, a MTMF é equivalente a uma MT de fita
única, pois podemos simular uma MTMF em uma MT simples e a MT simples é um caso particular do
MTMF. A ideia por trás da simulação de uma MTMF numa MT simples é representar o conteúdo das k
fitas em uma fita, dividindo esta única fita em k espaços distintos e adicionando um símbolo de
delimitador de fita #. Além disso precisamos que o alfabeto desta única fita contenha o alfabeto de todas

isso utilizando um alfabeto de marcação Γ2 Z para cada fita, que para cada símbolo de ΓZ lido a máquina
as k fitas e precisamos manter um controle de onde se encontra cada cabeça de fita “virtual”, fazemos

marca um equivalente em Γ2 Z para dizer que a cabeça da fita i está neste ponto.
Γ=!#$  ]Zg ΓZ  Γ2 Z
Fazendo a configuração inicial da primeira fita ter a entrada e as outras fitas “virtuais” estarem em branco
e seguindo as regras da MTMF, mas apenas tomando o cuidado de escrever, ler e marcar as fitas
“virtuais”, podemos simular cada passo da MTMF em uma MT simples, bastando que a cada passo na MT
simples, passemos por cada fita “virtual”.

MT Não-Determinística (MTND): uma MTND é uma MT que permite que num dado ponto da computação
a máquina possa seguir várias possibilidades. Deste modo, o estado qi e o símbolo w lido não definem

h: i  Γ  j i  Γ  !k, l$
univocamente o próximo estado da máquina.

A computação em uma MTND pode ser vista de duas maneiras, primeiro podemos pensar que a MTND é
toma sempre o melhor caminho que o leva a um estado de aceitação, a outra maneira de ver a
computação é pensar em uma árvores de busca, cuja função objetivo é o estado de aceitação, de modo
que a cada ponto de bifurcação, caso um nó folha da busca seja atingido e este nó não é o estado de
aceitação, este ramo deixa de prosseguir, e se algum ramo encontrar um estado de aceitação então a
computação termina e este estado é o estado final da computação.
Como aconteceu no caso da MTMF, a MTND não tem um poder computacional maior que a MT simples,
uma vez que podemos construir uma MT simples que pode simular o comportamento de uma MTND.
Se colocarmos a questão como uma busca em árvore, podemos escolher uma representação para a
configuração inicial da MTND e escrever na fita além da string de entrada e através de uma estratégia de
busca (por exemplo em profundida), alterar a configuração, utilizando as regras da MTND para gerar os
filhos de cada configuração. Podemos fazer isso, gerando uma tupla para representar a configuração da
MTND, codificar esta tupla em uma linguagem, e empilhar cada nó representando uma configuração, até
achar um estado de aceitação, ou retroceder cada vez que chego em estado final de não-aceitação, e
fazer isso até terminar todas possibilidades.

Enumerador: é uma MT que está ligado a uma impressora anexa. Podemos imaginá-lo como uma MT com
duas fitas, uma fita de operação e outra de saída. O enumerador de uma linguagem L é uma MT que
iniciada com uma fita de trabalho em branco, roda para sempre e retorna na fita de saída todos e
somente as strings em L.
Decisor: é uma MT que decide se uma palavra w pertence ou não a uma linguagem L. Se esta máquina for
não-determinística devemos impor a restrição que ela pára para cada ramo da computação não-
determinística.
Algoritmos e Fundamentos da Teoria de Computação
Lista 06

1) Defina e exemplifique os seguintes tipos de análise:


a) Análise de complexidade por tempo;
b) Análise de complexidade por espaço.

Para definir os conceitos de complexidade de tempo e complexidade de espaço, vamos recorrer a


uma máquina de Turing determinística (DTM) M com uma fita. Para uma dada instância x (x é
uma string de entrada) de um problema que M está programada para resolver, M executa
timeM(x) movimentos (esquerda, direita) até chegar em um configuração de aceitação ou
rejeição, que é chamado de tempo de execução. Para esta mesma instância o total de células da
fita que foram utilizadas para durante toda a computação é spaceM(x), chamado de espaço de
trabalho. A análise de complexidade tenta comparar diferentes categorias de DTM ou de
algoritmos através das suas respectivas taxas de crescimentos das funções de complexidade de

ela pode ser definida da seguinte maneira 0: m  m, 0 7  max !EBXDp


: |
|  7$ , e
tempo e de espaço. A função de complexidade de tempo é dada através do tamanho da entrada,

similarmente podemos definir a função de complexidade de espaço, ou seja é o máximo tempo


de execução dentre todos os tempos de execução das strings de entrada com o mesmo
comprimento.

2) Defina o que é uma função de complexidade de um algoritmo.

Respondida na questão anterior.

3) Defina e exemplifique os seguintes termos:


a) Ordem de complexidade de melhor caso.
b) Ordem de complexidade de caso médio.
c) Ordem de complexidade de pior caso.

Na análise de complexidade não basta encontrarmos a função de complexidade de um algoritmo,


importa comparar esta função com as funções de complexidade de outros algoritmos, esta
comparação nem sempre é trivial e nem sempre é trivial encontrar a função exata de
complexidade propriamente dita, para isto são feitas análises dos algoritmos adicionando
possíveis cenários genéricos para estes algoritmos.
A análise de pior caso, considera uma entrada n como uma certa estrutura tal que a MT ou o
algoritmo dará mais passos possíveis, ou em termos da função de complexidade, terá o maior
valor possível para uma entrada de comprimento n.
Na análise de melhor caso, é considerado o contrário, a entrada deve ter uma estrutura tal, que
para aquele comprimento de entrada o algoritmo pare o quanto antes, ou seja, tenha o menor
tempo de execução possível para esta data entrada de comprimento n.
Na análise de caso médio considera-se a média dos tempos de execução de todas entradas com
tamanho n.

4) Qual a relação entre a função de complexidade e ordem de complexidade de um algoritmo?

Uma maneira de analisar e fazer comparações entre algoritmos é através da análise da ordem de
crescimento assintótico de uma função de complexidade. A função de complexidade diz
exatamente a complexidade de tempo ou espaço para entradas de tamanho n, no entanto em
análise de complexidade, é interessante saber como esta função se comporta a medida que o
tamanho da entrada aumenta, ou seja o comportamento assintótico. A ordem de complexidade
de uma função de complexidade é expressa este comportamento assintótico da função de
complexidade. Para a análise de ordem de complexidade são usadas as notações de Big-O, Little-
o, Big-Omega, etc.

5) Sobre o crescimento de funções, defina os seguintes termos notacionais:


a) Notação θ:
Para funções não-negativas, f(n) e g(n), f(n) = Θ(g(n)) se e somente se f(n) = O(g(n)) e
f(n) = Ω(g(n)). Isto quer dizer que que f(n) é limitada superiormente e inferiormente pela
mesma função g(n) – o comportamente de f(n) é o mesmo no pior e melhor caso.

b) Notação O:
É o método formal de expresser o limite superior para o tempo de execução de um algoritmo.
É a medida do maior tempo possível que o algoritmo demoraria para terminar a execução.
Formalmente, para duas funções não-negativas, f(n) e g(n), se existe um inteiro n0 e uma
constante c > 0 tal que para todos inteiros n > n0, f(n) ≤ cg(n), então f(n) = O(g(n)).
Graficamente, g(n) serve como um limite superior assimptótico para a curva de f(n).

c) Notação Ω:
Dadas duas funções não-negativas, f(n) e g(n se existe um inteiro n0 e uma constante c > 0 tal
que para todos inteiros n > n0, f(n) ≥ cg(n), então f(n) = Ω(g(n)).
É praticamente a mesma definição de O-Grande, exceto pelo "f(n) ≥ cg(n)", que faz de g(n) um
limite inferior de f(n). Esta notação descreve o melhor caso que pode ocorrer na execução de
um algoritmo para um dado tamanho de entrada.

d) Notação o:
Para funções não-negativas, f(n) e g(n), f(n) = o(g(n)) se e somente se f(n) = O(g(n)), mas
f(n) ≠ Θ(g(n)). Isto representa uma versão de limite relaxado do O-Grande, que limita
superiormente, mas não inferiormente.

e) Notação ω:
Para funções não-negativas, f(n) and g(n), f(n) = ω(g(n)) sse f(n) = Ω(g(n)), mas f(n) ≠ Θ(g(n)).
Tal como o O-pequeno, ele é equivalente ao Omega-grande. g(n) é limite inferior relaxado de
f(n); ele limita inferiormente, mas não superiormente.

6) Seja n o tamanho da entrada, sobre complexidade de algoritmos, defina os seguintes termos:

Usaremos para neste caso a letra f para designar a função de complexidade e a notação de O-
grande para a ordem de complexidade.

a) Complexidade de tempo linear:


f(n)=O(n), ou seja para uma entrada de tamanho n, dadas constantes a e b, f(n) ≤ a.n+b.
b) Complexidade de tempo polinomial:
Dado uma constante b qualquer, f(n)=O(nb), ou seja, dadas constantes a e b, f(n) ≤ nb + nb-1
+ nb-2 +…+a
c) Complexidade de tempo sub-exponencial:
Não existe uma definição precisa para complexidade sub-exponencial, duas definições são
encontradas na literatura para este tipo de complexidade.
(http://scottaaronson.com/blog/?p=394)
(http://qwiki.stanford.edu/wiki/Complexity_Zoo:S#subexp)
i) f(n)=O(2n^α), 0<α<1.
i) f(n)= o(2n).
d) Complexidade de tempo exponencial:
f(n) = 2O(n), ou seja , para uma constante c f(n) ≤ 2cn.
7) Sejam os algoritmos de ordenação Mergesort, Heapsort, Quicksort, faça:
a) Descreva o funcionamento destes algoritmos;
b) Quais são suas respectivas complexidades de melhor caso, caso médio e
pior caso;
d) Defina qual é o melhor destes algoritmos, de acordo com sua função de complexidade.

Mergesort:
Mergesort(Items[1,..,t]) := Se(t=1) Items[1]
Senão IntercalaOrdenado(Mergesort(Items[1,…,t/2]), Mergesort (Items[t/2+1,…,t]))

Função de Complexidade :
f(1)=a
f(n)=2*f(n/2)+b*n=2*(2*f(n/4)+bn/2)+b*n=4*f(n/4)+bn+bn=4f(n/4)+2*bn=4*(2f(n/8)+bn/4)+2*b
n=8f(n/8)+3bn=2i*f(n/2i)+i*bn, para algum i<=n

f(n)= 2i*f(n/2i)+i*bn
para 2i=n -> i=log2n
temos f(n)=a*n+ b*n*log2n
portanto
f(n)=O(nlogn)

Vale dizer que esta complexidade do Merge-Sort é a mesma no pior, melhor e caso médio, uma
vez que o comportamento do algoritmo não muda muito com a estrutura da sequência de
entrada, ele sempre divide a sequência no meio e sempre tem que percorrer no mínimo metade
da lista ordenada na hora de fazer a intercalação.

Heapsort:
Estrutura Heap: O heap é uma árvore binária semi-cheia que obedeça a uma relação de ordem
parcial entre cada pai e seus filhos. Por exemplo, um heap máximo, é um heap que para todo nó
X,Y, se X=PAI(Y) então X≥Y. Esta estrutura pode ser representada em um vetor, usando o seguinte
esquema: se vet[i]=X e X=PAI(Y) e X=PAI(Z), então vet[2i]=Y e vet[2i+1]=Z.
Heapify:
Algoritmo que assume que um dado ramo X da árvore não está obedecendo a condição de heap.
Caso a relação de ordem não seja satisfeita para um dos filhos de X, é feito a troca entre um filho
e um pai de modo a fazer com a condição do heap seja satisfeita. Esta verificação deve ser feita

no máximo n elementos, vamos descer qe): 7r K qe): Br nós da árvore no pior caso, e no melhor
em seguida no ramo que corresponde ao filho que foi trocado. Se estamos no nó i e o heap tem

caso nenhum nó.


No caso médio:
]
j B  s u 4 8 s u j B 8 1  s u 4 8 s u s u 4 8 s u s u 4 8 v 8 s u s u j B 8 \ ,
    
t t t t t t t t t
onde i+k é o nível (altura da árvore) e a conta pára quando j=qe): 7r K qe): Br.
q{|}~ .rIq{|}~ Zr
1 2 ] 2 q{|}~ .rIq{|}~ Zr
j B  w x 4 y z w x   1 K2w x
3 3 3
]
Vale lembrar que 0 € stu € 1 e portanto:
2 q{|}~ .rIq{|}~ Zr
0 €w x € qe): 7r K qe): Br
3
A complexidade do caso médio é melhor que a complexidade do pior caso.
Algoritmo Heapsort:
O algoritmo se dá em duas fases: a primeira é a construção do heap, e a segunda é a remoção do
maior elemento O(1).
A construção do heap se dá percorrendo o vetor inteiro e chamando heapify(i), para cada
.
elemento do vetor. A complexidade desta operação é

zqe): 7r K qe): \r  7qe): 7r K qe): 7!r € 7e): 7


]g

A segunda fase tem a complexidade fixa O(1) de remoção do elemento extremo e em seguida a
chamada da função heapify partindo do nível 0.

2 q{|}~ .r
0 € 7w x 8 7 1 € 7qe): 7r 8 7 1
3

Portanto a complexidade é O(nlogn)

You might also like