2000 DADO1 DS.W LINK1 DC.W DADO2 DS.W LINK2 DC.W DADO3 DS.W LINK3 DC.W 0

Tamanho: px
Começar a partir da página:

Download "2000 DADO1 DS.W 1 2002 LINK1 DC.W 2050 2050 DADO2 DS.W 1 2052 LINK2 DC.W 2100 2100 DADO3 DS.W 1 2102 LINK3 DC.W 0"

Transcrição

1 Universidade Estadual de Campinas Faculdade de Engenharia Elétrica e de Computação ÍNDICE Notas de aula para a disciplina EA877 Mini e Microcomputadores: Software 1. INTRODUÇÃO TIPOS DE DADOS TIPOS DE DADOS ABSTRATOS NÓS E ESTRUTURAS DE DADOS...3. LISTAS LISTAS CONSTRUÍDAS POR CONTIGUIDADE LISTAS CONSTRUÍDAS POR ENCADEAMENTO (LISTAS LIGADAS) OUTRAS VARIANTES DE LISTAS ENCADEADAS PILHAS FILAS ÁRVORES GRAFOS...16 Ricardo R. Gudwin Wu Shin-Ting Ivan L.M.Ricarte 7. PESQUISA DE DADOS PESQUISA SEQUENCIAL PESQUISA BINÁRIA PESQUISA DIRETA ORDENAÇÃO DE DADOS ESTUDO DIRIGIDO REFERÊNCIAS BIBLIOGRÁFICAS...6 Departamento de Engenharia de Computação e Automação Industrial 1998 (revisão da versão 1997) 1998 DCA/FEEC/UNICAMP i

2 1. Introdução Dois tipos básicos de informação são encontrados na memória de um computador: o código do programa, e os dados de uma maneira genérica. Entendese por dados, um conjunto de palavras de memória (usualmente com 8 bits, mas não necessariamente), cujo conteúdo não é utilizado, em princípio, como uma instrução a ser executada pelo processador, mas sim armazena algum tipo de informação a ser processada por este. Cada palavra de memória é acessada por meio de seu endereço, e pode ter seu conteúdo lido ou escrito pelas instruções do processador. Sendo assim, o tipo mais primitivo de dados é essa palavra básica da memória, que é chamada de byte 1. Alguns processadores (como os da família do 68000, por exemplo), têm registradores de 3 bits e instruções para ler e escrever bytes, word s e long word s. Sendo assim, uma instrução que utilize word s será capaz de ler e escrever em dois bytes consecutivos da memória. Nesse caso, a informação a ser utilizada pelo programa pode ser codificada em termos desses três tipos básicos de dados - byte, word e long word. Entretanto, dependendo do tipo de informação que se quer codificar, esses tipos de dados não são suficientemente poderosos para expressar o que se deseja. Nesse caso, os dados precisam ser arranjados em uma determinada estrutura, de modo a melhor representar a informação desejada. Exemplos de informações que se deseja representar são números inteiros, caracteres alfanuméricos ou números reais em ponto flutuante, mas poderiam também ser tabelas complexas ou mesmo diagramas sofisticados. O tópico de estruturas de dados estuda exatamente a definição e manipulação deste tipo de informação Tipos de Dados Toda linguagem de programação (incluindo aí o Assembly) possui um conjunto de tipos primitivos (ou atômicos) de dados. Exemplos de tipos primitivos de dados são definições como byte, word e long word no Assembly, int (número inteiro), float (número real em ponto flutuante) e char (caracter) no C, integer (número inteiro), real (número real em ponto flutuante) e char no Pascal, bem como diversos outros exemplos encontrados em outras linguagens. Normalmente, como os programas em qualquer linguagem serão efetivamente transformados em linguagem de máquina para execução, os tipos primitivos de dados guardam algum tipo de relacionamento com bytes, words e long words, de modo a facilitar a tradução do programa em sua linguagem original para o programa em linguagem de máquina a ser executado. Além disso, para cada tipo de dados, existe um conjunto de operações que podem ser aplicadas a esses dados. Em linguagens de baixo nível, esse conjunto de operações será o próprio conjunto de instruções do processador. Em linguagens de alto nível, são definidas para cada tipo de dados primitivos, um conjunto de operadores padrão para a linguagem, que podem ser aplicados. Normalmente, esses operadores são os operadores lógicos e algébricos que são encontrados na maioria das linguagens. 1 Usualmente, e por razões históricas, convencionou-se utilizar sempre um byte com 8 bits, embora originalmente o tamanho da palavra de memória pudesse ser qualquer, dependendo da arquitetura de hardware da memória. Nesse texto, seguiremos a convenção padrão e assumiremos que um byte tem 8 bits. Os dados de um determinado tipo estarão sempre organizados na memória do computador, em uma distribuição que dependerá de algumas características dos tipos de dados envolvidos. Os tipos de dados podem ser estáticos ou dinâmicos. Os tipos estáticos são tipos que possuem uma estrutura fixa e imutável para os seus dados. Os tipos dinâmicos são tipos que permitem que essa estrutura dos dados seja alterada durante a execução do programa. Além disso, os tipos podem ter uma distribuição física na memória do computador correspondente a um pacote de bytes contíguos, ou então distribuir seus dados em diferentes segmentos de memória. Aos tipos com distribuição contígua de memória nos referiremos doravante como tipos contíguos e aos tipos com distribuição não-contígua na memória, nos referiremos doravante como tipos distribuídos. Essa nomenclatura, entretanto, não é padrão, sendo utilizada aqui apenas por simplicidade de notação. Normalmente, os tipos primitivos para uma linguagem são tipos estáticos e contíguos. Nesses casos, cada tipo de dados terá um determinado tamanho, normalmente medido em bytes, que é definido nas especificações da linguagem. Dado um determinado endereço da memória, também chamado de referência, link ou apontador para o dado, o byte correspondente a esse endereço, e os bytes subsequentes, de acordo com o tamanho do dado serão interpretados, pela linguagem, como sendo o valor do dado. Para tipos de dados distribuídos, onde a distribuição dos dados na memória do computador pode ocupar segmentos nãocontíguos, essa interpretação de valor do dado não é cabível. 1.. Tipos de Dados Abstratos Os tipos de dados abstratos são uma das primeiras evoluções encontradas em uma linguagem de programação. A idéia básica de sua concepção é a de estender os tipos primitivos encontrados em uma determinada linguagem, por meio da construção de novos tipos de dados, gerados a partir dos tipos primitivos. Esses novos tipos são especificados por meio de construtores de tipos de dados, e recebem um nome que os diferencia dos outros tipos de dados. Além de sua estrutura, define-se também uma interface funcional, ou seja, um conjunto de operações (ou operadores) que podem ser aplicadas em dados do novo tipo. Esses operadores devem incluir a criação/destruição de dados do tipo, o acesso aos tipos primitivos que o constituem, bem como outras operações entre dados do novo tipo e dados de outros tipos. Esses operadores são definidos utilizando-se o conjunto de operadores para os tipos de dados primitivos que integram o novo tipo. Em linguagens mais antigas como o Fortran, o C e o Pascal, os tipos de dados abstratos que estão previstos na linguagem abrangem somente os tipos estáticos e contíguos. Estruturas de dados dinâmicas podem ser construídas, mas não a partir dos mecanismos padrão da linguagem, e sim por meio de bibiliotecas de funções especiais, como por exemplo funções de alocação dinâmica de memória. Além disso, dados de tipos abstratos somente podem ser utilizados, nessas linguagens, por meio de chamadas a funções e procedimentos, pois essas linguagens não permitem a definição de operadores. Linguagens mais modernas, tais como o C++, permitem o overload dos operadores padrão da linguagem (operadores lógicos - AND, OR, NOT... e operadores aritméticos +,-,*,/,...) de modo a permitir sua aplicação em tipos de dados abstratos DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP

