Você está na página 1de 10

Disciplina: Estrutura de Dados

Cursos:Sistemas de Informação & Ciência da Computação

Prof. Rogério Cortina


Sumário

Introdução
Definição
Notação Assintótica
Lista
Pilha
Fila
Árvore
Árvore Binária
Árvore Binária Balanceada
“Se clamares por entendimento, e por
inteligência alçares a tua voz, Se como a
prata a buscares e como a tesouros
escondidos a procurares, Então entenderás
os desígnios do Senhor, e acharás o
conhecimento de Deus. Porque o Senhor dá
a sabedoria: da sua boca vem o
conhecimento e o entendimento.”

Provérbios 2:3-6
Introdução

Esta apostila é uma breve síntese do conteúdo compreendido como Estrutura de Dados,
ela de forma alguma almeja alcançar a totalidade do conteúdo existente nesta área da Computação,
mas sim, ser um guia sucinto do conteúdo da disciplina.
A palavra “computação” exerce um impacto diferente dependendo da pessoa a que a
dirigimos. A reação parece ser proporcional ao nível de conhecimento que o receptor possui sobre o
assunto. Muitos reagem com admiração, espanto ou mesmo aversão. Outros talvez, com maior
conhecimento na área compreendam esta palavra como sendo intimamente ligada a programas que
“comandam” computadores, máquina. Um especialista talvez associe esta palavra a “dados”
armazenados em um dispositivo físico. Devemos entender apesar das várias formas existentes de o
fazê-lo, que computadores servem para armazenar informações e programas servem para manipulá-
los. Um exemplo clássico da importância da estruturação é o do catálogo telefônico. Devido à
ordenação alfabética, é razoavelmente simples e rápido o acesso a um número de telefone de um
determinado assinante. Não se poderia dizer o mesmo se não tivéssemos ordem alguma. Agora, o
trabalho de estruturar uma massa enorme de informação, como é o caso dos assinantes e seus
números de telefone em uma cidade grande, é certamente enorme. Vale a pena fazê-la porque o
catálogo telefônico é consultado muitas vezes. Isto é exemplo de um fenômeno freqüente em
computação: pré-computar uma informação que será usada com muita freqüência.
Um fichário organizado alfabeticamente é outro exemplo interessante de estruturação.
Tomando o cuidado de respeitar a ordem ao inserir novas fichas. Temos uma espécie de catálogo
telefônico dinâmico: as alterações preservam as propriedades estruturais que facilitam o acesso.
A Estrutura de Dados procura prover mecanismos para que os softwares possam de
forma otimizada manipular grandes massas de dados.
Definição

Estruturas de Dados

Estuda as principais técnicas de representação e manipulação de dados na memória principal


(RAM).

Organização de Arquivos

Estuda as principais técnicas de representação e manipulação de dados na memória secundária


(DISCO).

Dados

São as informações a serem representadas, armazenadas ou manipuladas.

Tipos de Dados

Refere-se ao conjunto de valores que uma constante, ou variável, ou expressão pode


assumir, ou então a um conjunto de operações que podem ser realizadas sobre os mesmos.

Na definição de uma variável, constante, expressão ou função deve-se definir o Tipo de


Dado, por algumas razões:

1) Representar um tipo abstrato de dado (Realidade);


2) Delimitar a faixa de abrangência (Limites);
3) Definir a quantidade de bytes para armazenamento;
4) E as operações que podem ser efetuadas.

Os tipos de dados podem ser: Primitivos ou Estruturados, sendo que os estruturados, são chamados
de Complexos.

Tipos Primitivos

Os tipos de dados dependem das características do sistema e do(s) processador(es).


Integer (Byte, Word, ShortInt, LongInt)
Real
Boolean
Char
Tipos Estruturados

Os tipos de dados estruturados são aqueles obtidos a partir dos dados primitivos. Exemplos:

String (Cadeia de Caracteres)


Array (Agregados Homogêneos)
Record (Agregados Heterogêneos)
Pointer (Ponteiros)
Enumeração (Conjunto Ordenado de Identificadores)
SubIntervalares (Subconjunto de Tipos Primitivos)

Operações sobre os Dados

Como visto anteriormente, um “tipo de dado” compreende seus valores e as operações


sobre estes valores. Estas operações são expressas pelo conjunto de operações possíveis de serem
realizadas sobre um determinado valor:

- Criação dos Dados


- Manutenção dos Dados
- Inserção de um Componente
- Remoção de um Componente
- Alteração de um Componente
- Consulta aos Dados
- Destruição dos Dados
- Pesquisa e Classificação

Organização dos dados

Os dados de um determinado tipo estarão sempre armazenados e organizados em


memória, 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.

Estruturas Indexadas

Conhecidos como vetores, arrays ou arranjos estas estruturas permitem o


armazenamento e a indexação de dados, ou seja, organizar dados de forma lógica e de tal forma que
possam ser facilmente recuperados.
Exemplo de um vetor comum.

Neste exemplo podemos notar que a ligação entre cada elemento é dada a partir da existência de um
índice de posições no vetor.

 Declaração
 V: vetor[0...n] de inteiros
 int[] V = new int[n];
 Atribuição
 V[0] ç valor
 V[0] = valor;
 Acesso
 valor ç V[0]
 valor = V[0];

