Escolar Documentos
Profissional Documentos
Cultura Documentos
E3 Coal
E3 Coal
PROBLEMAS
Ariel Da Silva Dias
Sumário
INTRODUÇÃO������������������������������������������������� 3
CONSIDERAÇÕES FINAIS���������������������������� 36
2
INTRODUÇÃO
A maioria dos algoritmos transforma objetos de
entrada em objetos de saída. O tempo de execução
de um algoritmo ou método de estrutura de dados
geralmente cresce com o tamanho da entrada,
embora também possa variar para diferentes en-
tradas do mesmo tamanho. Além disso, o tempo
de execução é afetado por muitos fatores, como o
ambiente de hardware e o ambiente de software.
3
realizar uma operação básica em um computador,
como adicionar dois números, atribuir um valor a
alguma variável ou comparar dois números. Deste
modo, um algoritmo constante não depende do
tamanho da entrada.
y Função logarítmica f(n)=log n: trata-se de um
dos aspectos interessantes e surpreendentes da
análise de estruturas de dados e algoritmos. A
forma geral de uma função logarítmica é , para
alguma constante , onde b é a base do logaritmo.
A aproximação de base dois surge na análise de
algoritmos, uma vez que uma operação comum
em muitos algoritmos é dividir repetidamente uma
entrada pela metade. Normalmente deixamos de
lado a escrita do valor da base quando ela é 2, e
apresentamos apenas log n. A função logarítmica
fica um pouco mais lenta à medida que n cresce.
Sempre que n dobra, o tempo de execução aumenta
em uma constante. O exemplo mais conhecido é
o algoritmo de busca binária.
y Função linear f(n)=n: função simples, mas
importante. Dado um valor de entrada n, a função
linear f atribui o próprio valor n. Essa função surge
em uma análise de algoritmo sempre que fazemos
uma única operação básica para cada um dos n
elementos. Por exemplo, comparar um número x
com cada elemento de uma matriz de tamanho n
exigirá n comparações. A função linear também
representa o melhor tempo de execução que es-
4
peramos alcançar para qualquer algoritmo que
processe uma coleção de n entradas.
y Função N-Log-N f(n)=n log n : essa função
cresce um pouco mais rápido que a função linear
e muito mais devagar que a função quadrática.
Se pudermos melhorar o tempo de execução da
resolução de algum problema de quadrático para
N-Log-N, teremos um algoritmo que roda muito mais
rápido em geral. Isso se transforma em um grande
problema, pois sempre que n dobra, o tempo de
execução mais que dobra.
y Função quadrática f(n)=n²: essa função apa-
rece muito na análise de algoritmos, pois existem
muitos algoritmos que possuem loops aninhados,
onde o loop interno realiza um número linear de
operações e o loop externo é realizado um número
linear de vezes. Nesses casos, o algoritmo executa
n * n = n² operações.
y Função exponencial f(n)=bn: nessa função, b
é uma constante positiva, chamada de base e o
argumento n é o expoente. Na análise do algoritmo,
a base mais comum para a função exponencial é b
= 2. Por exemplo, se tivermos um loop que começa
executando uma operação e depois dobra o número
de operações executadas a cada iteração, então
o número de operações executadas na enésima
iteração é 2n. O algoritmo exponencial geralmente
não é apropriado para uso prático, um exemplo
são as Torres de Hanói.
5
Em um cenário ideal, gostaríamos que as opera-
ções da estrutura de dados fossem executadas
em tempos proporcionais à função constante ou
logarítmica e gostaríamos que nossos algoritmos
fossem executados em tempo linear ou n-log-n. Al-
goritmos com tempos de execução quadráticos ou
cúbicos são menos práticos, mas algoritmos com
tempos de execução exponenciais são inviáveis para
todas as entradas, exceto as de menor tamanho.
6
Neste e-book, estudaremos as diversas classes
de problemas em análise de algoritmos, conside-
rando os algoritmos que podem ser solucionados
em tempo polinomial e aqueles que não podem.
Também conhecerá dois tipos de algoritmos que
são muito utilizados em diferentes áreas, mas
principalmente em inteligência artificial: força bruta
e busca heurística.
7
CLASSES DE PROBLEMAS:
P E NP
Considere, por exemplo, que você tenha uma lista
não ordenada de números e queira escrever um al-
goritmo para encontrar o maior. O algoritmo, então,
tem que olhar para todos os números da lista: não
há como contornar isso. Mas se ele simplesmente
mantiver um registro do maior número visto até
agora, ele terá que olhar para cada entrada apenas
uma vez.
8
Desse modo, um algoritmo cujo tempo de execução
é proporcional a é mais lento do que um algorit-
mo cujo tempo de execução é proporcional a n.
Mas tais diferenças se tornam insignificantes em
comparação a outra distinção, entre expressões
polinomiais e expressões em que um número é
elevado à enésima potência, como, digamos, 2n.
9
usamos para expressar problemas mais sofisti-
cados. No caso de classificação de fácil a difícil,
podemos rotulá-los como fácil (P), médio (NP),
difícil (NP-Completo) e, finalmente, mais difícil
(NP-Hard). O relacionamento deles é apresentado
na figura 1.
Difícil
NP - Completo
NP Médio
P Fácil
10
Logo, após mapear P, NP, NP-Completo e NP-Difícil
para “fácil”, “médio”, “difícil” e “muito difícil”, uma
pergunta pode ser colocada: como é possível
colocar um determinado algoritmo em cada uma
destas categorias? Para isso, serão apresentadas
a seguir algumas formalidades.
ALGORITMOS NP
NP (que significa tempo polinomial não determinís-
tico) é o conjunto de problemas cujas soluções
podem ser verificadas em tempo polinomial, mas
não podem ser resolvidos em tempo polinomial.
Mas, até onde qualquer um pode verificar, muitos
desses problemas levam um tempo exponencial
para serem resolvidos. Talvez o problema de tempo
exponencial mais famoso em NP, por exemplo, seja
encontrar fatores primos de um grande número.
Verificar uma solução requer apenas multiplicação,
mas resolver o problema parece exigir sistemati-
camente experimentar muitos candidatos.
11
O(kn). Por exemplo, observaremos complexidades
como O(nn), O(2n), O(20.0000001xn) neste conjunto de
problemas.
12
10.000 x 10.000. Seria mais lento, mas o tempo
para verificar uma solução aumenta a uma taxa
mais lenta (polinomialmente).
ALGORITMOS NP-COMPLETOS
O próximo conjunto é muito semelhante ao ante-
rior. Dando uma olhada no diagrama, todos eles
pertencem a NP, mas estão entre os mais difíceis
do conjunto. O que os torna diferentes de outros
problemas NP é uma distinção útil chamada com-
pletude. Para qualquer problema NP-Completo,
existe um algoritmo de tempo polinomial que pode
transformar o problema em qualquer outro proble-
ma NP-completo. Esse requisito de transformação
também é chamado de redução.
13
(ou seja, P = NP). O exemplo mais famoso seria o
problema dos Caixeiros Viajantes.
ALGORITMOS NP-HARD
O último conjunto de problemas contém os pro-
blemas mais difíceis e complexos da ciência da
computação. Eles não são apenas difíceis de
resolver, mas também difíceis de verificar. Entre
os problemas mais difíceis da ciência da compu-
tação estão:
y Agrupamento K-means: trata-se de um termo
genérico para uma classe de algoritmos não su-
pervisionados para descobrir grupos de coisas,
pessoas ou ideias que estão intimamente relacio-
nadas entre si;
y Problema do Caixeiro Viajante: este é o problema
de otimização da ciência da computação mais
conhecido no mundo moderno. Em outras pala-
vras, trata-se de um problema de encontrar a rota
ótima entre os nós no grafo. A distância total de
viagem pode ser um dos critérios de otimização.
Mais adiante foi reservado um tópico para falarmos
um pouco mais sobre este algoritmo que tem sido
empregado não somente na computação, mas em
diversas áreas como controle de rota de entregas
e rota de automóveis.
14
reduzidos a qualquer problema em NP. Por causa
disso, eles estão NP-Hard e são pelo menos tão
difíceis quanto qualquer outro problema no NP.
Um problema pode estar tanto em NP quanto em
NP-Hard, que é outro aspecto de ser NP-Completo.
15
-Completo, segue-se que eles também devem ser
solucionáveis em tempo polinomial, movendo-os
também para P = NP = NP - Completo.
16
FORÇA BRUTA E
HEURÍSTICAS
A inteligência artificial (IA) é um dos setores em
maior expansão nos últimos anos, com diversos
tipos de aplicações, que abrange desde a montagem
de automóveis em uma linha de fábrica, passando
pelo reconhecimento biométrico, até chegar em
descoberta de doenças e suas curas na saúde.
Trata-se então do estudo da construção de objetos
que agem objetivamente.
17
cesso e é preciso verificar cada solução possível
para poder resolvê-lo. Por exemplo, vamos pegar
um cenário em que você precisa pesquisar no di-
cionário o significado da palavra “psicossomático”
usando o algoritmo de força bruta. Você precisa
percorrer cada palavra para chegar à sua palavra-
-alvo. Considerando um dicionário com n palavras,
a complexidade de tempo seria igual a O(n), uma
vez que leva n passos – sendo também o número
de palavras do dicionário.
18
heurísticas para cada problema, o que resulta na
solução ótima de um problema. O algoritmo de
força bruta baseia-se na abordagem de tentativa
e erro, que é uma metodologia fundamental na
resolução de problemas. Nessa metodologia, o
programa continua fazendo tentativas até obter
sucesso no problema.
19
grafo pode ser direcionado ou não direcionado,
ponderado ou não ponderado, e pode haver mais
de um nó objetivo.
20
seu filho, depois seu neto e assim por diante. Por
esse motivo, essa técnica aumenta ao máximo
a profundidade da árvore de pesquisa em cada
etapa, ou seja, se não houver mais filhos de um
nó para adicionar, ele retrocede para o pai do nó.
A figura 2 ilustra o caminho feito pela busca em
profundidade em uma árvore.
2 5 7
3 4 6 8 9
21
adiciona todos os filhos dos netos do nó inicial e
assim por diante.
2 3 4
5 6 7 8 9
22
inclusão menor que o i + 1, todos os descenden-
tes de i + 1 terão números menores que i e seus
descendentes.
23
possíveis. Trata-se de uma técnica extremamente
útil na resolução de problemas de pequeno porte.
24
topo da pilha e inicia a próxima iteração a partir
do segundo menor dado da lista.
PESQUISA HEURÍSTICA
Uma heurística no sentido mais comum é um mé-
todo que envolve a adaptação da abordagem de
um problema com base em soluções anteriores
para problemas semelhantes. Essas abordagens
visam ser fáceis e rapidamente aplicáveis a uma
série de problemas, de modo a encontrar soluções
aproximadas rapidamente sem usar o tempo e
os recursos para desenvolver e executar uma
abordagem precisa. O princípio de uma heurística
pode ser aplicado a vários problemas em matemá-
tica, ciências e otimização, aplicando heurística
computacionalmente.
25
A pesquisa heurística também é conhecida como
pesquisa informada e é orientada a objetivos. O
objetivo principal da busca heurística é ser rápido
e fácil, abrangendo uma variedade de problemas,
pois encontra uma resposta aproximada sem exigir
ou gastar muito tempo e recursos.
26
o algoritmo irá gerar soluções (nós) e comparar
o nó com o objetivo. Se for o estado de meta es-
perado, ele conclui o processo. Se não for, ele irá
gerar novos nós e repetir até que o estado objetivo
seja encontrado ou até atingir o máximo local,
ou o estado em que todas as outras opções são
piores que o atual. As estratégias do Hill Climbing
são frequentemente utilizadas para otimizações
matemáticas, como no problema do caixeiro
viajante, que tenta encontrar as rotas mais curtas
possíveis entre as paradas de vendas.
y Simulated Annealing: trata-se de um algoritmo
iterativo com uma solução inicial e um problema
de otimização. O Simulated Annealing usa funções
heurísticas para comparar os estados vizinhos dos
dados e decidir entre permanecer no mesmo estado
ou mudar para um novo. O algoritmo se moverá
para estados mais próximos da solução ótima até
atingir um estado que tenha sido observado como
bom o suficiente para a aplicação ou até que seu
tempo de execução seja atingido.
y A*: É um algoritmo de busca que é usado para
encontrar o caminho mais curto entre um ponto
inicial e um ponto final. Trata-se de um algoritmo
útil que é frequentemente usado para percorrer
um mapa para encontrar o caminho mais curto a
ser seguido. A* foi inicialmente projetado como
um problema de travessia de grafos, para ajudar
27
a construir um robô que possa encontrar seu pró-
prio curso.
28
caminhos tenham sido percorridos. Então, você
deve considerar o melhor caminho entre eles.
29
executar tarefas – ao contrário da força bruta, que
é relativamente demorada.
30
não navegará na internet por alguma informação
aleatória, mas especificamente para encontrar o
termo específico.
31
PROBLEMA DO CAIXEIRO
VIAJANTE
O Problema do Caixeiro Viajante é o desafio de
encontrar a rota mais curta e mais eficiente para
uma pessoa tomar, dada uma lista de destinos
específicos. Trata-se de um problema algorítmico
bem conhecido nas áreas de ciência da computa-
ção e pesquisa operacional.
32
aumenta, o número correspondente de viagens de
ida e volta supera as capacidades até mesmo dos
computadores mais rápidos. Com 10 destinos, pode
haver mais de 300.000 permutações e combinações
de ida e volta. Com 15 destinos, o número de rotas
possíveis pode ultrapassar 87 bilhões.
33
e, em seguida, adicione à distância atual. Repita
o processo enquanto a distância atual for menor
que o limite. Se a distância atual for menor que o
limite, você terminou. Agora você pode somar a
distância para que o limite seja igual à distância
atual. Repita esse processo até que todos os arcos
tenham sido cobertos.
y Método do vizinho mais próximo: essa é talvez
a heurística do problema do caixeiro viajante mais
simples. A chave para esse método é sempre visi-
tar o destino mais próximo e depois voltar para a
primeira cidade quando todas as outras cidades
forem visitadas. Para resolver o problema dessa
maneira, escolha uma cidade aleatória e então
procure a cidade não visitada mais próxima e vá
até lá. Depois de visitar todas as cidades, você
deve retornar à primeira cidade.
y Inserção mais distante: ao contrário das outras
inserções, a Inserção Mais Distante começa com
uma cidade e a conecta com a cidade mais distan-
te dela. Em seguida, ele encontra repetidamente
a cidade que ainda não está no passeio que está
mais distante de qualquer cidade no passeio e a
coloca entre as duas cidades que fariam com que
o passeio resultante fosse o mais curto possível.
y Algoritmo Christofides: o Algoritmo de Chris-
tofides é uma heurística com garantia de aproxi-
mação de . Na pior das hipóteses, o passeio não
é maior que da duração do passeio ideal. Devido
34
à sua velocidade e garantia de aproximação de , o
Algoritmo Christofides é frequentemente usado para
construir um limite superior, como um tour inicial
que será otimizado usando heurísticas de melhoria
de tour, ou como um limite superior para ajudar
a limitar o espaço de busca para ramificações e
técnicas de corte utilizadas na busca da rota ideal.
35
CONSIDERAÇÕES FINAIS
Nesse e-book você pôde compreender a teoria
da complexidade, que realiza a classificação de
problemas com base em quão difíceis eles são
de resolver.
36
Além disso, pôde compreender que um problema
é dito NP-hard se um algoritmo, para resolvê-lo,
pode ser traduzido de maneira que consiga resolver
qualquer outro problema NP. Observe então que é
muito mais fácil mostrar que um problema é NP do
que mostrar que é NP-hard. Um problema que é NP
e NP-hard é chamado de problema NP-completo.
37
Referências Bibliográficas
& Consultadas
BORIN, V. P. Estrutura de dados. Curitiba:
Contentus, 2020. [Biblioteca Virtual].