3 Um exemplo de um tipo de dados abstratos estático e contíguo é dado a seguir na Figura 1: Memória Endereço da Memória Tipos de dados Primitivos (word e byte) Tipo de dados Abstrato (abstr) dado do tipo abstr Figura 1 - Construção de um Tipo de Dados Abstrato Um tipo de dados abstrato, chamado de abstr é construído a partir dos tipos primitivos word e byte. Como o tamanho de um dado do tipo byte é 1 byte e o tamanho de um dado do tipo word é bytes, o tamanho de um dado do tipo abstr passa a ter 3 bytes. Observe que a partir de um dado do tipo abstr, pode-se sempre isolar os dados dos tipos primitivos que o compõem. Esses, são chamados de campos do dado de tipo abstrato. De uma maneira genérica, a construção de tipos abstratos não está limitada a somente campos de tipos primitivos. Os campos de um tipo abstrato podem ser dados de algum outro tipo abstrato. E não necessariamente esse tipo tem que ser estático e contíguo. Entretanto, a definição de um tipo abstrato não pode ser recursiva, ou seja, um tipo abstrato não pode ter como um campo um dado de um tipo igual ao que está sendo definido. Um tipo interessante de pseudo-recursão pode ocorrer, quando um dos campos de um tipo abstrato é um endereço para um dado do tipo que se está definindo. Isso é possível, porque apesar do tipo estar ainda sendo definido, seu endereço têm um tamanho que está vinculado ao tamanho da memória, e não ao tamanho do tipo abstrato sendo definido. Como regra geral, um tipo abstrato é tratado pela linguagem de programação como um tipo de dados qualquer. Se esse tipo for um tipo estático e contíguo, então o dado possui ainda um tamanho especificado. Dado um endereço da memória, uma sequência de bytes do tamanho do tipo é tratada como um dado desse tipo Nós e Neste texto serão apresentados os tipos de estruturas de dados mais utilizadas: listas, pilhas, filas, árvores e grafos. Estas estruturas são todas organizadas sobre o conceito de nós (algumas vezes chamados de ítens ou elementos). Um nó é a designação genérica de um dado de um determinado tipo (abstrato ou não). A informação em uma estrutura de dados é organizada na forma de um conjunto de nós. Normalmente, um nó será um dado de tipo estático. Nesse caso, cada nó ocupará um espaço contíguo de memória, o qual é dividido (do ponto de vista lógico) em um ou mais campos de informação, dependendo do nó ser de um tipo primitivo ou abstrato. O endereço de um nó (também chamado de apontador, link ou referência) é a localização do início do nó na memória. O conteúdo de um campo pode representar números, caracteres, apontadores ou qualquer coisa que o programador definir. Quando um campo é reservado para conter um apontador mas nenhum endereço é armazenado nele, dizse que este campo contém o apontador nulo, em geral denotado por Λ. A seleção de qual estrutura de dados é a mais adequada para a solução de um problema depende principalmente dos tipos de operações que precisam ser realizadas, ficando a cargo do programador.. Listas Uma lista linear é um conjunto de nós cujas propriedades estruturais envolvem apenas posições relativas lineares (em uma dimensão) dos nós. É um agregado ordenado de elementos que satisfaz as seguintes propriedades: pode ter 0 ou mais elementos; um novo elemento pode ser inserido em qualquer posição especificada; qualquer elemento pode ser removido; qualquer elemento de uma lista pode ser acessado para consulta ou atualização; e pode-se percorrer sequencialmente todos os elementos de uma lista. EXEMPLO: Considere uma aplicação que irá manter uma lista de notas em uma prova para os alunos do curso. Cada nó contém dois campos, um word representando o RA do aluno e um byte representando a nota na prova. A informação em um nó pode ser adequadamente representada como na Figura. RA Registro Figura - Composição de um Nó de tipo Registro Basicamente, define-se um nome de tipo de dado Registro que tem internamente os campos RA e Nota. Existem duas formas básicas para se construir uma lista, pelo mecanismo de contiguidade ou pelo mecanismo de encadeamento. Nota 1998 DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 4

4 .1. Listas Construídas por Contiguidade Neste caso, todos os nós encontram-se em posições contíguas de memória, conforme demonstra o exemplo da Figura 3. Esse tipo de construção é também conhecido como array, ou arranjo. RA Nota.. Listas Construídas por Encadeamento (Listas Ligadas) No caso de listas com características dinâmicas, ou seja, que sofram atualizações frequentes, a opção de alocação contígua não é prática. Nestes casos utiliza-se o segundo mecanismo de construção de listas, através de referências de um nó para o próximo. Desta forma, cada nó é de fato um agregado contendo no mínimo dois campos: o dado propriamente dito e um apontador para o próximo elemento. Endereço do Início da Lista Memória 1o. elemento Registro o. elemento 3o. elemento Adicionalmente, para se manipular a lista devemos ainda ter a informação sobre qual é o primeiro nó. Este apontador ao primeiro elemento é usualmente denominado nó descritor. Essa estrutura pode ser vista na Figura 5 Nó descritor Figura 3 - Lista Construída por Contiguidade O acesso a um elemento neste caso é muito simples. Para acessar o n-ésimo elemento, toma-se o tamanho t de cada nó e soma-se (n 1)*t ao endereço inicial. Entretanto, a inserção ou a remoção de um elemento no meio é uma operação custosa, pois requer o deslocamento (de uma posição) de todos os elementos que estiverem após o elemento inserido (para abrir espaço) ou removido (para ocupar espaço em branco). Em muitos casos, não se deseja contruir uma lista dedicada a cada tipo de informação, uma vez que muitos dos procedimentos sobre a lista seriam simplesmente repetições ou pequenas variações sobre um código básico. Por este motivo, geralmente pode-se encontrar estruturas genéricas, onde um nó tem por conteúdo um apontador para a informação (Figura 4). Figura 5 - Lista Encadeada Essa estrutura pode ser modificada para se tornar genérica, independente do tipo do dado, conforme ilustra a Figura 6. Neste tipo de lista, o primeiro campo do nó não corresponde ao dado em si, mas a um apontador para o dado. Nó descritor Endereço de Memória dados Endereço do Início da Lista Memória 1o. elem. o. elem. 3o. elem. 4o. elem. Apontadores Genéricos para Dados Figura 4 - Arranjo de Apontadores Genéricos 5o. elem. Figura 6 - Lista Encadeada Genérica Não importando qual seja a representação interna de uma lista, ela pode ser implementada como um tipo de dados abstrato, desde que uma interface funcional seja claramente definida. O tipo de dados lista deve prover flexibilidade na especificação das posições dos dados a serem inseridos ou removidos, embora exista uma série de variantes para operações de manipulação. Tomando a operação de inserção como exemplo, podemos ter inserções no início, no meio e no fim de uma lista, inserção após ou antes de um dado (o que requer o conhecimento do conteúdo de cada nó) DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 6

5 Nesta seção nós só vamos considerar operações básicas de inicialização, inserção e remoção de elementos de uma lista. Apesar da representação por contiguidade ser mais simples, as operações de inserção e de remoção podem ser computacionalmente caras, pois é preciso deslocar todos os elementos de uma posição. Além disso, a representação por contiguidade tem a limitação de que, em muitas linguagens de alto nível, a quantidade dos seus elementos deve ser pré-fixada. Numa representação encadeada não precisamos saber a priori a quantidade de elementos numa lista e as operações de inserção e remoção se restringem a atualizações de apontadores como mostra o exemplo a seguir: 000 DADO1 DS.W 1 00 LINK1 DC.W DADO DS.W 1 05 LINK DC.W DADO3 DS.W 1 10 LINK3 DC.W 0 Esse pequeno trecho de programa em Assembly representa uma lista ligada, cujo nó descritor tem um endereço igual a $000. Durante a execução do programa, o conteúdo da memória fica da seguinte maneira: Observe que o valor de LINK3 é colocado em 0, ou seja, a referência nula por convenção, indicando o fim. Se quisermos inserir um novo nó entre o nó 1 e o nó, basta colocarmos em $00 o endereço do novo nó, e no segundo campo do novo nó o valor original de $00. Supondo que o novo nó esteja no endereço $3000, a memória ficaria da seguinte maneira: usuário Assumindo que o endereço 0000 não é válido para o espaço de endereçamento do Observe que, apesar do nó localizado no endereço $3000 aparecer no fim da memória, ele corresponde ao segundo elemento ligada. Se quiséssemos remover agora o 3o. nó (o nó localizado em $050), bastaria ir seguindo a lista (primeiro em $000, depois em $3000 e depois em $050), e tomando o endereço de link do 3o. nó (que é o endereço do 4o. nó), colocá-lo como endereço de link no o. nó. Essa operação resultaria na seguinte estrutura na memória: Observe que, apesar do valor em $050 continuar na memória, este nó não faz mais parte, cujos nós corresponderão apenas aos dados em $000, $3000 e $100. Exemplo: Implementação em Assembly de um trecho de código que cria uma lista ligada com 5 nós do tipo word, seguida de duas sub-rotinas: 1. uma que insere um novo nó na lista em uma posição genérica, entrada pelo usuário; e. outra que remove um nó, também em uma posição genérica entrada pelo usuário. O seguinte código implementa o exemplo. CODE1 EQU $100 CODE EQU $140 DATA EQU $180 ORG DATA DESCR DC.W DADO1 DADO1 DS.W 1 DC.W DADO DADO DS.W 1 DC.W DADO3 DADO3 DS.W 1 DC.W DADO4 DADO4 DS.W 1 DC.W DADO5 DADO5 DS.W 1 DC.W DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 8

