Você está na página 1de 17

Mdulo 3

Estruturas de Dados

Lio 1
Conceitos Bsicos e Notaes

Verso 1.0 - Mai/2007

JEDITM

Autor Joyce Avestro Equipe Joyce Avestro Florence Balagtas Rommel Feria Reginald Hutcherson Rebecca Ong John Paul Petines Sang Shin Raghavan Srinivas Matthew Thompson

Necessidades para os Exerccios

Sistemas Operacionais Suportados NetBeans IDE 5.5 para os seguintes sistemas operacionais: Microsoft Windows XP Profissional SP2 ou superior Mac OS X 10.4.5 ou superior Red Hat Fedora Core 3 Solaris 10 Operating System (SPARC e x86/x64 Platform Edition) NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas: Microsoft Windows 2000 Profissional SP4 Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e x86/x64 Platform Edition) Vrias outras distribuies Linux Configurao Mnima de Hardware Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 500 MHz Intel Pentium III workstation ou equivalente 500 MHz Intel Pentium III workstation ou equivalente UltraSPARC II 450 MHz AMD Opteron 100 Srie 1.8 GHz PowerPC G4 Memria 512 MB 512 MB 512 MB 512 MB 512 MB HD Livre 850 MB 450 MB 450 MB 450 MB 450 MB

Configurao Recomendada de Hardware Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 1.4 GHz Intel Pentium III workstation ou equivalente 1.4 GHz Intel Pentium III workstation ou equivalente UltraSPARC IIIi 1 GHz AMD Opteron 100 Series 1.8 GHz PowerPC G5 Memria 1 GB 1 GB 1 GB 1 GB 1 GB HD Livre 1 GB 850 MB 850 MB 850 MB 850 MB

Requerimentos de Software NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar, e executar aplicaes escritas em linguagem Java. Sun Java System Application Server Platform Edition 9. Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para sua plataforma em http://java.sun.com/j2se/1.5.0/download.html Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode ser obtida diretamente da Apple's Developer Connection, no endereo: http://developer.apple.com/java ( necessrio registrar o download da JDK). Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html

Estruturas de Dados

JEDITM

Colaboradores que auxiliaram no processo de traduo e reviso


Alexandre Mori Alexis da Rocha Silva Aline Sabbatini da Silva Alves Allan Wojcik da Silva Andr Luiz Moreira Anna Carolina Ferreira da Rocha Antonio Jose R. Alves Ramos Aurlio Soares Neto Brbara Anglica de Jesus Barbosa Bruno da Silva Bonfim Bruno dos Santos Miranda Bruno Ferreira Rodrigues Carlos Alexandre de Sene Carlos Eduardo Veras Neves Cleber Ferreira de Sousa Everaldo de Souza Santos Fabrcio Ribeiro Brigago Fernando Antonio Mota Trinta Frederico Dubiel Givailson de Souza Neves Jacqueline Susann Barbosa Joo Paulo Cirino Silva de Novais Joo Vianney Barrozo Costa Jos Augusto Martins Nieviadonski Jos Ricardo Carneiro Kleberth Bezerra G. dos Santos Kefreen Ryenz Batista Lacerda Leonardo Leopoldo do Nascimento Lucas Vincius Bibiano Thom Luciana Rocha de Oliveira Lus Carlos Andr Luiz Fernandes de Oliveira Junior Luiz Victor de Andrade Lima Marco Aurlio Martins Bessa Marcos Vinicius de Toledo Marcus Borges de S. Ramos de Pdua Maria Carolina Ferreira da Silva Massimiliano Giroldi Mauricio da Silva Marinho Mauro Cardoso Mortoni Mauro Regis de Sousa Lima Namor de S e Silva Nolyanne Peixoto Brasil Vieira Paulo Afonso Corra Paulo Oliveira Sampaio Reis Pedro Antonio Pereira Miranda Renato Alves Flix Ren Csar Pereira Reyderson Magela dos Reis Ricardo Ulrich Bomfim Robson de Oliveira Cunha Rodrigo Fernandes Suguiura Rodrigo Vaez Ronie Dotzlaw Rosely Moreira de Jesus Seire Pareja Silvio Sznifer Tiago Gimenez Ribeiro Vanderlei Carvalho Rodrigues Pinto Vanessa dos Santos Almeida