Características

 Simples de implementar.
 Espaço contínuo da memória com tamanho n.
 Possui tamanho pré-determinado.
 Limitação: quantidade de elementos que o conjunto irá suportar.

Estruturas Dinâmicas

As estruturas dinâmicas de alocação são formas de armazenar dados de forma não


contínua na memória, porém, preservando uma lógica organizacional das informações, permitindo assim
que sejam recuperadas, alteradas e/ou apagadas. Requisições e liberações de porções da memória são
feitas ao longo da execução do programa, para isto são usadas variáveis dos tipos Ponteiro/Referência.
Exemplos de estruturas dinâmicas como Listas, Pilhas e Filas serão vistos ao longo deste
material.
Notação Assintótica

Analisar um programa e “dizer” que o mesmo é eficiente é algo no MÍNIMO digno de


descrédito se não forem utilizadas as devidas formas empíricas. A experimentação científica nem
sempre é algo simples. Como seria possível efetivamente afirmar que um programa de computador ou
um algoritmo é eficiente? Uma possível resposta seria afirmar que o programa demorou pouco tempo
(tempo cronológico) para concluir sua tarefa. Se submetêssemos esse programa a executar em uma
máquina “mais lenta”, e se aumentássemos exponencialmente a quantidade de dados de entrada, o
programa ainda seria eficiente? Pudemos observar nesta questão apenas alguns dos problemas
envolvidos, e se quiséssemos comparar esse programa/algoritmo a outro? Como seria possível realizar
esta análise?
Devemos antes de estabelecer qualquer método de resolução aos problemas acima, listar
quais são as variáveis envolvidas:

Software: A execução de aplicativos são diretamente afetados pela linguagem em que os


mesmos são escritos. É de conhecimento geral que linguagens como Assembler e C ++ geralmente
possuem melhor desempenho computacional por estar mais próximos a linguagem nativa do
computador.
Hardware: Máquinas com desempenho diferente obviamente tendem a gerar saídas em
tempos diferentes apesar da mesma entrada de dados e dos programas serem os mesmos.
Sistema Operacional: Influi diretamente no tempo de execução do programa. Ex: Linux,
Windows e Macintosh.
Entrada de dados: A entrada de dados necessariamente deveria ser a mesma para todos os
aplicativos e hardwares, porém, isto nem sempre pode ser possível.

A experimentação de um programa/algoritmo é dificultada pelos motivos listados abaixo:

 Podem ser feitos em um número limitado de entradas de teste;

 É difícil comparar a eficiência de dois algoritmos a não ser que os experimentos tenham
sido feitos com o mesmo hardware e software;

 É necessário implementar e executar um algoritmo.

A solução para os problemas de análise de complexidade se dá através da criação de


uma metodologia de análise que permita:

 Levar em conta todas as entradas possíveis;

 Permitir-nos avaliar a eficiência relativa de dois algoritmos de forma independente


de hardware e do software;

 Pode ser feita através do estudo de uma descrição em alto nível do algoritmo.

Esta metodologia objetiva associar a cada algoritmo uma função f(n) que caracteriza o
tempo de execução do algoritmo com uma função do tamanho n da entrada;
 Exemplo:

 “Um algoritmo qualquer é executado em tempo proporcional a n”. Em outras


palavras, dizemos que se fôssemos realizar experimento contataríamos que o tempo
de execução deste algoritmo para qualquer entrada de tamanho n nunca excederia cn,
onde c é uma constante que depende do hardware e do software usados no
experimento.

Para que esta análise possa ser possível não é necessário implementar um programa,
tarefa a qual pode demandar várias horas ou dias para que possa ser possível, basta elaborar um
algoritmo.

Um algoritmo é um pseudocódigo que mistura linguagem natural com estruturas de


programação. Pseudocódigos são utilizados para descrever as idéias principais da programação
desejada.

As principais estruturas de programação que podem ser expressas através de


pseudocódigo e que podem ser analisadas assintoticamente são:

 Expressões

 declarações de métodos

 estruturas de decisão

 estruturas de repetição

 indexação de arranjos

 chamadas de métodos

 retorno de métodos

Exemplo:

 Problema: descobrir qual o maior elemento em um vetor V

 Entrada: um vetor V com n ≥ 1 elementos inteiros

 Saída: o maior elemento de V

Algoritmo maiorElemento(V, n)

maior ← V[0]

para i de 1 até n - 1 faça


se (V[i] > maior) então
maior ← V[i]
fimse
fimpara

retorna maior
Definimos um conjunto de operações primitivas de alto nível que são independentes da
linguagem de programação usada e podem ser identificadas no pseudocódigo:

As seguintes operações estão incluídas entre as operações primitivas:

 atribuição de valores a variáveis

 chamadas de métodos

 operações aritméticas

 comparação de dois números

 acesso a um arranjo

 seguir uma referência a um objeto

 retorno de um método

Exemplo:

 Número mínimo de operações: 2 + 1 + n + 4(n – 1) + 1 = 5n

 Número máximo de operações: 2 + 1 + n + 6(n – 1) + 1 = 7n - 2

Você também pode gostar