6 ORG CODE1 INSERE MOVE.W D0,D1 ;D1 = ponto de insercao MOVE.W A0,A ;A aponta p/ no descritor MOVE.W (A),A ;A aponta p/ inic. do no 1 CMP.W #0,D1 ;Verifica se D1 == 0 BEQ INS1 LOOP ADD.W #,A ;A aponta p/ campo link MOVE.W (A),A ;Move para proximo no' SUB.W #1,D1 BNE LOOP INS1 ADD.W #,A ;A aponta p/ campo link MOVE.W A1,A3 ;A3 aponta p/ novo no' ADD.W #,A3 ;A3 aponta link do novo no' MOVE.W (A),(A3) ;Transfere link p/ novo no' MOVE.W A1,(A) ;Implementa link no' antigo RTS ORG CODE DELETA MOVE.W D0,D1 ;Coloca posicao em D1 MOVE.W A0,A ;A aponta p/ no' descritor MOVE.W A,A3 ;A3 salva no' descritor MOVE.W (A),A ;A aponta p/ inicio no' 1 CMP.W #0,D1 ;Verifica se D1 == 0 BEQ DEL1 LOOP ADD.W #,A ;A aponta p/ campo link MOVE.W A,A3 ;Salva link MOVE (A),A ; Move para proximo no' SUB.W #1,D1 BNE LOOP DEL1 ADD.W #,A ;A aponta p/ campo link MOVE.W (A),(A3) ;Transfere link p/ anterior RTS A estrutura lista descrita na forma de uma lista ligada se encontra no endereço $180. Observe como ela foi implementada. Em DESCR, tem-se o chamado nó descritor, cuja única finalidade é apontar para o começo. Esse nó descritor é importante, pois se resolvermos remover o primeiro elemento da lista, é somente ele que indicará que o elemento foi removido, pois passará a apontar para o segundo elemento. Sem a sua existência, não teríamos como representar que o nó foi removido. O nó descritor aponta para o primeiro nó da lista, que é constituído de dois campos tipo WORD. O primeiro é o dado em si, e o segundo é um link para o próximo nó. A sub-rotina INSERE, localizada em $100, tem como parâmetros o ponto de inserção, passado pelo registrador D0 (D0=0 indica cabeça ), o endereço da estrutura tipo lista, passado em A0, e o endereço do novo nó, passado em A1. A sub-rotina DELETA, localizada em $140, tem como parâmetros o ponto de remoção, passado em D0, e o endereço da estrutura tipo lista, passado em A0. Como a lista implementada não é bi-direcional (ou seja, só aponta o próximo nó em um sentido), o endereço do nó anterior (mais especificamente do link do nó anterior) tem que ser guardado para que se possa religar a lista, após a remoção do nó. EXERCÍCIO 1 O programa do exemplo anterior apresenta um erro de implementação ao não permitir inserções na cabeça. Procure identificar o erro e proponha uma solução através da modificação do código. EXERCÍCIO Implemente em Assembly o exemplo anterior, considerando agora uma lista construída por contiguidade..3. Outras Variantes de Listas Encadeadas Além da estrutura apresentada anteriormente, outros tipos de listas ocorrem frequentemente em muitas aplicações: Listas duplamente encadeadas: cada elemento possui duas referências, uma para o elemento predecessor e a outra para o elemento sucessor. A vantagem desta estrutura é a facilidade na inserção de um novo elemento numa posição especificada qualquer. Listas circulares: quando o último elemento aponta para o primeiro elemento da lista. A vantagem que esta estrutura oferece é o acesso direto ao último elemento da lista. Listas com cabeçalho: quando o elemento descritor contém informaçõs adicionais sobre os elementos, como a quantidade de elementos numa lista. EXERCÍCIO 3 Implemente agora o exemplo anterior utilizando linguagem C. Escolha um tipo primitivo de dado para os elementos, e empregue alocação dinâmica de memória. EXERCÍCIO 4 Implemente em linguagem C um trecho de código que crie uma lista ligada circular e duplamente encadeada com 5 nós de um tipo primitivo de dado. Implemente a seguir funções que insiram um novo nó na lista na posição imediatamente à esquerda e imediatamente à direita para um dado nó e do mesmo modo outras que removam um nó, também em uma posição imediatamente à esquerda e à direita de um dado nó. 3. Pilhas Pilhas são tipos de dados muito utilizados. Elas são listas lineares em que os elementos só são retirados (pop) e inseridos (push) numa mesma extremidade que é denominada o topo da pilha. Dizemos então que a manipulação é feita na 1998 DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 10

7 ordem LIFO (Last In First Out) (Figura 7). Portanto, só existem três operações básicas associadas a esta estrutura: inicializar a pilha (iniciar) inserir um elemento sobre o topo (empilhar) retirar o topo (desempilhar). topo Apontadores Genéricos como um arranjo precisaremos deslocar as posições ocupadas para o início do arranjo cada vez que um elemento for retirado, a fim de otimizar o uso das posições disponíveis. Como a operação de deslocamento pode ser cara, prefere-se utilizar estruturas encadeadas para implementar filas. Na implementação de filas a partir de listas, pode-se tornar custosa a inserção de um elemento na fila, pois cada vez que se insere um novo elemento seria necessário percorrer toda a fila desde o topo até o último elemento para atualizar os apontadores. Uma outra otimização que se pode realizar é manter o endereço do último elemento da fila no nó descritor. Assim, podemos definir um nó descritor com dois campos, conforme a Figura 8. Nó descritor... dados Figura 7 - Pilha As pilhas podem ser consideradas casos particulares de listas; portanto, elas podem ser construídas pelas duas formas de representação apresentadas no capítulo, por contiguidade ou por encadeamento. EXERCÍCIO 5 Usando linguagem C, defina uma estrutura de dados do tipo pilha, construída por encadeamento, e sub-rotinas para as três operações básicas (iniciar, inserir no topo, retirar do topo). EXERCÍCIO 6 4. Filas Repita o exercício anterior utilizando uma representação por contiguidade. Filas são listas lineares em que os elementos são retirados numa extremidade (término) diferente da extremidade em que eles foram inseridos (começo), na ordem FIFO (First In First Out). Assim, só há três operações básicas: inicialização de uma fila; inserção de um elemento e remoção de um elemento. Como as pilhas, as filas são casos particulares de listas. Portanto, pode-se implementar uma fila adicionando algumas restrições sobre as manipulações em listas. Vale, entretanto, chamar atenção ao fato de que se organizarmos uma fila EXERCÍCIO 7 Figura 8 - Fila Implemente em linguagem C um trecho de código que crie uma fila com 5 nós do tipo int, utilizando a representação encadeada. Implemente a seguir subrotinas para a entrada de dados na fila e para a saída de dados da fila. EXERCÍCIO 8 Uma fila com prioridades permite que um elemento inserido com prioridade i seja armazenado à frente de todos os elementos com prioridade menor que i. Implemente as sub-rotinas para manipulação de uma fila com dois níveis de prioridades (0 e 1), onde 0 indica menor prioridade. 5. Árvores Árvores são agregados cujos elementos guardam entre si uma relação hierárquica. Formalmente, uma árvore é um conjunto finito T de nós, tais que: existe um nó que não é subordinado a nenhum outro nó denominado raiz da árvore. os demais nós (ligados à raiz por arcos) formam m 0 conjuntos disjuntos S 1, S,..., S m, onde cada um destes conjuntos é uma (sub)árvore. Os nós subordinados a um nó e ligados a ele por um arco são denominados os filhos daquele nó (pai). Dizemos também que esses nós 1998 DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 1

8 subordinados são irmãos entre si. O número de filhos de um nó é o grau daquele nó. Um nó de grau zero é chamado folha ou nó terminal. O nível de um nó é a distância daquele nó até a raiz (número de arcos que devem ser percorridos). A altura de uma árvore é o maior nível das folhas daquela árvore (Figura 9) G D H B E I Figura 9 - Árvore As árvores mais utilizadas em computação são as denominadas árvores ordenadas, nas quais uma alteração na ordem das (sub)árvores ligadas a cada nó pode provocar interpretações erradas da relação hierárquica existente na árvore. Quando se limita o grau máximo de uma árvore a k, então a árvore é chamada de árvore k-ária. Dentre as árvores ordenadas de grau limitado destacam-se: Árvores binárias: cada nó tem, no máximo, dois filhos. Neste caso, dizemos que um filho corresponde à (sub)árvore da direita e o outro à (sub)árvore da esquerda. Árvores quaternárias: cada nó tem, no máximo, quatro filhos. Árvores octárias: cada nó tem, no máximo, oito filhos. Nesta seção restringiremos as nossas discussões a árvores binárias. Ressaltamos, porém, a possibilidade de converter uma árvore qualquer em árvore binária fazendo, por exemplo, que a (sub)árvore esquerda de um nó seja o filho deste nó e a (sub)árvore direita, seu irmão (Figura 10). A J F raiz C As operações básicas de uma árvore binária genérica (para qualquer dado armazenado em cada nó) são: inicialização criação de uma árvore remoção de uma árvore caminhada por uma árvore Observe que a inserção e a remoção de um nó de uma árvore não são consideradas operações básicas. A razão disso é que essas operações dependem do dado armazenado no nó manipulado, podendo até modificar a relação hierárquica entre os nós da árvore (Figura 11). Possivelmente, a caminhada por uma árvore binária é a principal operação básica. Através dela pode-se percorrer todos os nós de uma árvore sequencialmente e acessar um nó específico. Muitas vezes, a correção dos dados lidos de uma árvore depende essencialmente da forma como ela foi percorrida. Três formas de caminhada frequentemente utilizadas são: caminho pré-fixado: raiz árvore da esquerda árvore da direita (o caminho pré-fixado na árvore da Figura 11(a) produz a sequência ); caminho central: árvore da esquerda raiz árvore da direita (o caminho central na árvore da Figura 11(a) produz a sequência ); caminho pós-fixado: árvore da esquerda árvore da direita raiz (o caminho pós-fixado na árvore da Figura 11(a) produz a sequência ). 4 raiz 5 7 raiz 7 A raiz B C 5 D E F (a) (b) G H I J Figura 10 - Transformação da árvore da figura anterior em uma árvore binária Figura 11 - Remoção de um nó de uma árvore onde os nós da (sub)árvore esquerda de um nó têm valores menores e os da (sub)árvore direita valores maiores que o valor do nó retirado 1998 DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 14

