equalização de canais de comunicação baseada em redes ...lboccato/topico_1.4_algoritmos.pdf ·...
TRANSCRIPT
EA869 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
2
Problema Computável COMPLEXIDADE
Encontro solução em
tempo factível?
ORDEM DE COMPLEXIDADE DO ALGORITMO
O melhor algoritmo é
O(cn) ou maior Problema Não-tratável
O(cn) ou maior, mas não se sabe
se é a melhor solução
Problema NP
O(nc) ou menor Problema P
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 um 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.
Uma vez escrito nesta linguagem, o algoritmo precisa ser traduzido
para um formato inteligível à máquina incumbida de sua execução.
3
Linguagens de programação
Processo de execução de um programa
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.
A programação, portanto, depende de um pleno conhecimento de como cada comando é representado e interpretado no circuito digital.
4
1010100010110101 0101110101010101 0101011101010101 1010101010101011 0101010101011110
Palavra de 16 bits
Instrução É fácil e eficiente
programar em linguagem de
máquina?
Linguagem de máquina Vejamos um exemplo bastante simples:
5
cb – determina se o valor do registrador B é ou não complementado. sb – seleciona entre o valor referente ao registrador B ou o valor fixo 1. la – habilita o carregamento de um valor especificado na entrada paralela do registrador A.
Linguagem de máquina Exemplo:
6
Este humilde computador permite a realização de algumas operações: (1) A ← A + B (2) A ← A + 1 (3) A ← A – B Um “programa”, escrito em linguagem de máquina, que compute a subtração entre os valores em A e B, seria dado pela sequência de comandos binários: cb ← 1 (complementa B) sb ← 0 (seleciona o complemento de B) la ← 1 (armazena o resultado em A)
Linguagem simbólica Como poderíamos tornar o código mais compreensível ao programador?
7
1010100010110101 0101110101010101 0101011101010101 1010101010101011 0101010101011110
MOV R1, R2
MOV R1, #4 CMP R1, #4
BEQ FIM FIM: ADD R1, R1, 1
Linguagem simbólica (Assembly)
Substitui o código de máquina por símbolos mais próximos da linguagem humana.
Continua sendo muito próxima do hardware.
Trata-se de uma linguagem dependente da arquitetura do computador (hardware).
O código precisa ser interpretado, isto é, convertido ao formato binário para ser executado pelo computador.
Quais as vantagens e
desvantagens desta
linguagem?
Etapa de montagem – veremos no final do curso
Linguagem simbólica Breve história da linguagem Assembly
8
Década de 50
Programas eram escritos em linguagem de
máquina
Assembly surge para facilitar a programação
Década de 70/80
Surgimento das linguagens de alto nível
Assembly passou a ser pouco usada
Década de 90 até hoje
“Era dos microprocessadores” e sistemas embarcados
Assembly “volta” na busca de desempenho
e velocidade
Linguagem simbólica O uso de Assembly tem se tornado mais frequente.
9
Mar-14 Mar-13 Change Programming Language Ratings Change1 2 C 17.54% 0.39%
2 1 Java 16.41% -1.75%
3 3 Objective-C 12.14% 1.91%
4 4 C++ 6.31% -2.80%
5 5 C# 5.57% -1.02%
6 6 PHP 3.70% -1.11%
7 7 (Visual) Basic 2.96% -1.65%
8 8 Python 2.02% -2.37%
9 11 JavaScript 1.90% 0.53%
10 16 Visual Basic .NET 1.86% 0.97%
11 17 Transact-SQL 1.48% 0.64%
12 69 F# 1.22% 1.14%
13 10 Perl 1.15% -0.81%
14 9 Ruby 0.97% -1.18%
15 15 Delphi/Object Pascal 0.88% -0.01%
16 13 Lisp 0.75% -0.19%
17 30 D 0.74% 0.40%
18 20 Assembly 0.73% 0.10%
19 14 PL/SQL 0.71% -0.21%
20 23 MATLAB 0.69% 0.07%
Linguagem simbólica
10
Porque aprender a linguagem Assembly?
Acesso direto e controle total do
hardware
Programas exigem menos memória e são
menores
Muitas aplicações industriais são feitas em
Assembly
Mais eficiente – não gera códigos supérfluos
Possibilidade de desenvolver rotinas mais eficazes e incorporá-las a programas de alto nível
Facilita a programação em alto nível
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?
12
MOV R1, R2
MOV R1, #4 CMP R1, #4
BEQ FIM FIM: ADD R1, R1, 1
public class ExemploDeFor { public static void main(String[] args) { for (int i = 0; i < 4; i++){ System.out.println("Indice " + i); } } }
Linguagens de alto nível
Possuem uma semântica mais amigável ao usuário.
Distante do código de máquina e muito próximo da linguagem humana.
Exemplos: C, C++, C#, Java, Ruby, Python, Lisp, Prolog etc.
Podem ser do tipo procedimental (descreve passo a passo) ou declarativa (descreve fatos e regras e busca uma solução lógica).
Linguagens de alto nível Existem também linguagens especiais voltadas à aplicação e para outros
propósitos.
13
Linguagens voltadas à aplicação
Alguns exemplos:
• Aplicações matemáticas: Matlab
• Linguagens esotéricas:
• Voltadas a inteligência artificial: Prolog, Lisp
HAI
CAN HAS STDIO?
VISIBLE "OLÁ MUNDO!"
KTHXBYE
LOLcode Piet
++++++++++[>++++++++>+++++++++++ >---------->+++>++++++++>+++++++ +++++>+++++++++++>++++++++++>+++ ++++++++>+++<<<<<<<<<<-]>-.>--.> ++++.>++.>---.>---.>.>.>+.>+++.,
Brainfuck
Processo de execução Uma vez escolhida uma linguagem de programação e
escrito o código, como ele é executado?
14
Problema Algoritmo
Programa de alto nível
Programa em linguagem de
máquina
Execução
resolução NÍVEL CONCEITUAL
tradução
compilador montador
HIERARQUIA DE
LINGUAGENS
decodificação
HARDWARE (circuitos e sinais físicos)
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.
17
Leitura – vetor(i)
• i é fornecido
• elemento ← vetor(i)
Escrita – vetor(i)
• i é fornecido
• vetor(i) ← elemento
Estruturas de dados Considere um algoritmo que deve gerenciar o atendimento
telefônico de um call center. Como os dados devem ser organizados?
18
c1
c2
c3
c4
c5
c0 REGISTRO DE DADOS
c6
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.
Fila cheia: índice de entrada i > índice máximo da fila.
Fila vazia: índice de entrada i = índice de saída j.
19
Leitura – posição “saída”
• elemento ← f(j)
• atualiza índice de saída j
Escrita – posição “entrada”
• f(i) ← elemento
• atualiza índice de entrada i
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?
20
(1)
(2)
Devo retornar à página mais recentemente visitada.
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.
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
Leitura
• atualiza o índice i
•elemento ← p(i)
Escrita
• p(i) ← elemento
• atualiza o índice i
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.
Manipulação: flexível, com início pela raiz.
22
dados apontador célula:
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.
23
Leitura – célula j
• navegar na estrutura até célula j
• elemento ← dados da célula
Escrita –célula j
• navegar na estrutura até célula j
• dados da célula ← elemento
Créditos
24
Este material está baseado nas notas de aula elaboradas pelo Prof. Léo Pini e pelo aluno de doutorado Tiago Novaes.