Você está na página 1de 7

Estruturas de dados Programas consistem em duas coisas, algoritmos e Estruturas de dados Um bom programa a combinao de ambos A escolha e a implementao

ntao de uma estrutura de dados so to importantes quanto as rotinas que manipulam os dados A forma como a informao organizada e acessada normalmente determinada pela natureza do problema de programao Por essa razo, importante ter o mtodo certo de armazenamento e recuperao, para uma variedade de situaes, na sua bagagem de conhecimentos. A separao que existe entre o conceito lgico de um item de dados e sua representao de mquina tem correlao inversa com sua abstrao Conforme os tipos de dados se tornam mais complexos, a forma como o programador os imagina apresenta uma semalhana cada vez menor com a forma na qual eles so, na realidade, representados na memria. Tipos simples como char e int esto intimamente ligados sua representao de mquina E o valor que um inteiro tem na sua representao de mquina aproxima-se daquilo que o programador imagina que ele tem. Matrizes podem no aparecer na memria da forma que o programador supe que aparea. Os nmeros em ponto flutuantes esto menos relacionados ainda. A representao interna na mquina real tem pouca semelhana com a imagem que alguns programadores fazem de um nmero em ponto flutuante A estrutura que um tipo de dado conglomerado acessado sobre apenas um nome, ainda mais distinta da representao de mquina. Em essncia, dados fsicos esto unidos a um mecanismo de aquisio de dados, que controla a forma como as informaes podem ser acessadas pelo seu programa. Existem basicamente 4 tipos Fila Pilha Lista encadeada rvore binria Cada um desses mtodos fornece uma soluo para uma classe de problemas Esses mtodos so essencialmente dispositivos que executam uma operao especfica de armazenamento e recuperao da informao dada, de acordo com o que lhes foi requisitado. Todos eles armazenam um item e recuperam um item, onde um item uma unidade de informao. Filas Uma fila simplesmente uma lista linear de informaes, que acessada na ordem primeiro a entrar, primeiro a sair (FIFO First In First Out). O Primeiro item colocado o primeiro a ser retirado, o segundo item colocado o segundo a ser recuperado e, assim por diante. Essa a nica forma de armazenar e recuperar dados em uma fila, no permitido acesso randmico a nenhum item especfico. Para visualizar como opera uma fila, considere duas funes: armazena() e remove(). A funo armazena() coloca um item no final da fila e remove() retira o primeiro item da fila e devolve seu valor. Uma operao de recuperao remove um item da fila e o destri, se no for armazenado em nenhum outro lugar. Assim, um fila pode ficar vazia, porque todos os itens foram removidos, muito embora o programa ainda esteja em atividade. Usadas em muitas situaes de programao Simulaes, distribuio de eventos, diagramas PERT ou Gantt e, em bufferizao de E/S. Pilhas Uma pilha o inverso de uma fila, porque usa o acesso ltimo a entrar, primeiro a sair ou conhecido como LIFO - Last In, First Out. Para visualizar uma pilha, imagine uma pilha de pratos. O primeiro prato na mesa o ultimo a ser usado e o ltimo prato colocado na pilha o primeiro a ser usado. Pilhas so usadas em grande quantidade em software de sistema, incluindo compiladores e interpretadores. A maioria dos compiladores C usa uma pilha quando passa argumentos para funes. As duas operaes bsicas armazenar e recuperar so tradicionalmente chamadas de push e pop, respectivamente. Assim para implementar uma pilha, voc precisa de duas funes push() (que coloca um valor na pilha) e pop() (que recupera um valor da pilha). Tambm ser necessria uma regio de memria para usar como pilha. Uma matriz pode ser usada com esse propsito ou alocar uma regio de memria, usando as funes de alocao dinmica.

Como na fila, a funo de recuperao retira um valor da pilha e o destri se ele no for armazenado em algum outro lugar. Ao implementar uma pilha, deve-se evitar o armazenamento da pilha, ultrapassando seus limites (overflow), e a tentativa de recuperar dados depois de ter esvaziado a filha (underflow) Usualmente uma varivel topo criada e ela quem define o ndice da prxima posio livre da pilha. Uma pilha vazia indicada por topo com o valor zero e uma pilha cheia indicada com um valor maior que a ltima posio de armazenamento.

