Documente Academic
Documente Profesional
Documente Cultură
Algoritmos: estruturas de dados
e linguagens de programação
Faculdade de Engenharia Elétrica e de Computação (FEEC)
Universidade Estadual de Campinas (UNICAMP)
Prof. Levy Boccato
1
Introdução
Encontro
Problema solução em
Computável tempo COMPLEXIDADE
factível?
O melhor
Problema Nãotratável algoritmo é
O(cn) ou maior
O(cn) ou maior,
ORDEM DE
Problema NP mas não se sabe
COMPLEXIDADE
se é a melhor
DO ALGORITMO
solução
Problema P O(nc) ou menor
2
Introdução
As questões a respeito da computabilidade e da complexidade
nos levam a refletir sobre a existência de um algoritmo para
resolver um problema e sobre o custo computacional envolvido
em sua execução.
Tendo em mãos um algoritmo de interesse, o que é necessário
fazer para que ele esteja pronto para ser executado em um
computador?
É preciso descrever ou expressar todos os seus passos segundo uma
linguagem.
Linguagens de programação
Uma vez escrito nesta linguagem, o algoritmo precisa ser traduzido
para um formato inteligível à máquina incumbida de sua execução.
Processo de execução de um programa
3
Linguagem de máquina
Na linguagem de máquina, os comandos (ou instruções) e
dados que devem ser manipulados são codificados em
cadeias binárias.
É a linguagem mais próxima ao hardware.
Linguagem simbólica
Breve história da linguagem Assembly
Programas eram escritos Surgimento das “Era dos microprocessadores” e
em linguagem de linguagens de alto nível
máquina
sistemas embarcados
Década Década de Década de
de 50 70/80 90 até hoje
Assembly surge para Assembly passou a ser Assembly “volta” na
facilitar a programação pouco usada busca de desempenho
e velocidade
8
Linguagem simbólica
O uso de Assembly tem se tornado mais frequente.
Mar-14 Mar-13 Change Programming Language Ratings Change
1 2 C 17.54% 0.39%
2
3
1
3
Java
Objective-C
16.41%
12.14%
-1.75%
1.91%
6
7
6
7
PHP
(Visual) Basic
3.70%
2.96%
-1.11%
-1.65%
12 69 F# 1.22% 1.14%
13 10 Perl 1.15% -0.81%
14 9 Ruby 0.97% -1.18%
16
17
13
30
Lisp
D
0.75%
0.74%
-0.19%
0.40%
18 20 Assembly 0.73% 0.10%
19 14 PL/SQL 0.71% -0.21%
20 23 MATLAB 0.69% 0.07%
9
Linguagem simbólica
Muitas aplicações
industriais são feitas em Acesso direto e
Assembly controle total do
hardware
Mais eficiente – não
Porque aprender a
gera códigos supérfluos linguagem Programas
Assembly? exigem menos
memória e são
menores
Facilita a
Possibilidade de
programação
desenvolver rotinas mais
em alto nível
eficazes e incorporálas a
programas de alto nível
10
Linguagem simbólica
O que é preciso saber para programar em Assembly?
Conhecer detalhes do hardware: organização da memória,
registradores, periféricos, arquitetura etc.
Trabalhar fluentemente com representação binária:
Números negativos.
Condições de overflow.
Ponto flutuante.
Aprender o conjunto de instruções do processador.
11
Linguagens de alto nível
E como poderíamos pensar em uma linguagem executável em qualquer
máquina e mais próxima da linguagem humana?
Linguagens de alto nível
public class
Possuem uma semântica ExemploDeFor {
mais amigável ao usuário. public static void main(String[] args) {
for (int i = 0; i < 4; i++){
Distante do código de System.out.println("Indice "+i);
máquina e muito próximo da
linguagem humana. }
}
Exemplos: C, C++, C#, Java, }
Ruby, Python, Lisp, Prolog MOV R1, #0
etc. LOOP: ADD R1,R1, #1
Podem ser do tipo CMP R1, #4 ARM
procedimental (descreve
passo a passo) ou declarativa BNE LOOP
(descreve fatos e regras e FIM: ADD R1, R1, #1
busca uma solução lógica). 12
Linguagens de alto nível
Existem também linguagens especiais voltadas à aplicação e para outros
propósitos.
Linguagens voltadas à aplicação
Alguns exemplos:
• Aplicações matemáticas: Matlab
• Voltadas a inteligência artificial: Prolog, Lisp
• Linguagens esotéricas:
LOLcode Piet Brainfuck
HAI
++++++++++[>++++++++>+++++++++++
CAN HAS STDIO?
>>+++>++++++++>+++++++
VISIBLE "OLÁ MUNDO!"
KTHXBYE +++++>+++++++++++>++++++++++>+++
++++++++>+++<<<<<<<<<<]>.>.>
++++.>++.>.>.>.>.>+.>+++.,
13
Processo de execução
Uma vez escolhida uma linguagem de programação e
escrito o código, como ele é executado?
resolução NÍVEL
Problema Algoritmo
CONCEITUAL
Programa em HIERARQUIA
Programa de tradução
alto nível linguagem de DE
compilador máquina LINGUAGENS
montador
decodificação
HARDWARE
Execução
(circuitos e sinais físicos)
14
Linguagens de Programação
Ponto importante: um algoritmo pode ser expresso em
qualquer linguagem de programação. Em última análise,
elas servem apenas como um mediador entre o
programador e a máquina.
As linguagens de baixo nível (máquina e simbólica) não
oferecem muitos recursos para o programador. Porém, o
controle sobre sinais e aspectos de hardware é bem mais
efetivo.
O que muda, portanto, de uma linguagem para outra é a
dificuldade e a inteligibilidade do código escrito.
15
Estruturas de dados
A preparação de um algoritmo também envolve a escolha de uma
forma vantajosa de organizar os dados que serão acessados e
processados.
Dependendo da aplicação, pode haver um tipo de organização
que capture ou expresse de maneira natural uma característica
dos dados associados ao problema.
Veremos quatro tipos básicos:
Vetor
Fila
Pilha
Árvore
16
Estruturas de dados
Suponha que certo algoritmo precise acessar a nota de um aluno
dado o seu RA. Como os dados devem ser organizados?
Solução: uma lista cujo índice seja o RA e o conteúdo as notas
Dessa forma, é possível acessar, incluir e modificar a nota de um
aluno dado o seu RA de maneira direta.
Vetor: sequência de tamanho fixo cujo acesso é realizado através
do índice que identifica a posição do elemento a ser lido ou
escrito.
Com isto, temos acesso aleatório (“direto”) e o tempo de acesso a
qualquer elemento é idêntico.
Leitura – vetor(i) Escrita – vetor(i)
• i é fornecido • i é fornecido
• elemento ← vetor(i) • vetor(i) ← elemento
17
Estruturas de dados
Considere um algoritmo que deve gerenciar o atendimento
telefônico de um call center. Como os dados devem ser
organizados?
c0 REGISTRO DE DADOS
c1
c2
c3
c4
c5
c6
18
Estruturas de dados
Fila: o acesso aos elementos da fila é realizado através das
posições “entrada” e “saída” – as demais posições não são
visíveis.
Estrutura do tipo FIFO (first in, first out).
Acesso: através de dois apontadores.
Manipulação: apenas a entrada e a saída são visíveis.
Leitura – posição “saída” Escrita – posição “entrada”
• elemento ← f(j) • f(i) ← elemento
• atualiza índice de saída j • atualiza índice de entrada i
Fila cheia: índice de entrada i > índice máximo da fila.
Fila vazia: índice de entrada i = índice de saída j.
19
Estruturas de dados
Considere um algoritmo que armazena as páginas que você acessa
na Internet de tal modo que seja possível retornar à primeira
página acessada refazendo o mesmo caminho. Como os dados
devem ser organizados?
(2)
Devo retornar à página mais
recentemente visitada.
(1)
20
Estruturas de dados
Pilha: o acesso aos elementos da pilha é realizado através da
mesma posição (entrada = saída) – as demais posições não são
visíveis.
Estrutura do tipo LIFO (last in, first out).
Acesso: através de um único apontador.
Leitura Escrita
• atualiza o índice i • p(i) ← elemento
•elemento ← p(i) • atualiza o índice i
Pilha cheia: i > índice da última posição da pilha.
Pilha vazia: i = índice da primeira posição da pilha.
i sempre aponta para a próxima posição livre da pilha.
21
Estruturas de dados
Árvore:
Estrutura: cada célula contém um dado e apontador para a(s)
próxima(s) célula(s). As células não precisam ser homogêneas.
célula: dados apontador
Manipulação: flexível, com início pela raiz.
22
Estruturas de dados
Árvore:
O acesso aos elementos da árvore é realizado através de um percurso
a partir de sua raiz, seguindo o(s) apontador(es) das células. Todas as
posições da estrutura são acessíveis.
Leitura – célula j Escrita –célula j
• navegar na estrutura até • navegar na estrutura até
célula j célula j
• elemento ← dados da célula • dados da célula ← elemento 23
Créditos
Este material está baseado nas notas de aula elaboradas pelo
Prof. Léo Pini e pelo aluno de doutorado Tiago Novaes.
24