Auxiliadores especiais
Reviso Geral do texto para os seguintes Pases:
Brasil Tiago Flach Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro

Coordenao do DFJUG
Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso, disponibilizao dos materiais e insero de novos mdulos Rodrigo Nunes - Coordenador responsvel pela parte multimdia Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)

Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM Rommel Feria Criador da Iniciativa JEDITM

Estruturas de Dados

JEDITM

1. Objetivos
Na criao de soluo para os processos de resoluo de problemas, existe a necessidade de representao dos dados em nvel mais alto a partir de informaes bsicas e estruturas disponveis em nvel de mquina. Existe tambm a necessidade de se sintetizar o algoritmo a partir das operaes bsicas disponveis em nvel de mquina para manipular as representaes em alto nvel. Estas duas caractersticas so muito importantes para obteno do resultado desejado. Estruturas de dados (Data Structures) so necessrias para a representao dos dados, enquanto que os algoritmos precisam operar no dado para obter a sada correta. Nesta lio iremos discutir os conceitos bsicos por detrs do Processo Resoluo de Problemas (Problem Solving), tipos de dados, tipos de dados abstratos, algoritmos e suas propriedades, mtodos de endereamento, funes matemticas e complexidade dos algoritmos. Ao final desta lio, o estudante ser capaz de: Explicar os processos de resoluo de problemas Definir tipos de dados (data type), tipos de dados abstratos (abstract data type) e estrutura de dados (data structure) Identificar as propriedades de um algoritmo Diferenciar os dois mtodos de endereamento endereamento computado e endereamento por link Utilizar as funes matemticas bsicas para analisar algoritmos Mensurar a complexidade dos algoritmos expressando a eficincia em termos de complexidade de tempo e notao Big-O

Estruturas de Dados

JEDITM

2. Processo de resoluo de problemas


Programao um processo de resoluo de problemas. Por exemplo, o problema identificado, o dado a ser manipulado e trabalhado distinguido e o resultado esperado determinado. Isso implementado em uma mquina chamada computador e as informaes fornecidas para ela so utilizadas para solucionar um dado problema. O processo de resoluo de problemas pode ser visto em termos de Domnio de Problema (Domain Problem), mquina e soluo. Domnio do problema inclui a entrada (input), ou os dados brutos, em um processo, e a sada (output), ou os dados processados. Por exemplo, na classificao de um conjunto de nmeros aleatrios, o dado bruto um conjunto de nmeros na ordem original, aleatrios, e o dado processado so os nmeros em ordem classificada, crescente, por exemplo. O domnio de mquina (machine domain) consiste em meios de armazenamento (storage medium) e unidades processadas. Os meios de armazenamento bits, bytes, etc consistem na combinao de bits em seqncias que so endereveis como unidade. As unidades processadas nos permitem melhorar o desempenho de operaes bsicas que incluem a aritmtica, a comparao e assim por diante. O domnio de soluo (solution domain), em outras palavras, liga os domnios de problema e de mquina. no domnio de soluo que as estruturas de dados de alto nvel e os algoritmos so afetados.

Estruturas de Dados

JEDITM

3. Tipo de Dado, Tipo de Dado Abstrato e Estrutura de Dados


Tipo de dado (data type) refere-se classificao do dado que um atributo pode assumir, armazenar ou receber em uma linguagem de programao e para a qual as operaes so automaticamente fornecidas. Em Java, os dados primitivos so: Palavra-chave Descrio byte short int long float double char boolean Inteiro do tamanho de um byte Inteiro curto Inteiro Inteiro longo Ponto flutuante de preciso simples Ponto flutuante de preciso dupla Um nico caractere Valor booleano (verdadeiro ou falso)
Tabela 1: Dados primitivos

