Documente Academic
Documente Profesional
Documente Cultură
LISTAS DE EXERCÍCIOS
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.
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.
Por definição (
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
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.
,
e
,
portanto
,
- Reflexividade:
Seja dois pares (x,y) e (y,x) pertencentes a . Comos eles pertencem a intersecção de dois
- Anti-Simetria
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)
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
, ,
)*
Uma função pode ser definida como uma relação R com a seguinte propriedade.
10) Demonstre que qualquer função de um conjunto finito para ele próprio contém um ciclo.
B={ {(a,a)} }
+ !, , , , … , ,. $
iii) Suponha que card(A) = n e que B tenha n! funções de A em A, todas contendo ciclos.
/ !0 , 0 , … , 0.! $
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.
: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
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’
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:
L27 07
L27 K 1 :P7
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.
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 é.
n Xn
S Y SZ
Podemos facilmente verificar o seguinte fato: se
SZ então
!7$ SZ3 , para um n qualquer
- S[ é contável: trivial.
Prova: por indução
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
0: F GX^,5DN
07 27 K 1
b. F e conjunto de todos inteiros.
0: F _
7
K , ND 7 é ^,5 )* D5)
2 R
07 ` 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
L7, \ b L7 K 1, \ 8 7, ND \ 1 D 7 Q 1 R
L7, \ 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 L7, 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
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.
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.
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 *).
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.
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?
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.
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) = ∅
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) 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
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 Γ ji Γ !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
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.
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.
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.
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
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 71 7qe): 7r 8 71
3