Pilhas Um uso para pilhas est em uma calculadora de 4 funes. A maioria das calculadoras de hoje aceitam a forma padro de expresses operando operador- operando. A maioria das calculadoras antigas usavam a notao postfix, na qual dois operandos so inseridos primeiro e, em seguida, o operador inserido. Conforme os operando so inseridos, so colocados em uma pilha. Cada vez que um operador inserido, dois operandos so removidos da pilha e o resultado colocado de volta na pilha. A vantagem da forma ps-fixada que expresses muito complexas podem ser facilmente digitadas pelo usurio. Filhas e Pilhas Compartilham duas caractersticas muito comuns: ambas tm regras muito rigorosas para acessar os dados armazenados nelas e as operaes de recuperao so, por natureza, destrutivas. Acessar um item em uma pilha requer sua remoo. Listas encadeadas Tanto Pilhas como Filas usam uma rea contgua da memria Uma lista encadeada pode acessar seu armazenamento de forma randmica, porque cada poro carrega consigo um elo ao prximo item de dados na corrente Uma lista encadeada exige uma estrutura complexa de dados em oposio a pila ou filha que operam com item simples ou no. Podem ser singularmente encadeadas ou duplamente encadeadas. Quando simplesmente encadeada ela contm um elo com o prximo item de dado. Quando duplamente encadeada ela contem elos tanto com o elemento anterior, quanto com o prximo elemento da lista. O tipo de lista encadeada utilizada depende de sua aplicao. Listas Lineares Uma lista uma forma de agrupar itens com a finalidade de melhorar sua manipulao. a propriedade seqencial de uma lista linear, que a base para sua definio e para o seu uso. Observamos que em uma lista linear, existe um incio, onde est o primeiro elemento e, um fim, onde est o ultimo elemento. A disciplina de acesso (forma com que se realizam as operaes de insero e remoo) o que determina a classificao das listas lineares. Classificao das Listas Lineares Permite representar um conjunto de elementos, de forma a preservar a relao de ordem linear entre eles. Um conjunto de elementos n>=elementos (ns), x1,x2, ..., xn, organizados de tal forma que sua estrutura reflete diretamente as posies relativas dos elementos que compe a lista. O nmero de elementos de uma lista denominado comprimento ou tamanho da lista.

Principal propriedade estrutural das Listas Seus elementos podem ser ordenados de maneira linear de acordo com suas posies na lista. Para uma lista com n>=0, onde n representa o numero de ns: X1: o primeiro elemento da lista. X0 o ultimo elemento da lista. E para cada i, 1 < i < n, o elemento xi precedido por xi-1 e seguido de xi+1 Quando n=0, dizemos que a lista est vazia. Sobre uma lista, podem atuar diversas operaes, a seguir so apresentadas algumas delas. Criao de uma lista linear vazia; Acesso ao i-simo elemento de uma lista para examin-lo ou alter-lo Insero de um novo elemento antes (ou depois) do i-simo elemento de uma lista linear; Remoo do i-simo elemento de uma lista linear; Cpia de uma lista linear; Combinao de duas ou mais listas em uma nica lista linear; Particionamento de uma lista linear em duas ou mais listas lineares; Determinao do tamanho de uma lista linear Ordenao dos elementos de uma lista linear Localizao em uma lista linear de um elemento com uma determinada informao Excluso de uma lista linear Considerao sobre implementaes de listas Em uma mesma implementao, no so usadas todas as operaes. Dificuldade de manter uma boa eficincia para todas as operaes simultaneamente Formas de agrupar a acessar elementos em uma lista linear Podemos apresentar duas formas para agrupar e acessar os elementos em uma lista linear: seqencial e encadeada. A forma seqencial considerada a possibilidade mais natural para se colocar elementos no interior de uma lista. Assumese simplesmente que a colocao dos elementos de uma lista linear ocorre em clula com memrias consecutivas. A forma encadeada a segunda possibilidade para agrupar os elementos em uma lista linear Nesse caso, em vez de manter os elementos em clulas consecutivas, pode-se utilizar quaisquer clulas para guardar os elementos da lista. Vantagens do agrupamento seqencial Facilidade para calcular o endereo de memria de um certo elemento de ndice i. Para isto, basta conhecer o endereo inicial da rea alocada pela lista linear, o tamanho de bytes de cada clula de memria e o ndice i do elemento que se deseja obter o endereo inicial de memria. Desvantagens do agrupamento seqencial Realizao de operaes como inserir ou remover elementos no meio da lista. Isso ocorre por que necessrio movimentar os elementos para liberar (insero) ou diminuir (remoo) o espao entre eles. Forma encadeanda Para preservar a relao de ordem linear da lista, cada elemento armazena sua informao e tambm o endereo da prxima clula de memria vlida. Cada n possui dois campos: um para armazenar os dados e outro para o prximo endereo. Na forma encadeada dois endereos so muitos importantes: E = endereo do primeiro elemento = nulo = null = endereo do elemento fictcio para o qual aponta o ltimo elemento da lista. O endereo inicial E do primeiro elemento essencial para a localizao do ponto de incio da lista linear com alocao encadeada. Sem esse endereo inicial E, impossvel localizarmos o incio da lista linear. J o endereo , importante porque marca o final da lista linear. Forma encadeanda: Vantagens Insero ou remoo de um elemento em qualquer ponto da lista linear. Isso acontece porque no necessrio movimentar nenhum elemento. Basta fazer a devida atualizao na parte do n correspondente ao endereo apontado para o prximo elemento. Forma encadeanda: desvantagens