Tipo de dado abstrato (Abstract Data Type ADT) um modelo matemtico contendo uma coleo de operadores. Ele especifica um tipo de dado armazenado, o que a operao faz, mas no como feito. Um ADT pode ser expresso por uma interface que contm apenas uma lista de mtodos. Por exemplo, esta uma interface para a stack ADT: public interface Stack{ public int size(); // retorna o tamanho da stack public boolean isEmpty(); // verifica se est vazia public Object top() throws StackException; public Object pop() throws StackException; public void push(Object item) throws StackException; } Estrutura de dados a implementao de um TDA em termos de tipos de dados ou outras estruturas de dados. Uma estrutura de dados modelada atravs de classes. Classes especificam como as operaes so executadas. Para implementar um TDA como uma estrutura de dados, uma interface implementada atravs de uma classe. Abstrao e representao ajudam-nos a entender os princpios por detrs dos grandes sistemas de software. Encapsulamento de informao pode ser utilizada junto com abstrao para particionar um sistema grande em subsistemas menores com interfaces simples que so mais fceis de entender e utilizar.

Estruturas de Dados

JEDITM

4. Algoritmo
Algoritmo um conjunto finito de instrues que, se seguidas corretamente, completam uma determinada tarefa. Possui cinco importantes propriedades: finito, definido, entrada, sada e efetivo. Finito quer dizer que um algoritmo sempre ter um fim aps um nmero finito de passos. Definido a garantia de que todos os passos do algoritmo foram precisamente definidos. Por exemplo: dividir por um nmero x no suficiente. O nmero x deve ser precisamente definido, ou seja, x deve ser inteiro e positivo. Entrada o domnio do algoritmo que pode ser nenhum (zero) ou vrios. Sada o conjunto de um ou mais resultados que tambm chamado de alcance do algoritmo. Efetivo a garantia de que todas as operaes do algoritmo so suficientemente simples de maneira que tambm possam, a princpio, ser executadas, em um tempo exato e finito, por uma pessoa utilizando papel e caneta. Considere o seguinte exemplo: public class Minimum { public static void main(String[] args) { int a[] = { 23, 45, 71, 12, 87, 66, 20, 33, 15, 69 }; int min = a[0]; for (int i = 1; i < a.length; i++) { if (a[i] < min) min = a[i]; } System.out.println("The minimun value is: " + min); } } A classe acima obtm o valor mnimo de um array de inteiros. No h entrada de dados por parte do usurio uma vez que o array j est pronto dentro da classe. Para cada propriedade de entrada e sada cada passo da classe precisamente definido; neste ponto esta poder ser definida. A declarao do lao for e suas respectivas sadas tero um nmero finito de execuo. Logo, a propriedade finito satisfeita. E quando executado, a classe retornar o valor mnimo entre os valores do array, e por isso dito efetivo. Todas as propriedades devem ser garantidas na construo de um algoritmo.

Estruturas de Dados

JEDITM

5. Mtodos de Endereamento
Na criao de uma estrutura de dados importante definir como acessar estes dados. Isto determinado pelo mtodo de acesso a dados. Existem dois tipos de mtodos de endereamento mtodo calculado e mtodo de endereamento computado e por link.

5.1. Mtodo de Endereamento Computado


O mtodo de endereamento computado utilizado para acessar os elementos de uma estrutura em um espao pr-alocado. essencialmente esttico. Um array, por exemplo: int x[] = new int[10]; Um item de dado pode ser acessado diretamente pelo ndice de onde o dado est armazenado.

5.2. Mtodo de Endereamento por Link


Este mtodo de endereamento fornece um mecanismo de manipulao dinmica de estruturas, onde o tamanho e a forma no so conhecidos de antemo, ou que so alterados durante a execuo. O importante para este mtodo o conceito de node contido nestes dois campos: INFO e LINK.

Em Java: public class Node { public Object info; public Node link; public info } public info link } } Node(Object o) { = o;

Figura 1: Estrutura de node

Node(Object o, Node n) { = o; = n;

5.2.1. Alocao de ligao: O Pool de Memria


O pool de memria a fonte dos nodes, onde so construdas as estruturas de ligao. Tambm so conhecidas como lista de espaos disponveis (ou nodes) ou simplesmente lista disponvel:

Estruturas de Dados

JEDITM Figura 2: Lista Disponvel

A seguir uma classe Java chamada AvailList: public class AvailList { private Node head; public AvailList() { head = null; } public AvailList(Node n){ head = n; }

Criando uma lista disponvel atravs de uma simples declarao: AvailList avail = new AvailList();

5.2.2. Dois Procedimentos Bsicos


Os dois procedimentos bsicos que manipulam a lista disponvel so getNode e setNode, que obtm e retornam um node, respectivamente. O mtodo seguinte na classe AvailList obtm um node da lista disponvel: public Node getNode() { return head; }

Figura 3: Obtm um node

enquanto o mtodo a seguir na classe Avail retorna um node para a lista disponvel: public void setNode(Node n) { n.link = head.link; // Adiciona o novo node no incio da lista disponvel head.link = n; }

Estruturas de Dados

JEDITM

Figura 4: Retorna um node

Os dois mtodos poderiam ser usados por estruturas de dados que usam alocao de ligao para pegar os nodes e retorn-los para o pool de memria. E como teste final teremos a seguinte classe: public class TestNodes { public static void main(String [] args) { Node n1 = new Node("1"); Node n2 = new Node("2", n1); Node n3 = new Node("3", n2); Node n4 = new Node("4", n3); AvailList avail = new AvailList(n4); System.out.println(avail.getNode().info); System.out.println(avail.getNode().link.info); System.out.println(avail.getNode().link.link.info); System.out.println(avail.getNode().link.link.link.info); } }

Estruturas de Dados

10

JEDITM

6. Funes Matemticas
Funes matemticas so teis na criao e na anlise de algoritmos. Nesta seo, algumas das funes mais bsicas e mais comumente usadas e suas propriedades sero mostradas. Floor de x o maior inteiro menor que ou igual a x, onde x um nmero real qualquer. Notao: x ex. 3.14 = 3 1/2 = 0 -1/2 = - 1

Ceil de x o menor inteiro maior que ou igual a x, onde x um nmero real qualquer. Notao : x ex. 3.14 = 4 1/2 = 1 -1/2 = 0

Mdulo - Dados quaisquer dois nmeros reais x e y, x mod y definido como x mod y ex. =x =x-y* x/y se y = 0 se y <> 0

10 mod 3 = 1 24 mod 8 = 0 -5 mod 7 = 2

6.1. Identidades
O que segue so identidades relacionadas s funes matemticas definidas acima: x=x se e somente se x um inteiro x>x se e somente se x no um inteiro - x = - x x + y <= x + y x = x + x mod 1 z ( x mod y ) = zx mod zy

Estruturas de Dados

11

JEDITM

7. Complexidade de Algoritmos
Diversos algoritmos podem ser criados para resolver um nico problema. Estes algoritmos podem variar no modo de obter, processar e dar sada nos dados. Com isso, eles podem ter diferena significativa em termos de performance e utilizao de memria. importante saber como analisar os algoritmos, e saber como medir a eficincia dos algoritmos ajuda bastante no processo de anlise.

7.1. Eficincia de Algoritmos


A eficincia dos algoritmos medida atravs de dois critrios: utilizao de espao e eficincia de tempo. Utilizao de espao a quantidade de memria requerida para armazenar dados enquanto eficincia de tempo a quantidade de tempo gasta para processar os dados. Antes de podermos execuo. O tempo um dado algoritmo. execuo, usamos a medir a eficincia de tempo de um algoritmo, temos que obter o tempo de de execuo a quantidade de tempo gasto para se executar as instrues de Ele depende do computador (hardware) sendo usado. Para exibir o tempo de seguinte notao:

T(n), onde T a funo e n o tamanho da entrada. Existem vrios fatores que afetam o tempo de execuo. Eles so: Tamanho da entrada Tipo da instruo Velocidade da mquina Qualidade do cdigo-fonte da implementao do algoritmo Qualidade do cdigo de mquina gerado pelo compilador

7.2. A Notao Big-O


Embora T(n) fornea a quantidade real de tempo na execuo de um algoritmo, mais fcil classificar as complexidades de algoritmos utilizando uma notao mais abrangente, a notao Big-O (ou simplesmente O). T(n) cresce a uma taxa proporcional a n e dessa forma T(n) dita como tendo ordem de magnitude n denotada pela notao O: T(n) = O(n) Esta notao usada para descrever a complexidade de tempo ou espao de um algoritmo. Ela fornece uma medida aproximada do tempo de computao de um algoritmo para um grande nmero de dados de entrada. Formalmente, a notao O definida como: g(n) = O (f(n)) se existem duas constantes c e n0 tais que | g(n) | <= c * | f(n) | para todo n >= n0 A seguir temos exemplos de tempos de computao sobre anlise de algoritmos: Big-O O(1) O(log2n) O(n) O(n log2n) O(n2) O(n )
3

Descrio Constante Logartmica Linear Quadrtica Cbica

Algoritmo Busca Binria Busca Seqencial Heapsort Insero Ordenada Algoritmo de Floyd

Estruturas de Dados

12

JEDITM

Big-O O( 2 )
n

Descrio Exponencial

Algoritmo

Tabela 2: Tempos de computao sobre anlise de algoritmos

Para tornar clara a diferena, vamos efetuar a comparao baseada no tempo de execuo onde n=100000 e a unidade de tempo = 1 mseg: F(n) log2n n n log2n n n
2 3

Tempo de Execuo 19.93 microssegundos 1.00 segundos 19.93 segundos 11.57 dias 317.10 sculos Eternidade
Tabela 3: Tempo de execuo

2n

7.3. Operaes sobre a Notao O


1. Regra para Adio Suponha que T1(n) = O( f(n) ) e T2(n) = O( g(n) ). Ento, t(n) = T1(n) + T2(n) = O( max( f(n), g(n) ) ). Prova: Por definio da notao O, T1(n) c1 f(n) para n n1 e T2(n) c2 g(n) para n n2. Seja n0 = max(n2, n2). Ento T1(n) + T2(n) c1 f(n) + c2 g(n) (c1 + c2) max(f(n),g(n)) c max ( f(n), g(n) ) n n0. n n0. n n0.

Sendo assim, T(n) = T1(n) + T2(n) = O( max( f(n), g(n) ) ). Por exemplo, 1. T(n) = 3n3 + 5n2 = O(n3) 2. T(n) = 2n + n4 + nlog2n = O(2n) 2. Regra para Multiplicao Suponha que T1(n) = O( f(n) ) e T2(n) = O( g(n) ). Ento, T(n) = T1(n) * T2(n) = O( f(n) * g(n) ). Por exemplo, considere o algoritmo abaixo: for (int i=1; i < n-1; i++) for (int i=1; i <= n; i++) // as iteraes so executadas O(1) vezes J que as iteraes no lao mais interno so executadas:

Estruturas de Dados

13

JEDITM

n + n-1 + n-2 + ... + 2 + 1 vezes,


ento n(n+1)/2 = n2/2 + n/2 = O(n2) Exemplo: Considere o trecho de cdigo abaixo: for (i=1; i <= n, i++) for (j=1; j <= n, j++) // iteraes que so executados O(1) vezes J que as iteraes no lao mais interno sero executadas n + n-1 + n-2 + ... + 2 + 1 vezes, ento o tempo de execuo ser: n(n+1)/2 = n2/2 + n/2 = O(n2)

7.4. Anlise de Algoritmos


Exemplo 1: Revisitao Mnima public class Minimum { public static void main(String [] args) { int a[] = {23, 45, 71, 12, 87, 66, 20, 33, 15, 69}; int min = a[0]; for (int i = 0; i < a.length; i++) { if (a[i] < min) min = a[i]; } System.out.println("Minimun value is: " + min); } } No algoritmo, as declaraes de a e min tero tempos constantes. O tempo constante da sentena if no loop for sero executadas n vezes, onde n o nmero de elementos do array a. A ltima linha tambm ser executada em tempo constante. Linha 4 5 6 7 9 #Vezes executada 1 1 n+1 n 1

Tabela 4: Quantidade de execues por linha

Usando a regra para adio, temos: T(n) = 2n +4 = O(n)

Estruturas de Dados

14

JEDITM

J que g(n) <= c f(n) para n >= n0, ento 2n + 4 <= cn 2n + 4 <= c --------n 2 + 4/n <= c Assim c = 4 e n0 = 3. Seguem abaixo as regras gerais para se determinar o tempo de execuo de um algoritmo: Laos FOR Tempo de execuo da declarao dentro do lao FOR vezes o nmero de iteraes.

Laos FOR ANINHADOS A Anlise feita a partir do lao mais interior para fora. O tempo total de execuo de uma declarao dentro de um grupo de lao FOR o tempo de execuo da declarao, multiplicado pelo produto dos tamanhos de todos os laos FOR.

DECLARAES CONSECUTIVAS A declarao com o maior tempo de execuo.

Condicional IF/ELSE Quanto maior o tempo de execuo do teste, maior ser o tempo de execuo do bloco condicional.

Estruturas de Dados

15

JEDITM

8. Exerccios
a) Funes Piso, Teto e Mdulo. Compute para os valores resultantes: a) b) c) d) e) f) g) -5.3 6.14 8 mod 7 3 mod 4 5 mod 2 10 mod 11 (15 mod 9) + 4.3