9 nó descritor Figura 1 - Árvore organizada em estrutura encadeada Como para as estruturas lineares, existem também duas formas para organizar os nós de uma árvore na memória: Por contiguidade: seguindo uma estratégia de caminhada pode-se converter uma árvore numa sequência de nós e armazenar esta sequência num tipo de dado construído pelo mecanismo de arranjo. Por encadeamento: a árvore é na realidade um apontador à raiz da árvore (denominado nó descritor), que contém três elementos no caso de uma árvore binária (Figura 1): apontador genérico; apontador à (sub)árvore esquerda e apontador à (sub)árvore direita. EXERCÍCIO 9 Implemente em linguagem C um trecho de código que crie uma árvore binária por encadeamento com 8 nós, como na Figura 1. Caso queiramos remover ou inserir um nó de uma árvore, precisaremos saber a relação hierárquica entre os dados armazenados nessa árvore. Esses valores são dependentes da aplicação. Portanto, programas específicos devem ser implementados para cada aplicação para computar as posições corretas dos nós. Deixamos como exercício a elaboração de um algoritmo para remoção de um nó numa árvore. EXERCÍCIO 10 Defina um algoritmo para remover um determinado nó de uma árvore, de forma que seja mantida a sequência de nós ao caminharmos pela árvore na ordem central. Considere as três possíveis situações: o nó a ser removido possui ambas as subárvores vazias, o nó a ser removido possui uma subárvore vazia e o nó a ser removido possui duas subárvores não vazias. Implemente este algoritmo utilizando linguagem C. raiz Observe que numa operação de remoção podemos chegar a reestruturar totalmente uma árvore. Uma estratégia para evitar isso é marcar simplesmente o nó que contém o dado a ser removido como ausente, ao invés de remover efetivamente o nó e atualizar os apontadores. 6. Grafos Constituem um tipo de agregado capaz de representar relações binárias entre os seus elementos. Quando as relações entre os elementos são assimétricas, teremos um grafo dirigido (directed graph). Caso contrário, dizemos que o grafo é não-dirigido (undirected graph). Matematicamente, um grafo G:(N,A) é constituído por um conjunto de N vértices ou nós (elementos) e A arcos ou arestas (relações binárias). Os vértices podem ser referenciados por seus rótulos (normalmente, números inteiros) e os arcos, pelos vértices que os conectam (Figura 13) N = {1,,3,4,5,6} A = {(1,),(,1),(,4),(,3),(3,4),(4,1),(5,6)} Figura 13 - Grafo Um caminho é uma sequência de arcos em que o segundo nó de cada arco coincide com o primeiro nó do arco seguinte e cada nó pertence, no máximo, a dois arcos. Quando o primeiro nó coincide com o último nó de um caminho, temos então um circuito. Uma árvore é na verdade um grafo para o qual existe um e somente um caminho entre qualquer par de nós. Chamamos atenção ao fato de que um grafo pode ter pares de nós que não são ligados pelos arcos. Tais grafos são chamados não-conexos (unconnected graphs). Nós ligados por arcos são chamados adjacentes. Na Figura 13 o nó é adjacente a 1, 3 e 4. Dizemos também que os arcos (1,), (,1), (,4) e (,3) são incidentes ao nó, porque eles chegam/partem do nó. Em muitas aplicações é útil atribuir valores (pesos) aos arcos. Tais grafos são chamados valorados. Para localizar um nó num grafo, existem diferentes formas de percorrer todos os seus nós. Duas estratégias mais usuais para percorrer um grafo são: percurso em amplitude: (breadth first search) todos os nós adjacentes são visitados antes de visitar os adjacentes dos adjacentes; percurso em profundidade: (depth first search) todos os adjacentes do adjacente são visitados antes. Em ambos os casos, parte-se de um nó v escolhido e considera-se cada um dos nós w i w adjacentes a v (Figura 14) DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 16

10 No percurso em amplitude, coloca-se todos os nós w em uma fila de acordo com a ordem de acesso e marca-se estes nós como os visitados. Repete-se o processo com cada nó colocado na fila. No percurso em profundidade coloca-se os nós w adjacentes numa pilha. Cada nó w i é marcado como visitado e repete-se o processo com os seus adjacentes, até que todos os nós adjacentes sejam visitados. Aí desempilha-se w i e processa-se o próximo nó da pilha. Por encadeamento: podemos substituir os espaços contíguos por listas de nós conforme mostra a Figura 15(c) (a) (b) Figura 14 - Estratégias de percurso a partir do nó 1 (o número em cada nó representa a ordem em que o nó é visitado.) O conjunto de operações associadas a um grafo é dependente das aplicações. Uma série de algoritmos dedicados às aplicações podem ser encontrados na literatura. Entre eles estão os algoritmos para verificar o número de árvores em um grafo, para obter o caminho mínimo entre dois vértices, para obter todos os caminhos entre dois vértices. Entretanto, é possível ainda isolar um conjunto de operações básicas, comuns a todas as aplicações. Elas são: iniciar um grafo remover um grafo inserir um arco remover um arco número de vértices e arcos de um grafo percorrer todos os nós de um grafo testar se dois vértices são adjacentes Quanto à forma de representação de um grafo, temos basicamente duas estratégias: Por contiguidade: um grafo pode ser representado através de uma matriz bidimensional A. Se ambas as colunas e as linhas representam os nós do grafo e cada elemento A ij indica o arco entre os dois nós i e j, dizemos que A é uma matriz de adjacência. Se as colunas representam os nós e as linhas, os arcos (ou vice-versa), A é dita matriz de incidência. Uma matriz bidimensional pode ser formada por um arranjo de apontadores para vetores de dados (Figura 15(a)) ou um arranjo de apontadores apontando para diferentes posições de um outro arranjo (Figura 15 (b)). Observem que nestes casos um grafo é de fato um apontador ao arranjo de apontadores. (c) EXERCÍCIO 11 Figura 15 - Representação de uma matriz 4 4. Implemente em linguagem C trechos de código que criem um grafo como o da Figura 13, utilizando respectivamente uma representação por: matriz de adjacência matriz de incidência e encadeamento. EXERCÍCIO 1 Implemente em linguagem C sub-rotinas para busca em amplitude e para busca em profundidade, de tal forma que a sub-rotina gere uma lista com o percurso visitado. Implemente para cada um dos tipos de representação de grafo utilizado no exercício anterior. 7. Pesquisa de Dados Nos capítulos anteriores foram apresentados os cinco tipos de dados mais comuns para representar e manipular um conjunto de dados. A opção pelo uso de um tipo específico depende das exigências da aplicação em questão, levando-se em consideração por exemplo o domínio dos valores envolvidos e as operações mais frequentes DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 18

11 Nossas discussões restringiram-se a aspectos estruturais, sem levar em consideração os domínios dos valores dos dados que eram manipulados. Entretanto, citou-se em vários pontos que o conhecimento do domínio dos valores facilitaria o estabelecimento de uma ordem entre eles e poderíamos organizar esses dados de tal forma que percursos desnecessários através deles sejam evitados nas operações de manipulação. Neste capítulo vamos aprofundar um pouco o tema de acesso a um elemento específico num conjunto estruturado de dados. Um conjunto estruturado de dados pode ser considerado como uma tabela com n colunas, onde cada coluna corresponde a um atributo de um dado. O atributo é o conjunto de valores que um determinado campo de uma célula pode assumir. Cada linha (entrada) da tabela corresponde a um conjunto de valores dos atributos que caracterizam uma unidade de informação ou uma entidade. O conhecimento dos valores dos dados de um conjunto permite desenvolver algoritmos de comparação entre estes valores e determinar a posição correta de uma entidade em relação às outras antes de uma operação de manipulação (inserção e remoção), a fim de manter os dados ordenados sob um certo critério. Para evitar a ambigüidade no resultado desse cálculo é necessário que o argumento de pesquisa (o(s) valor(es) utilizados para localizar uma ou mais entidades) identifique univocamente as entidades no conjunto. O subconjunto de valores que identificam uma entidade num conjunto é denominado chave (de pesquisa) primária da tabela. Seja a seguinte tabela de notas de alunos: RA Nome Curso X Curso Y Curso Z Maria Santos Maria Silva José Silva José Pereira Luis Silva José Silveira Cada entidade é caracterizada por cinco atributos, que são: RA, nome, notas do curso X, do curso Y e do curso Z. RA é a chave primária da tabela, porque cada aluno tem um RA distinto. Como as entidades estão ordenadas na ordem crescente do RA, a inserção de uma nova entidade requer a comparação do novo RA com os valores já inseridos na tabela a fim de que a ordem seja mantida. Observe que podemos explorar o fato dos dados estarem organizados na ordem crescente do RA para otimizar o acesso a uma entidade pelo argumento RA. Uma forma de acesso é a procura binária como veremos na seção 7. Embora a pesquisa de dados seja estritamente relacionada com o conhecimento do domínio de valores dos atributos, mostraremos aqui que há possibilidade de implementarmos em algumas linguagens de alto nível operações de pesquisa de forma bem genérica através do mecanismo referência Pesquisa Sequencial A pesquisa sequencial ou pesquisa linear é apropriada para representações em estruturas lineares, como as listas. Para acessar uma entidade, caminha-se sequencialmente pelas entradas da tabela e comparam-se os atributos de cada um deles com o argumento de procura até achá-la. Assim, para uma tabela de n entradas, temos 3 : número máximo de comparações igual a n (O(n)) número mínimo de comparações igual a 1 (O(1)). número médio de comparações igual a (n+1)/ (O(n)). Como as entradas da tabela são visitadas sequencialmente, não é necessário que as entidades sejam ordenadas. Portanto, a complexidade de inserção pode ser O(1). Poderemos, por exemplo, sempre inserir no início. A desvantagem é que um maior número de comparações pode ser necessário para a busca de um dado (a complexidade é O(n)). Artifícios foram desenvolvidos para reduzir esta complexidade de pesquisa com um pequeno acréscimo na complexidade de inserção e remoção, tais como: Ordenar as entradas de acordo com as chaves primárias: a procura vai até a entrada cujo campo tem um valor menor ou igual ao valor da chave primária (argumento de pesquisa) da entidade procurada. Colocar as entradas mais solicitadas nas posições iniciais da tabela: conhecida também como migração dinâmica das entradas mais utilizadas para o início da tabela. Um exemplo típico da aplicação desta estratégia é a implementação das filas de prioridades (priority queues) com o uso de filas e pilhas. EXERCÍCIO 13 ligada: Implemente em linguagem C a seguinte tabela, na forma de uma lista Nº da Peça altura largura comprimento Implemente uma sub-rotina que utilizando o no. da peça como chave, forneça (escreva em um bloco de memória cujo endereço é passado como parâmetro) uma lista com os respectivos valores de altura, largura e comprimento, utilizando pesquisa linear. 3 Diz-se que uma função f(n) é da ordem de g(n) ou f(n) = O(g(n)) se existem duas constantes c e n 0 tal que f(n) c g(n) para todo n n 0. Por exemplo, um algoritmo com complexidade temporal O(1) toma um tempo constante para executar, enquanto outro com complexidade O(n) requer um tempo diretamente proporcional ao tamanho da entrada n DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 0

