Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouLucas Gabriel Amorim Sousa Alterado mais de 8 anos atrás
1
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
2
Introdução 2 Problema Computável Problema Computável COMPLEXIDADE Encontro solução em tempo factível? ORDEM DE COMPLEXIDADE DO ALGORITMO O melhor algoritmo é O(c n ) ou maior Problema Não-tratável O(c n ) ou maior, mas não se sabe se é a melhor solução Problema NP O(n c ) ou menorProblema P
3
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
4
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?
5
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.
6
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: c b ← 1(complementa B) s b ← 0(seleciona o complemento de B) l a ← 1(armazena o resultado em A)
7
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
8
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
9
Linguagem simbólica O uso de Assembly tem se tornado mais frequente. 9
10
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
11
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
12
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).
13
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
14
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 programação tradução compilador montador HIERARQUIA DE LINGUAGENS decodificação HARDWARE (circuitos e sinais físicos)
15
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
16
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
17
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
18
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
19
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
20
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.
21
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
22
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:
23
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
24
Créditos 24 Este material está baseado nas notas de aula elaboradas pelo Prof. Léo Pini e pelo aluno de doutorado Tiago Novaes.
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.