b) Qual a complexidade de tempo do algoritmo com os seguintes tempos de execuo? a) b) c) d) 3n5 + 2n3 + 3n +1 n3/2+n2/5+n+1 n5+n2+n n3 + lg n + 34

c) Imagine que tenhamos duas partes em um algoritmo, sendo que a primeira parte toma T(n1)=n3+n+1, tempo para executar e a segunda parte toma T(n2) = n5+n2+n. Qual a complexidade do algoritmo, se a parte 1 e a parte 2 forem executadas uma de cada vez? d) Ordene as seguintes complexidades de tempo em ordem ascendente. 0(n log2 n) 0(1) 0(n2) 0(n3) 0(n) 0(nn) 0(log2 n) 0(2n) 0(n2 log2 n) 0(log2 log2 n)

e) Qual o tempo de execuo e a complexidade de tempo do algoritmo abaixo? void warshall(int A[][], int C[][], int n){ for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) A[i][j] = C[i][j]; for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) for (int k=1; k<=n; k++) if (A[i][j] == 0) A[i][j] = A[i][k] & A[k][j]; }

Estruturas de Dados

16

JEDITM

Parceiros que tornaram JEDITM possvel

Instituto CTS Patrocinador do DFJUG. Sun Microsystems Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas. Java Research and Development Center da Universidade das Filipinas Criador da Iniciativa JEDITM. DFJUG Detentor dos direitos do JEDITM nos pases de lngua portuguesa. Banco do Brasil Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM. Politec Suporte e apoio financeiro e logstico a todo o processo. Borland Apoio internacional para que possamos alcanar os outros pases de lngua portuguesa. Instituto Gaudium/CNBB Fornecimento da sua infra-estrutura de hardware de seus servidores para que os milhares de alunos possam acessar o material do curso simultaneamente.

Estruturas de Dados

17

Você também pode gostar