12 7.. Pesquisa Binária Quando se manipula um conjunto de entidades muito grande e as operações sobre ele são predominantemente as de pesquisa, a estratégia de pesquisa sequencial pode ser muito cara, mesmo com o uso dos artifícios citados na seção anterior. Ao procurarmos um assinante num catálogo telefônico de uma grande cidade, utilizamos sempre o fato de que os nomes dos assinantes estão ordenados em ordem alfabética para chegar ao nome procurado, ao invés de percorrermos sequencialmente todos os nomes. Podemos abrir uma página no meio da lista e comparar os nomes na página com o nome procurado e decidir se devemos continuar a procura pela primeira metade ou pela segunda e, assim, recursivamente até chegar à página que contém o nome. Este processo de procura é conhecido como pesquisa binária, porque em cada ponto de decisão temos duas opções. A pesquisa binária só se aplica em conjuntos de entidades ordenados, para que o princípio de exclusão por comparação seja válido. Além disso é interessante que as entidades sejam organizadas de tal forma que, a partir de uma entidade, possa-se chegar facilmente às suas metades. Portanto, das estruturas que vimos nos capítulos anteriores as mais apropriadas para este tipo de pesquisa são: listas lineares organizadas como arranjos e árvores binárias. Idealmente, para um conjunto de n entidades, em cada passo de procura reduzimos o nosso espaço de procura para (1/)n entidades. Depois de k passos teremos (1/) k n entidades. Como (1/) k n 1, então o número máximo de comparações é [log n] +1 ou seja a complexidade é, no pior caso, O(log n). Comparando com a complexidade da pesquisa linear, a pesquisa binária é, em princípio, mais eficiente. Chamamos, entretanto, atenção ao fato de que a pesquisa binária requer dados ordenados e a complexidade da ordenação dos dados deve ser levada em consideração para uma avaliação mais precisa. Quando os dados estão organizados em árvores binárias, a complexidade O(log n) só vale para árvores binárias balanceadas. Estas árvores são caracterizadas por todos os seus nós terem subárvores com alturas diferindo de, no máximo, uma unidade. Quando a árvore não está balanceada a complexidade pode ser até O(n), como mostra a Figura 16. A metodologia utilizada para fazer uma consulta num catálogo telefônico não é exatamente por pesquisa binária. O início de uma procura depende do nome procurado. Se o nome começa pela letra C, abriremos uma página perto do início do catálogo; se começa por T, perto do fim. Assim, a probabilidade de chegarmos ao nome procurado com menor número de comparações é maior. Denominamos este método de pesquisa por interpolação. O método é análogo ao método de pesquisa binária. Só que o argumento de pesquisa é comparado com a chave localizada não no meio, mas numa posição mais favorável, conforme sugerido pela Figura 17. A B C D E F Argumento = Castro EXERCÍCIO 14 G H I J K L Figura 17 - Pesquisa por Interpolação M N O P Q R S T Argumento = Santos A partir dos dados do Exercício 13, implemente uma sub-rotina que, utilizando o no. da peça como chave, forneça uma lista com as respectivas altura, largura e comprimento, utilizando pesquisa binária Pesquisa Direta Considera-se como pesquisa direta sobre um conjunto de n entidades aquela que apresenta uma complexidade igual a O(1). A técnica de pesquisa que se aproxima mais deste desempenho é o uso de uma tabela hash (hash table) com n posições. Essas n posições são enumeradas de 0 até (n-1) e a cada posição corresponde uma entidade do nosso conjunto. Um método para acessarmos diretamente uma entidade pela sua chave primária seria desenvolver uma função que mapeia univocamente uma chave primária a um número inteiro entre 0 e (n-1). A função é conhecida como hashing function (cálculo de endereço). O projeto de uma boa função para cálculo de endereço - sem ambiguidade e de baixa complexidade - não é uma tarefa trivial. Ele exige o conhecimento prévio do domínio dos valores da chave. Até hoje não se tem conhecimento de uma função ideal. Soluções adicionais são necessárias para compensar estas deficiências, como veremos mais adiante. U V X Z 1 Exemplo: Este exemplo apresenta uma função simples para cálculo de endereço. Seja uma tabela hash com 30 posições e um conjunto de entidades identificadas univocamente pela chave de valores inteiros. Escolhendo como a função de cálculo de endereço para uma chave c: F(c) = c mod 30, teremos as seguintes correspondências: 3 Figura 16 - Árvore Binária Não-Balanceada DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP

13 Chave (valor inteiro) Endereço na tabela Observe que duas chaves (8580 e 8610) geram um mesmo valor inteiro (0). Este fenômeno é conhecido como colisão. Para resolver este tipo de ambiguidade existem basicamente dois métodos: Por encadeamento: A tabela hash é constituída por um conjunto de listas de colisão. Ca corresponde a uma posição da tabela. As chaves que geram um mesmo número são colocadas na lista daquele número, como mostra a Figura 18. É fácil ver que este método não impõe nenhuma restrição quanto ao número de entidades do conjunto, mas temos a desvantagem de que a pesquisa de um elemento na lista de colisão é sequencial Figura 19 - Resolução de Colisão por endereçamento aberto Definimos como taxa de ocupação de uma tabela hash a fração No toc =, No + Nl onde N o e N l são respectivamente o número de posições ocupadas e livres. Normalmente o número médio de comparações para localizar uma entidade numa tabela hash é t oc Ordenação de Dados Figura 18 - Resolução de colisão por encadeamento Por endereçamento aberto: O método é menos flexível por limitar o número de entidades ao número de posições pré-definidas na tabela hash. Ele consiste em recalcular o endereço de uma chave, caso ocorra uma colisão. A função de recálculo pode ser chamada tantas vezes quanto for necessário, até encontrar uma posição desocupada na tabela. Existem várias propostas para a função de recálculo. A mais simples seria alocar a primeira posição vazia depois do endereço (re)calculado (Figura 19). Ordenação de dados é uma das operações mais frequentes no suporte a consulta de um grande volume de dados. Na seção 7. vimos que a ordenação das chaves primárias de um conjunto tem um papel fundamental na busca de uma entidade em diversas estruturas de dados. Podemos, entretanto, imaginar aplicações que necessitam de ordenação por outros atributos, diferentes das chaves primárias, tais como lista de alunos ordenados de acordo com o seu coeficiente de rendimento e lista de alunos ordenados de acordo com o número de disciplinas cursadas. Mesmo para as chaves primárias é interessante, em muitos casos, reordenar os dados estruturados para melhorar o desempenho de pesquisa como se pode constatar na Figura 0. A figura mostra uma reordenação da árvore da Figura 16, transformando uma árvore não-balanceada em uma árvore balanceada. Como resultado, o número máximo de comparações é reduzido de quatro para três Figura 0 - Reordenação dos Dados 1998 DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 4

14 A importância desta classe de operação levou ao desenvolvimento de diversos algoritmos eficientes de ordenação baseado numa chave de ordenação específica. A discussão destes algoritmos está fora do escopo desta disciplina, mas eles podem ser encontrados na literatura sobre o tema. Alguns dos algoritmos de ordenação mais conhecidos são bubblesort, quicksort e heapsort. 9. Estudo Dirigido 1. O que são tipos de dados? Como se distinguem os tipos de dados atômicos dos tipos agregados numa linguagem de programação?. Por que é importante abstrair os dados utilizados num programa em tipos de dados? Quais dos tipos de construção apresentados em aula são suportados pela linguagem C? 3. Dada um dado de um determinado tipo, qual é a diferença entre o seu endereço e o seu conteúdo? 4. O que caracterizam as estruturas lineares? Quais são os tipos de dados mais comuns para a sua implementação? Quais as vantagens e desvantagens dessas implementações? 5. Cite algumas operações frequentes sobre uma lista. Por que é difícil definir um conjunto básico (núcleo) de operações para listas? 6. Quais são as diferenças e as semelhanças entre as pilhas e as filas? 7. O que significa FIFO? O que significa LIFO? 8. Uma implementação de fila baseada numa estrutura contígua (arranjo) tem a desvantagem de subutilizar as posições do arranjo. Por quê? (Lembre-se que a manipulação é FIFO.) Como o problema poderia ser solucionado? 9. O que caracterizam as relações hierárquicas? Qual é o tipo de dado mais comum para a sua implementação? Justifique. 10. O que são árvores ordenadas? O que são árvores binárias? 11. Dê uma estratégia para converter uma árvore qualquer em uma árvore binária. 1. O que é a caminhada pela árvore binária? Cite algumas situações para as quais a caminhada por uma árvore é necessária. (Lembre-se que o resultado de uma caminhada é uma sequência de nós da árvore) 13. Cite as três formas de caminhada mais utilizadas. Qual é a diferença entre elas? 14. O que caracteriza as relações binárias? Qual é o tipo de dado mais comum para a sua implementação? Justifique. 15. O que são os grafos dirigidos, não-dirigidos e valorados? Dê uma aplicação para cada um deles. 16. Por que uma árvore pode ser considerada um grafo dirigido? 17. O que é o percurso pelo grafo? Cite algumas situações para as quais o percurso por um grafo é necessário. 18. Quais são os dois tipos de percursos mais usuais? Explique-os. 19. Por que é importante distinguir os nós visitados dos não visitados nos algoritmos de percurso pelos grafos? 0. Por que os algoritmos de acesso a dados são dependentes do domínio de dados? 1. Por que o desempenho de um algoritmo de pesquisa de dados depende da sua estruturação?. Quando o conhecimento de um domínio de dados pode melhorar a sua estruturação, e consequentemente a pesquisa? 3. O que é uma entidade? O que são atributos? O que é uma chave primária? 4. O que caracteriza uma pesquisa sequencial? Qual é a sua complexidade? 5. O que caracteriza uma pesquisa binária? Qual é a sua complexidade? O que são as árvores balanceadas? 6. O que é uma pesquisa por interpolação? 7. O que caracteriza uma pesquisa direta? Qual é o papel da função hashing? Qual é o problema quando implementamos um algoritmo de pesquisa direta com funções hashing? Cite duas estratégias para solucioná-lo. 10. Referências Bibliográficas 1. Korsh, J.F e Garrett, L.J. Data Structures, Algorithms and Program Style Using C. PWS-Kent Publishing Company, Esakov, J. e Weiss T. Data Structures: An Advanced Approach Using C. Prentice-Hall, Veloso, P. e outros. Estrutura de Dados. Ed. Campus, DCA/FEEC/UNICAMP DCA/FEEC/UNICAMP 6

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2 FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO Projeto e Análise de Algoritmos II Lista de Exercícios 2 Prof. Osvaldo. 1. Desenvolva algoritmos para as operações abaixo e calcule a complexidade