Manipular um elemento especfico da lista Diferente da forma seqencial na qual podemos usar uma frmula para encontrar o endereo, com encadeamento esse clculo impossvel. Isso acontece porque s temos o endereo do primeiro elemento da lista linear. Se for necessrio acessar o ltimo elemento da lista teremos que percorrer todos os elementos. Lista lineares com disciplina de acesso Disciplina de acesso refere-se a forma como so acessados os membros de uma lista. Inseres, remoes e acessos de consulta. Podem ser classificadas como pilhas, filas ou ainda, em filas duplas. Pilhas(Stacks) Lista linear onde todos os acessos so realizados em uma s extremidade denominada TOPO Insero Remoo Consulta Padro de comportamento: ltimo elemento a ser inserido o primeiro a ser removido. Esse o motivo das pilhas serem tambm referenciadas como uma estrutura LIFO (Last In, First Out)

Filas (queues) Lista linear na qual todas as inseres so realizadas em uma das extremidades (fim da fila). Todas as remoes e os acessos so realizados em outra extremidade (incio da fila) Conceito denominado FIFO (First-In First-Out)

Fila dupla (deque)

Lista linear na qual todas as inseres, as remoes e os acessos so realizados nos extremos direito ou esquerdo da lista linear. Fila dupla com entrada ou sada restrita Dependendo da prioridade necessria para um elemento, a fila dupla pode ser classificada como fila de sada ou de entrada restrita. Programao & Estrutura de Dados Recursividade _ A recursividade pode ser considerada um mtodo eficaz para resolver um problema originalmente complexo, reduzindo-o em pequenas ocorrncias do problema principal. _ Segue a idia do dividir para conquistar: para resolver um problema complexo, o dividimos em partes menores, nas quais a complexidade menor em relao ao original. _ Resolvendo isoladamente cada uma das pequenas partes podemos obter a soluo do problema original como um todo Um algoritmo dito recursivo quando chama a si mesmo ou chama uma seqncia de outros algoritmos, e um deles, chama novamente o primeiro algoritmo _ Muitas vezes, um algoritmo recursivo representa de forma mais natural a soluo de um determinado problema. A grande dificuldade no uso da tcnica recursiva est no reconhecimento de situaes, nas quais a tcnica no compromete as questes de espao (memria ocupada) e de tempo (tempo de execuo), _ Mantendo-se, uma boa compreenso da soluo do problema, ou seja, o algoritmo obtido representa a soluo do problema de forma simplificada A funo fatorial _ A funo fatorial ser usada para apresentar os conceitos de recursividade. Posteriormente veremos que um mtodo inadequado para resolver o fatorial. _ Na matemtica fatorial definida por A funo fatorial _ Precisamos de uma definio mais precisa, para calcular o fatorial: _ Calculando 4! Usando a ltima definio, faramos:

_ Os passos anteriores ilustram a essncia da forma que a recursividade trabalha _ Para obter resposta ao problema original, primeiramente um mtodo geral usado para reduzir o tamanho do problema original em um ou mais problemas de natureza semelhante, porm de tamanho menor. O mesmo mtodo ento, usado para esses subproblemas e, a recursividade continua at que o tamanho dos subproblemas seja reduzido soluo trivial, ponto em que a soluo dada diretamente, sem mais precisar da recursividade. Todo o processo recursivo consiste em duas partes: _ Soluo trivial: conseguida por definio, ou seja, no necessrio o uso da recursividade. _ Soluo geral: a soluo genrica que funciona em uma parte menor do problema original, mas que pode ser aplicada integralmente ao problema original. Verso recursiva para calcular o fatorial de n

O prximo exemplo no realiza nada de til. _ Ser usado apenas para ilustrar a construo da rvore de recurso, que considerada uma boa ferramenta para acompanhar a evoluo de um algoritmo recursivo Um outro exemplo de recursividade est no clculo do Mximo Divisor Comum. _ O slide a seguir mostra o processo usual para o clculo do MDC. Implemente um algoritmo para clculo do MDC usando recursividade.

As torres de Hani _ No sculo XIX um jogo chamado torres de Hani apareceu na Europa com um material promocional, explicando que o jogo representava uma tarefa realizada no Templo de Brahma (montanhas de Hani) _ Dizia ainda que, na criao do mundo aos sacerdotes foi dada uma plataforma de metal na qual existiam trs hastes de diamante. Na primeira haste existiam 64 discos de ouro, cada um ligeiramente menor em relao ao que estava por cima. _ Os sacerdotes foram encarregados de mover todos os discos de ouro da primeira haste para a terceira. No entanto haviam duas restries: 1. Mover apenas um disco de uma vez 2. E nenhum disco poderia ficar sobre um disco menor. _ Entretanto, poderiam usar qualquer haste de diamante para descanso dos discos. _ Aos sacerdotes, foi dito tambm que quando eles terminassem de movimentar os 64 discos de ouro, isso significaria o fim do mundo. Podemos resumir nossa tarefa em: Para tentar chega a uma soluo, tentaremos nos concentrar no passo mais difcil que mover o ltimo disco. _ No h como chegar ao ltimo disco at que os 63 discos anteriores tenham sido removidos; ainda mais, eles devem estar na torre 2 para que possamos movimentar o ltimo disco da torre 1 para a torre 3. Podemos resumir nossos passos em algo como: 1. Move(63, 1, 2, 3) //Move 63 discos da torre 1 para 2 (torre 3 temporria) 2. Imprima mova o disco n 64 da torre 1 para a torre 3 3. Move(63, 2, 3, 1) //Move 63 discos da torre 2 para 3 (torre 1 temporria) Essa a idia da recursividade. Descrevemos como realizar o passo-chave e consideramos que o restante do problema feito essencialmente - da mesma forma (dividir para conquistar)

_ Para escrever o algoritmo devemos saber em cada passo, qual torre ser usada como armazenamento temporrio: move(int qtd, int inicio, int fim, int aux) _ Condio inicial: existe no mnimo qtd discos na torre inicio. O disco de topo (se existir) nas torres aux e fim maior do que qualquer outras qtd discos presentes na torre inicio move(int qtd, int inicio, int fim, int aux) _ Condio final: os qtd discos que estavam na torre inicio foram movidos para a torre fim. A torre aux (usada como armazenamento temporrio) retornou para sua posio inicial. Um exemplo de implementao da funo move para as torres de Hani. Implemente uma funo principal para trs discos.

Recursividade _ Um outro uso para recursividade esta na implementao da srie de Fibonacci. _ No entanto a sada adequada esta no uso de um algoritmo interativo ao invs de um recursivo, devido ao desperdcio de tempo e de espao. Seqncia de Fibonacci _ Na prtica: voc comea com 0 e 1, e ento produz o prximo nmero de Fibonacci somando os dois anteriores para formar o prximo. _ O prximo exemplo apresenta um algoritmo interativo para o clculo do nmero de Fibonacci.

Modelo recursivo para a seqncia de Fibonacci.

Você também pode gostar