Leia mais

Algoritmos e Estrutura de Dados III. Árvores

Algoritmos e Estrutura de Dados III. Árvores Algoritmos e Estrutura de Dados III Árvores Uma das mais importantes classes de estruturas de dados em computação são as árvores. Aproveitando-se de sua organização hierárquica, muitas aplicações são realizadas

Leia mais

Estruturas de Dados Pilhas, Filas e Deques

Estruturas de Dados Pilhas, Filas e Deques Estruturas de Dados Pilhas, Filas e Deques Prof. Eduardo Alchieri Estruturas de Dados Pilhas Pilhas Lista LIFO (Last In, First Out) Os elementos são colocados na estrutura (pilha) e retirados em ordem

Leia mais

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008 Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,

Leia mais

Busca. Pesquisa sequencial

Busca. Pesquisa sequencial Busca Banco de dados existem para que, de tempos em tempos, um usuário possa localizar o dado de um registro, simplesmente digitando sua chave. Uma tabela ou um arquivo é um grupo de elementos, cada um

Leia mais

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann Universidade Federal de Santa Maria NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann O modelo (ou arquitetura) de von

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Pilhas A estrutura de dados Pilha emula a forma de organização de objetos intuitiva que é utilizada diariamente nos mais diversos contextos da vida humana. Containeres são empilhados e desempilhados diariamente

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Uma Árvore Binária de Busca T (ABB) ou Árvore Binária de Pesquisa é tal que ou T = 0 e a árvore é dita vazia ou seu nó contém uma chave e: 1. Todas as chaves da sub-árvore esquerda

Leia mais

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis. 3. Tabelas de Hash As tabelas de hash são um tipo de estruturação para o armazenamento de informação, de uma forma extremamente simples, fácil de se implementar e intuitiva de se organizar grandes quantidades

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguinte propriedade: Para todo nó da árvore, se seu valor é X, então: Os nós pertencentes

Leia mais

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução:

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

Árvores Binárias Balanceadas

Árvores Binárias Balanceadas Árvores Binárias Balanceadas Elisa Maria Pivetta Cantarelli Árvores Balanceadas Uma árvore é dita balanceada quando as suas subárvores à esquerda e à direita possuem a mesma altura. Todos os links vazios

Leia mais

Memória Cache. Prof. Leonardo Barreto Campos 1

Memória Cache. Prof. Leonardo Barreto Campos 1 Memória Cache Prof. Leonardo Barreto Campos 1 Sumário Introdução; Projeto de Memórias Cache; Tamanho; Função de Mapeamento; Política de Escrita; Tamanho da Linha; Número de Memórias Cache; Bibliografia.

Leia mais

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br Introdução O computador como ferramenta indispensável: Faz parte das nossas vidas; Por si só não faz nada de útil; Grande capacidade de resolução

Leia mais

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM 71 Introdução Difere dos níveis inferiores por ser implementado por tradução A tradução é usada quando um processador está disponível para uma mensagem fonte mas

Leia mais

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA FUNDAÇÃO EDUCACIONAL DE ITUIUTABA ASSOCIADA À UNIVERSIDADE DO ESTADO DE MINAS GERAIS CURSO DE SISTEMA DE INFORMAÇÃO PILHA E FILA Prof. Walteno Martins Parreira Júnior www.waltenomartins.com.br waltenomartins@yahoo.com

Leia mais

2. Representação Numérica

2. Representação Numérica 2. Representação Numérica 2.1 Introdução A fim se realizarmos de maneira prática qualquer operação com números, nós precisamos representa-los em uma determinada base numérica. O que isso significa? Vamos

Leia mais

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIAS DA COMPUTAÇÃO BACHARELADO AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS Orientando: Oliver Mário

Leia mais

Dadas a base e a altura de um triangulo, determinar sua área.

Dadas a base e a altura de um triangulo, determinar sua área. Disciplina Lógica de Programação Visual Ana Rita Dutra dos Santos Especialista em Novas Tecnologias aplicadas a Educação Mestranda em Informática aplicada a Educação ana.santos@qi.edu.br Conceitos Preliminares

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Gerência de Arquivos Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno Sumário Conceituação de arquivos Implementação do sistemas de arquivo Introdução Sistema de

Leia mais

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches CT-234 Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural Carlos Alberto Alonso Sanches CT-234 4) Árvores balanceadas AVL, Rubro-Negras, B-Trees Operações em árvores binárias de busca

Leia mais

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa 10.1.4217

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa 10.1.4217 Estruturas de Armazenamento e Indexação Rafael Lage Moreira Barbosa 10.1.4217 Estruturas de Armazenamento Banco de Dados são armazenados fisicamente como arquivos de registro, que em geral ficam em discos

Leia mais

Algoritmos de pesquisa. Tabelas de dispersão/hash

Algoritmos de pesquisa. Tabelas de dispersão/hash Algoritmos de pesquisa Tabelas de dispersão/hash Introdução Motivação: Considerar o problema de pesquisar um determinado valor num vetor (array). Se o vetor não está ordenado, a pesquisa requer O(n) de

Leia mais

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande região de armazenamento formada por bytes ou palavras, cada

Leia mais

Sistema de Arquivos. Ambientes Operacionais. Prof. Simão Sirineo Toscani stoscani@inf.pucrs.br www.inf.pucrs.br/~stoscani

Sistema de Arquivos. Ambientes Operacionais. Prof. Simão Sirineo Toscani stoscani@inf.pucrs.br www.inf.pucrs.br/~stoscani Sistema de Arquivos Ambientes Operacionais Prof. Simão Sirineo Toscani stoscani@inf.pucrs.br www.inf.pucrs.br/~stoscani Gerência de Arquivos É um dos serviços mais visíveis do SO. Arquivos são normalmente

Leia mais

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos Estruturas de Dados Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos Árvores Conceitos Árvores binárias Árvores binárias de pesquisa Árvores binárias balanceadas Árvores ESTRUTURAS

Leia mais

ESTRUTURA DE DADOS PILHA

ESTRUTURA DE DADOS PILHA ESTRUTURA DE DADOS PILHA CONCEITO DE PILHAS - Pilhas são listas lineares onde a inserção de um novo item ou a remoção de um item já existente se dá em uma única extremidade, no topo. Pilha vazia Insere(A)

Leia mais

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

Notas da Aula 17 - Fundamentos de Sistemas Operacionais Notas da Aula 17 - Fundamentos de Sistemas Operacionais 1. Gerenciamento de Memória: Introdução O gerenciamento de memória é provavelmente a tarefa mais complexa de um sistema operacional multiprogramado.

Leia mais

ESTRUTURAS DE DADOS II

ESTRUTURAS DE DADOS II ESTRUTURAS DE DADOS II Msc. Daniele Carvalho Oliveira Doutoranda em Ciência da Computação - UFU Mestre em Ciência da Computação UFU Bacharel em Ciência da Computação - UFJF Conteúdo Programático 1. Introdução

Leia mais

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação Programação 1I Prof. Osório Árvores Binárias Pag.: 1 - UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação Programação II Disciplina: Linguagem

Leia mais

Hashing. Rafael Nunes LABSCI-UFMG

Hashing. Rafael Nunes LABSCI-UFMG Hashing Rafael Nunes LABSCI-UFMG Sumário Mapeamento Hashing Porque utilizar? Colisões Encadeamento Separado Endereçamento Aberto Linear Probing Double Hashing Remoção Expansão Quando não usar! Mapeamento

Leia mais

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES ALGORITMOS DE BUSCA EM LISTAS COM ALOCAÇÃO SEQÜENCIAL Busca em Listas Lineares A operação de busca é

Leia mais

Análises Geração RI (representação intermediária) Código Intermediário

Análises Geração RI (representação intermediária) Código Intermediário Front-end Análises Geração RI (representação intermediária) Código Intermediário Back-End Geração de código de máquina Sistema Operacional? Conjunto de Instruções do processador? Ambiente de Execução O

Leia mais

ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira

ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira ÁRVORES ED2: MSc. Daniele Oliveira 2 Introdução Filas, pilhas» Estruturas Lineares Um dos exemplos mais significativos de estruturas não-lineares são

Leia mais

1. NÍVEL CONVENCIONAL DE MÁQUINA (Cont.) 1.3. INSTRUÇÕES Conceitos Básicos

1. NÍVEL CONVENCIONAL DE MÁQUINA (Cont.) 1.3. INSTRUÇÕES Conceitos Básicos 1. NÍVEL CONVENCIONAL DE MÁQUINA (Cont.) 1.3. INSTRUÇÕES Conceitos Básicos Já estudamos anteriormente que os processadores funcionam (ou melhor, o seu hardware funciona) através de ordens simples e básicas,

Leia mais

Capacidade = 512 x 300 x 20000 x 2 x 5 = 30.720.000.000 30,72 GB

Capacidade = 512 x 300 x 20000 x 2 x 5 = 30.720.000.000 30,72 GB Calculando a capacidade de disco: Capacidade = (# bytes/setor) x (méd. # setores/trilha) x (# trilhas/superfície) x (# superfícies/prato) x (# pratos/disco) Exemplo 01: 512 bytes/setor 300 setores/trilha

Leia mais

Arquitetura de Computadores. Tipos de Instruções

Arquitetura de Computadores. Tipos de Instruções Arquitetura de Computadores Tipos de Instruções Tipos de instruções Instruções de movimento de dados Operações diádicas Operações monádicas Instruções de comparação e desvio condicional Instruções de chamada

Leia mais

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá. INTRODUÇÃO A lógica de programação é extremamente necessária para as pessoas que queiram trabalhar na área de programação, seja em qualquer linguagem de programação, como por exemplo: Pascal, Visual Basic,

Leia mais

Hashing. Estruturas de Dados. Motivação

Hashing. Estruturas de Dados. Motivação Estruturas de Dados Hashing Prof. Ricardo J. G. B. Campello Parte deste material é baseado em adaptações e extensões de slides disponíveis em http://ww3.datastructures.net (Goodrich & Tamassia). Motivação

Leia mais

Complexidade de Algoritmos

Complexidade de Algoritmos Complexidade de Algoritmos Complexidade de Algoritmos Envolvendo Estruturas de Dados Elementares Prof. Osvaldo Luiz de Oliveira Estas anotações devem ser complementadas por apontamentos em aula. Vetor

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Aula 13 Gerência de Memória Prof.: Edilberto M. Silva http://www.edilms.eti.br Baseado no material disponibilizado por: SO - Prof. Edilberto Silva Prof. José Juan Espantoso Sumário

Leia mais

PROGRAMAÇÃO II 4. ÁRVORE

PROGRAMAÇÃO II 4. ÁRVORE 4. ÁRVORE PROGRAMAÇÃO II Prof. Jean Eduardo Glazar Uma árvore impõe uma estrutura hierárquica em uma coleção de itens. Um exemplo familiar é a árvore genealógica. Árvores despontam de forma natural em

Leia mais

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO Capítulo 1 INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO 1.1 Histórico de Linguagens de Programação Para um computador executar uma dada tarefa é necessário que se informe a ele, de uma maneira clara, como ele

Leia mais

Arquitetura de Computadores. Sistemas Operacionais IV

Arquitetura de Computadores. Sistemas Operacionais IV Arquitetura de Computadores Sistemas Operacionais IV Introdução Multiprogramação implica em manter-se vários processos na memória. Memória necessita ser alocada de forma eficiente para permitir o máximo

Leia mais

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 1 Prof. Cristóvão Cunha Objetivos de aprendizagem

Leia mais

CAPÍTULO 2. Grafos e Redes

CAPÍTULO 2. Grafos e Redes CAPÍTULO 2 1. Introdução Um grafo é uma representação visual de um determinado conjunto de dados e da ligação existente entre alguns dos elementos desse conjunto. Desta forma, em muitos dos problemas que

Leia mais

Funções de um SO. Gerência de processos Gerência de memória Gerência de Arquivos Gerência de I/O Sistema de Proteção

Funções de um SO. Gerência de processos Gerência de memória Gerência de Arquivos Gerência de I/O Sistema de Proteção Sistemas de Arquivos Funções de um SO Gerência de processos Gerência de memória Gerência de Arquivos Gerência de I/O Sistema de Proteção 2 Sistemas Operacionais Necessidade de Armazenamento Grandes quantidades

Leia mais

HASHING. Katia Guimarães. katia@cin.ufpe.br 1

HASHING. Katia Guimarães. katia@cin.ufpe.br 1 HASHING Katia Guimarães katia@cin.ufpe.br 1 HASHING Suponha que você pudesse criar um array onde qualquer item pudesse ser localizado através de acesso direto. Isso seria ideal em aplicações do tipo Dicionário,

Leia mais

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Conceitos básicos e serviços do Sistema Operacional Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Tipos de serviço do S.O. O S.O.

Leia mais

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa Prof. Yandre Maldonado - 1 PONTEIROS Prof. Yandre Maldonado e Gomes da Costa PONTEIROS Prof. Yandre Maldonado - 2 Ponteiro é uma variável que possui o endereço de outra variável; É um poderoso recurso

Leia mais

Desenvolvimento de um Simulador de Gerenciamento de Memória

Desenvolvimento de um Simulador de Gerenciamento de Memória Desenvolvimento de um Simulador de Gerenciamento de Memória Ricardo Mendes do Nascimento. Ciência da Computação Universidade Regional Integrada do Alto Uruguai e das Missões (URI) Santo Ângelo RS Brasil

Leia mais

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP) Hardware (Nível 0) Organização O AS/400 isola os usuários das características do hardware através de uma arquitetura de camadas. Vários modelos da família AS/400 de computadores de médio porte estão disponíveis,

Leia mais

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo. Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto

Leia mais

Conceitos de Banco de Dados

Conceitos de Banco de Dados Conceitos de Banco de Dados Autor: Luiz Antonio Junior 1 INTRODUÇÃO Objetivos Introduzir conceitos básicos de Modelo de dados Introduzir conceitos básicos de Banco de dados Capacitar o aluno a construir

Leia mais

Gerenciamento de Clientes

Gerenciamento de Clientes Programação Orientada a Objetos Gerência de Objetos por Outro Objeto Programação de Computadores II Professor: Edwar Saliba Júnior Gerenciamento de Clientes Neste exemplo, veremos de forma bem simples

Leia mais

Linguagem C: Árvores Binarias

Linguagem C: Árvores Binarias Instituto de C Linguagem C: Árvores Binarias Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com Tópicos Principais Introdução Árvores binárias Implementação

Leia mais

Na resolução de um problema por meio de um programa, a primeira providência é conceber um algoritmo adequado.

Na resolução de um problema por meio de um programa, a primeira providência é conceber um algoritmo adequado. Estrutura de Dados Introdução Extraído de : Estruturas de Dados Homero L. Pícollo Na resolução de um problema por meio de um programa, a primeira providência é conceber um algoritmo adequado. A eficiência

Leia mais

3. Arquitetura Básica do Computador

3. Arquitetura Básica do Computador 3. Arquitetura Básica do Computador 3.1. Modelo de Von Neumann Dar-me-eis um grão de trigo pela primeira casa do tabuleiro; dois pela segunda, quatro pela terceira, oito pela quarta, e assim dobrando sucessivamente,

Leia mais

Tabela de símbolos: tabelas de espalhamento

Tabela de símbolos: tabelas de espalhamento Tabela de símbolos: tabelas de espalhamento Marcelo K. Albertini 14 de Janeiro de 2014 2/28 Resumo de complexidades Análises para operação efetuada após N inserções pior caso caso médio keys chave get

Leia mais

Introdução. INF1005 Programação I 33K Prof. Gustavo Moreira gmoreira@inf.puc-rio.br

Introdução. INF1005 Programação I 33K Prof. Gustavo Moreira gmoreira@inf.puc-rio.br Introdução INF1005 Programação I 33K Prof. Gustavo Moreira gmoreira@inf.puc-rio.br introdução Tópicos conceitos básicos o que é um programa um programa na memória decifrando um código referência Capítulo

Leia mais

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Algoritmos e Estruturas de Dados II. Trabalho Prático 2 Algoritmos e Estruturas de Dados II Entrega: 24/09/08 Devolução: 15/10/08 Trabalho individual Prof. Jussara Marques de Almeida Trabalho Prático 2 Você foi contratado pela XOL X Online para desenvolver

Leia mais

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br LP II Estrutura de Dados Introdução e Linguagem C Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br Resumo da aula Considerações Gerais Introdução a Linguagem C Variáveis e C Tipos de

Leia mais

Tabelas de Espalhamento

Tabelas de Espalhamento Tabelas de Espalhamento Motivação Algumas das estruturas de dados vistas anteriormente requerem que seus elementos (células dinâmicas) sejam inspecionados seqüencialmente até que a desejada seja encontrada.

Leia mais

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária 1- Apresentação Binária Os computadores funcionam e armazenam dados mediante a utilização de chaves eletrônicas que são LIGADAS ou DESLIGADAS. Os computadores só entendem e utilizam dados existentes neste

Leia mais

Organização de Arquivos

Organização de Arquivos Classificação e Pesquisa de Dados Aula 2 Organização de s: s Sequenciais e s Sequenciais Indexados UFRGS INF01124 Organização de s Propósito Estudo de técnicas de armazenamento e recuperação de dados em

Leia mais

SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum

SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum Prof. Ricardo José Pfitscher dcc2rjp@joinville.udesc.br Material cedido por: Prof. Rafael Rodrigues Obelheiro Prof. Maurício Aronne Pillon Cronograma Introdução

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Fila de Prioridade A fila de prioridade nada mais é que uma fila comum que permite que elementos sejam adicionados associados com uma prioridade. Cada elemento na fila deve possuir um dado adicional que

Leia mais

Figura 1 - O computador

Figura 1 - O computador Organização e arquitectura dum computador Índice Índice... 2 1. Introdução... 3 2. Representação da informação no computador... 4 3. Funcionamento básico dum computador... 5 4. Estrutura do processador...

Leia mais

Arquiteturas RISC. (Reduced Instructions Set Computers)

Arquiteturas RISC. (Reduced Instructions Set Computers) Arquiteturas RISC (Reduced Instructions Set Computers) 1 INOVAÇÕES DESDE O SURGIMENTO DO COMPU- TADOR DE PROGRAMA ARMAZENADO (1950)! O conceito de família: desacoplamento da arquitetura de uma máquina

Leia mais

Arquitetura de Rede de Computadores

Arquitetura de Rede de Computadores TCP/IP Roteamento Arquitetura de Rede de Prof. Pedro Neto Aracaju Sergipe - 2011 Ementa da Disciplina 4. Roteamento i. Máscara de Rede ii. Sub-Redes iii. Números Binários e Máscara de Sub-Rede iv. O Roteador

Leia mais

Índices* Professora Rosane Minghim. * Baseado no material de Leandro C. Cintra e M. C. F. de Oliveira. Fonte: Folk & Zoelick, File Structures.

Índices* Professora Rosane Minghim. * Baseado no material de Leandro C. Cintra e M. C. F. de Oliveira. Fonte: Folk & Zoelick, File Structures. Índices* Professora Rosane Minghim * Baseado no material de Leandro C. Cintra e M. C. F. de Oliveira. Fonte: Folk & Zoelick, File Structures. Índice Em geral, um índice fornece mecanismos para localizar

Leia mais

ULA Sinais de Controle enviados pela UC

ULA Sinais de Controle enviados pela UC Solução - Exercícios Processadores 1- Qual as funções da Unidade Aritmética e Lógica (ULA)? A ULA é o dispositivo da CPU que executa operações tais como: Adição Subtração Multiplicação Divisão Incremento

Leia mais

Introdução. Introdução. Introdução. Organização Estruturada de Computadores. Introdução. Máquinas Multiníveis

Introdução. Introdução. Introdução. Organização Estruturada de Computadores. Introdução. Máquinas Multiníveis Ciência da Computação Arq. e Org. de Computadores Máquinas Multiníveis Prof. Sergio Ribeiro Computador digital máquina que resolve problemas executando uma série de instruções. Programa conjunto de instruções

Leia mais

UNIDADE 6 - PROGRAMAÇÃO MODULAR

UNIDADE 6 - PROGRAMAÇÃO MODULAR UNIDADE 6 - PROGRAMAÇÃO MODULAR Até o momento as estruturas de controle (seqüência, seleção e repetição) de um algoritmo definia-o como um bloco lógico (início e fim). À medida que os problemas a serem

Leia mais

BC 1518 - Sistemas Operacionais Sistema de Arquivos (aula 10 Parte 2) Prof. Marcelo Z. do Nascimento

BC 1518 - Sistemas Operacionais Sistema de Arquivos (aula 10 Parte 2) Prof. Marcelo Z. do Nascimento BC 1518 - Sistemas Operacionais Sistema de Arquivos (aula 10 Parte 2) Prof. Marcelo Z. do Nascimento 1 Gerência de espaço em disco Cópia de segurança do sistema de arquivo Roteiro Confiabilidade Desempenho

Leia mais

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia. 1 Introdução aos Sistemas de Informação 2002 Aula 4 - Desenvolvimento de software e seus paradigmas Paradigmas de Desenvolvimento de Software Pode-se considerar 3 tipos de paradigmas que norteiam a atividade

Leia mais

Exercícios Teóricos Resolvidos

Exercícios Teóricos Resolvidos Universidade Federal de Minas Gerais Instituto de Ciências Exatas Departamento de Matemática Exercícios Teóricos Resolvidos O propósito deste texto é tentar mostrar aos alunos várias maneiras de raciocinar

Leia mais

INF 1007 Programação II

INF 1007 Programação II INF 1007 Programação II Aula 14 Árvores Binárias Edirlei Soares de Lima Árvores Uma estrutura de dados do tipo árvore permite que dados sejam organizados de maneira hierárquica.

Leia mais

Algoritmos e Estrutura de Dados II

Algoritmos e Estrutura de Dados II Universidade Federal do Vale do São Francisco Algoritmos e Estrutura de Dados II Professor: Marcelo Santos Linder E-mail: marcelo.linder@univasf.edu.br Ementa Árvores B, grafos e tabelas de hash: alocação

Leia mais

Árvore B UNITINS ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 3º PERÍODO 43

Árvore B UNITINS ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 3º PERÍODO 43 AULA A 3 ESTRUTURA RA DE DADOS Árvore B Esperamos que, ao final desta aula, você seja capaz de: identificar as vantagens da árvore B em relação às árvores binária de busca e AVL; conhecer as funções de

Leia mais

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I BCC202 - Estrutura de Dados I Aula 04: Análise de Algoritmos (Parte 1) Reinaldo Fortes Universidade Federal de Ouro Preto, UFOP Departamento de Ciência da Computação, DECOM Website: www.decom.ufop.br/reifortes

Leia mais

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira Algoritmos e Estrutura de Dados Aula 7 Estrutura de Dados: Listas Prof. Tiago A. E. Ferreira Introdução Um das formas mais usadas para se manter dados agrupados é a lista Lista de compras, itens de estoque,

Leia mais

Aula 03 Custos de um algoritmo e funções de complexidade

Aula 03 Custos de um algoritmo e funções de complexidade BC1424 Algoritmos e Estruturas de Dados I Aula 03 Custos de um algoritmo e funções de complexidade Prof. Jesús P. Mena-Chalco jesus.mena@ufabc.edu.br 1Q-2015 1 Custo de um algoritmo e funções de complexidade

Leia mais

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor. PUC-Rio Departamento de Informática Período: 2015.1 Horário: 2as-feiras e 4as-feiras de 17-19 30 de março de 2015 ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) 1 a Lista de Exercícios 1. Lista (a) Seja um TAD

Leia mais

BARRAMENTO DO SISTEMA

BARRAMENTO DO SISTEMA BARRAMENTO DO SISTEMA Memória Principal Processador Barramento local Memória cachê/ ponte Barramento de sistema SCSI FireWire Dispositivo gráfico Controlador de vídeo Rede Local Barramento de alta velocidade

Leia mais

Módulo 4. Construindo uma solução OLAP

Módulo 4. Construindo uma solução OLAP Módulo 4. Construindo uma solução OLAP Objetivos Diferenciar as diversas formas de armazenamento Compreender o que é e como definir a porcentagem de agregação Conhecer a possibilidade da utilização de

Leia mais

1. NÍVEL CONVENCIONAL DE MÁQUINA

1. NÍVEL CONVENCIONAL DE MÁQUINA 1. NÍVEL CONVENCIONAL DE MÁQUINA Relembrando a nossa matéria de Arquitetura de Computadores, a arquitetura de Computadores se divide em vários níveis como já estudamos anteriormente. Ou seja: o Nível 0

Leia mais

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias:

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias: Arquitetura de Computadores Estrutura e Funcionamento da CPU Prof. Marcos Quinet Universidade Federal Fluminense P.U.R.O. Revisão dos conceitos básicos O processador é o componente vital do sistema de

Leia mais

MODELAGEM DE DADOS MODELAGEM DE DADOS. rafaeldiasribeiro.com.br 04/08/2012. Aula 7. Prof. Rafael Dias Ribeiro. M.Sc. @ribeirord

MODELAGEM DE DADOS MODELAGEM DE DADOS. rafaeldiasribeiro.com.br 04/08/2012. Aula 7. Prof. Rafael Dias Ribeiro. M.Sc. @ribeirord MODELAGEM DE DADOS PROF. RAFAEL DIAS RIBEIRO, M.Sc. @ribeirord MODELAGEM DE DADOS Aula 7 Prof. Rafael Dias Ribeiro. M.Sc. @ribeirord 1 Objetivos: Aprender sobre a modelagem lógica dos dados. Conhecer os

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais SISTEMAS DE ARQUIVOS MACHADO/MAIA: CAPÍTULO 11 Prof. Pedro Luís Antonelli Anhanguera Educacional SISTEMAS DE ARQUIVOS - INTRODUÇÃO O armazenamento e a recuperação de informações é

Leia mais

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES Prof. Dr. Daniel Caetano 2012-1 Objetivos Apresentar o funcionamento do computador Apresentar a função da memória e dos dispositivos

Leia mais

Manual SAGe Versão 1.2 (a partir da versão 12.08.01)

Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação

Leia mais

ENGENHARIA DA COMPUTAÇÃO BANCO DE DADOS I CONTEÚDO 5 ABORDAGEM RELACIONAL

ENGENHARIA DA COMPUTAÇÃO BANCO DE DADOS I CONTEÚDO 5 ABORDAGEM RELACIONAL ENGENHARIA DA COMPUTAÇÃO BANCO DE DADOS I CONTEÚDO 5 ABORDAGEM RELACIONAL PROF. MS C. RICARDO ANTONELLO WWW.ANTONELLO.COM.B R PORQUE SER RELACIONAL? Hoje, há um claro predomínio dos SGBD relacionais, principalmente

Leia mais

Manutenção de Arquivos

Manutenção de Arquivos Manutenção de Arquivos Manutenção de Arquivos Algoritmos e Estruturas de Dados II Prof. Ricardo J. G. B. Campello Projetista deve considerar modificações no arquivo Adição, atualização e eliminação de

Leia mais

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software PROCESSO DE DESENVOLVIMENTO DE SOFTWARE Introdução Modelos de Processo de Desenvolvimento de Software Os modelos de processos de desenvolvimento de software surgiram pela necessidade de dar resposta às

Leia mais

Árvores de Suporte de Custo Mínimo

Árvores de Suporte de Custo Mínimo Árvores de Suporte de Custo Mínimo Pedro Ribeiro DCC/FCUP 2014/2015 Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 1 / 28 Árvore de Suporte Uma árvore de suporte ou árvore de extensão

Leia mais

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti ESTRUTURAS DE DADOS I Notas de Aula 1 SUMÁRIO 1. INTRODUÇÃO... 2 1.1 Array (vetores)... 2 2. BUSCA DE ELEMENTOS... 3 2.1 Busca Seqüencial... 3 2.2 Busca Binária... 3 2.3 Busca Indexada... 3 2.4 Busca Hash...

Leia mais

Tabelas Hash. Jeane Melo

Tabelas Hash. Jeane Melo Tabelas Hash Jeane Melo Roteiro Introdução Motivação Definição Tabelas Hash Exemplos Funções hash Colisões Introdução Estudamos a utilização de estruturas como listas e árvores para armazenar informações

Leia mais