Qual o papel das estruturas de dados no processo de desenvolvimento de software?
Desde o sculo XVI o Homem tem procurado facilitar sua vida atravs de inveno de mecnicos para controlar operaes complexas. Blaise primeira calculadora mecnica para coleta de impostos do pai. Em computador digital o ENIAC (Electronic Numerical vlvulas eletrnicas, entretanto, era projetado para o clculo de trajetria balstica para o Exrcito dos Estados Unidos da Amrica. As mquinas modernas, porm, alm de realizar clculos armazenadoras e processadoras de informao pesquisando, transferindo e atualizando uma enorme quantidade de dados destas operaes necessita que os dados estejam bem armazenamento destes dados sejam rpidos e estruturas de dados e de algoritmos. As estruturas de dados so formas estes dados.
As estruturas de dados esto presentes em qualquer sistema computacional que precise acessar dados, por exemplo:
Os endereos mais recentes visitados por um browser na Internet quan forward; Editores de texto que revertem as Dados organizados em uma planilha eletrnica; Sistema de arquivos de Implementaes de microinstrues em CPU; Pesquisa atravs de ndices e
Como podemos perceber as estruturas de dados so usadas em todas as partes de um sistema computacional, como por exemplo a para buscar mtodos em uma classe, bus prioridade de um grupo de threads.
Alm de todas as aplicaes mostradas no esqueamos que um programa de computador formado de um algoritmo e dados.
Em resumo, uma Estrutura de Dados meio, por exemplo, de listas, pilhas, filas, rvores entre outras.
So utilizadas para resolverem problemas que se encontram
A) Armazenamento de Dados no mundo real
Uma ficha de pessoal, que descreve um ser humano real; Um registro de controle, que descreve a parte de um carro; Um registro de transao financeira de um item em um supermercado, descrevendo um cheque real feito para pagar uma conta em um supermercado.
B) Modelagem do Mundo Real
Uma Estrutura de Dados do tipo fila pode representar os clientes em uma fila de banco.
Universidade do Extremo Sul Catarinense Curso de Cincia da Computao Disciplina: 7532 - Estrutura de Dados I Professor: Gilberto Vieira da Silva gilbertovieirasilva@hotmail.com INTRODUO das estruturas de dados no processo de desenvolvimento de software? Desde o sculo XVI o Homem tem procurado facilitar sua vida atravs de inveno de mecnicos para controlar operaes complexas. Blaise Pascal (1623-1662), por primeira calculadora mecnica para coleta de impostos do pai. Em meados dos anos 40 surge o primeiro computador digital o ENIAC (Electronic Numerical Integrator and Computer). A funo deste colosso de 18.000 vlvulas eletrnicas, entretanto, era realizar uma grande carga de clculos matemticos, j que ele foi trajetria balstica para o Exrcito dos Estados Unidos da Amrica. As mquinas modernas, porm, alm de realizar clculos extremamente rpidos tambm armazenadoras e processadoras de informao. Elas esto constantemente armazenando, pesquisando, transferindo e atualizando uma enorme quantidade de dados complexos. A execuo otimizada a que os dados estejam bem organizados e que os destes dados sejam rpidos e eficientes, sendo assim, os computadores necessitam de boas algoritmos. As estruturas de dados so formas sistemticas de organizar e acessar As estruturas de dados esto presentes em qualquer sistema computacional que precise Os endereos mais recentes visitados por um browser na Internet quan ditores de texto que revertem as alteraes mais recentes; ados em uma planilha eletrnica; istema de arquivos de sistemas operacionais; es de microinstrues em CPU; esquisa atravs de ndices em um banco de dados relacional. as estruturas de dados so usadas em todas as partes de um sistema utacional, como por exemplo a JVM (Java Virtual Machine) da SUN que utiliza para buscar mtodos em uma classe, buscar objetos instanciados na memria ou para executar uma ordem de prioridade de um grupo de threads. Alm de todas as aplicaes mostradas no esqueamos que um programa de computador formado ma Estrutura de Dados uma organizao de dados na memria de um computador, por , de listas, pilhas, filas, rvores entre outras. So utilizadas para resolverem problemas que se encontram, por exemplo, nas seguintes situaes: A) Armazenamento de Dados no mundo real Uma ficha de pessoal, que descreve um ser humano real; Um registro de controle, que descreve a parte de um carro; Um registro de transao financeira de um item em um supermercado, descrevendo um cheque para pagar uma conta em um supermercado.
Uma Estrutura de Dados do tipo fila pode representar os clientes em uma fila de banco.
das estruturas de dados no processo de desenvolvimento de software? Desde o sculo XVI o Homem tem procurado facilitar sua vida atravs de inveno de dispositivos 1662), por exemplo, desenvolveu a meados dos anos 40 surge o primeiro Integrator and Computer). A funo deste colosso de 18.000 realizar uma grande carga de clculos matemticos, j que ele foi trajetria balstica para o Exrcito dos Estados Unidos da Amrica. extremamente rpidos tambm so Elas esto constantemente armazenando, analisando, complexos. A execuo otimizada organizados e que os mtodos de acesso e de eficientes, sendo assim, os computadores necessitam de boas sistemticas de organizar e acessar As estruturas de dados esto presentes em qualquer sistema computacional que precise armazenar e Os endereos mais recentes visitados por um browser na Internet quando se utiliza o back ou as estruturas de dados so usadas em todas as partes de um sistema utiliza-se de estruturas de dados car objetos instanciados na memria ou para executar uma ordem de Alm de todas as aplicaes mostradas no esqueamos que um programa de computador formado uma organizao de dados na memria de um computador, por nas seguintes situaes: Um registro de transao financeira de um item em um supermercado, descrevendo um cheque Uma Estrutura de Dados do tipo fila pode representar os clientes em uma fila de banco. Tipos Abstratos de Dados (TAD)
Um TAD uma estrutura que encapsula um conjunto de atributos (dados) e um conjunto de mtodos (operaes) que atuam sobre os dados encapsulados. Um TAD precisa ser abstrado de qualquer linguagem de programao. Toda operao a ser realizada sobre os dados em um TAD s poder ser executada atravs dos mtodos definidos na estrutura deste TAD. Sendo assim, um programa baseado em TAD dever conter algoritmos e estruturas de dados que implementem, em uma determinada linguagem de programao, os mtodos e as estruturas de dados dos TAD utilizados pelo programa. O conceito de TAD fornece fundamentos bsicos para a abordagem OO.
Todas as estruturas de dados podem ser analisadas por meio dos TADs (Tipos de Dados Abstratos).
Um TAD pode ser definido como um conjunto de valores e uma coleo de operaes que atuam sobre esses valores.
A idia base dos TADs possibilitar a percepo da separao do que fazer e como fazer.
A importncia da compreenso de um TAD o fato das Estruturas de Dados poderem ser estudadas do ponto de vista de serem TADs.
Por exemplo: A fila um TAD que possui uma seqncia finita de elementos do tipo T, com as seguintes operaes:
a) Criar a fila, deixando-a vazia; b) Testar a fila se est ou no vazia; c) Enfileirar um novo elemento no final da fila, desde que no esteja cheia; d) Retirar um elemento do incio da fila, desde que ela no esteja vazia; e) Consultar o incio da fila, desde que ela no esteja vazia.
Os TADs so construdos a partir dos tipos primitivos, estes agrupados por meio de tipos construdos e organizados em rotinas e funes.
Tipos primitivos:
Inteiro / int Real / float Lgico / bool Caracter / char
Para cada tipo primitivo definido um conjunto de operaes possveis.
Estrutura de Dados
Funo Funo dados dados
Tipos construdos (mecanismos):
Vetor
Em pseudocdigo: int vet[4];
Em C++: int vet[4];
0 1 2 3
Matriz
Em pseudocdigo: int mat[4][3];
Em C++: int mat[4][3];
0 1 2 3 0 1 2
Registros
Em pseudocdigo:
tipo reg { int cod; real peso; };
Declarao das variveis: reg cadastro;
reg banco[10];
Em C++: struct reg { int cod; float peso; };
Declarao das variveis:
reg cadastro;
reg banco[10];
Ponteiros
Em pseudocdigo: int *pidade;
Em C++: int *pidade;
Funes:
Em pseudocdigo:
prog soma int x, y, z;
leia x; leia y; z <- somaxy( x, y ) imprima A soma de x + y : , z;
fimprog
Em C++:
void soma( ) { int x, y, z;
cin>>x; cin>>y; z = somaxy(x,y); cout<<A soma de x + y :<<z; }
Em pseudocdigo:
int somaxy(int h, int j) { int l;
l <- h + j; retorne ( l ); }
Em C++: int somaxy(int h, int j) { int l; l = h + j; return( l ); }
Observaes: 1) A quantidade de parmetros no algoritmo chamador deve ser igual a quantidade de parmetros no algoritmo chamado. 2) Parmetro: meio de comunicao entre o A chamador, e o B chamado
Recursividade Um mtodo recursivo aquele que chama a si mesmo. Ele pode ser utilizado para resolver vrios problemas matemticos como a funo Fatorial e tambm Fibonacci, entre outros. Em programas complexos e reais, a recursividade utilizada para resolver problemas onde em uma data situao identifica-se que o problema a ser resolvido em um determinado ponto possui os mesmos critrios daquele que se encontra em execuo.
Exemplo: Fatorial 5! = 5 * 4 * 3 * 2 * 1 (resultado = 120) Funo que calcula o fatorial utilizando um lao de repetio: int calculaFatorialFOR(int valorFatorar){ int fat = 1; for(int n = valorFatorar; n > 0; n--){ fat = fat * n; } return fat; }
Funo que calcula o fatorial utilizando recurso: int calculaFatorialRecursivo(int valorFatorar){ int fat; if(valorFatorar == 0){ fat = 1; }else{
int n = valorFatorar - 1; int r = calculaFatorialRecursivo(n); fat = valorFatorar * r; } return fat; }
Uma exigncia importante para que um algoritmo recursivo esteja correto que ele no gere uma seqncia infinita de chamadas a si mesmo. Evidentemente, todo algoritmo que realmente gere tal seqncia pode no terminar nunca. Para, no mnimo, um argumento ou grupo de argumentos, a funo recursiva f deve ser definida de modo a no envolver f. Dever existir uma "sada" da seqncia de chamadas recursivas. No exemplo apresentado, perceba que a cada chamada recursiva do mtodo calculaFatorialRecursivo a varivel passada por parmetro e subtrada em -1, o que leva o algoritmo a parar quando o valor fatorar for zero.
ALGORTIMOS DE BUSCA E ORDENAO
BUSCA BINRIA possvel que voc esteja com uma impresso errada de que a recursividade uma ferramenta muito til para definir funes matemticas, mas no tem influncia sobre atividades de computao mais prticas. O prximo exemplo ilustra uma aplicao de recursividade sobre uma das atividades mais conhecidas na computao: a busca. Imagine um vetor de elementos no qual os objetos foram posicionados em determinada ordem, ou seja, possuem um critrio de ordenao, como por exemplo, uma lista de inteiros de estar em ordem crescente ou decrescente. Em um exemplo mais prtico, um dicionrio ou um catlogo de telefones pode ser considerado um vetor cujos elementos esto em ordem alfabtica. O arquivo da folha de pagamento de uma empresa pode estar classificado pela ordem do CPF dos funcionrios. Suponha que esse vetor exista e desejemos localizar determinado elemento dentro dele. Por exemplo, queremos pesquisar um nome num catlogo de telefones, uma palavra num dicionrio ou determinado empregado num arquivo de pessoal. O processo usado para encontrar tal elemento chamado busca.
Como a busca uma atividade muito conhecida na computao, queremos descobrir um mtodo eficiente para execut-la. Talvez o mtodo de busca mais simples seja o da busca seqencial ou linear, no qual cada item do vetor examinado por vez e comparado ao item que se est procurando, at ocorrer uma coincidncia. Se a lista no estiver organizada ou se foi formada a esmo, possvel que a busca linear seja a nica maneira de localizar algo dentro dela (a menos, evidentemente, que a lista seja primeiro reorganizada). Entretanto, um mtodo desse tipo jamais seria usado para localizar um nome num catlogo de telefones. Em vez disso, o catlogo seria aberto numa pgina qualquer e os nomes pertencentes a essa pgina seriam examinados. Como os nomes encontram-se em ordem alfabtica, esse exame determinaria se a busca deve continuar na primeira ou segunda metade do catlogo.
Agora, apliquemos essa idia pesquisa em vetores. Mtodo de desenvolvimento do algoritimo Se um vetor contiver somente um elemento, o problema ser simples. Caso contrrio, compare o item sendo procurado ao item posicionado no meio do vetor. Se forem iguais, a busca terminou com sucesso. Se o elemento do meio for maior que o elemento sendo procurado, o processo de busca ser repetido na primeira metade do vetor (porque esse item deve estar na primeira metade); caso contrrio, o processo ser repetido na segunda metade. Observe que, toda vez que uma comparao feita, o nmero de elementos a pesquisar cortado pela metade. Para os vetores grandes, esse mtodo superior busca seqencial na qual cada comparao reduz o nmero de elementos a pesquisar em apenas um. Por causa da diviso do vetor a ser pesquisado em duas partes iguais, esse mtodo de busca chamado busca binria.
Observe que definimos de modo muito natural uma busca binria recursivamente. Se o item sendo procurado no for igual ao elemento do meio do vetor, as instrues sero pesquisar um subvetor usando o mesmo mtodo. Dessa forma, o mtodo de busca definido em termos de si mesmo com um vetor menor como entrada. Temos certeza de que o processo terminar porque os vetores de entrada ficaro cada vez menores, e a busca em um vetor de um nico elemento definida no recursivamente, uma vez que o elemento do meio desse vetor seu nico elemento.
Exemplo de um mtodo de busca binria em C. int buscaBinaria_2(int vetor[], int valorProcurado, int inicio, int fim) { countChamadas++; if(inicio > fim){ //O valor procurado no foi encontrado return -1; }
int meio = (inicio + fim) / 2;
if(vetor[meio] == valorProcurado){ return meio; }else if (valorProcurado < vetor[meio]){ //procura na primeira parte (menor) //inicio -->> no deve ser alterado //fim -->> meio -1 porque a posio equivalente a meio j foi comparada
fim = meio -1; return buscaBinaria_2(vetor, valorProcurado, inicio, fim);
}else { //procura na segunda parte (maior) inicio = meio + 1; //fim -->> no ser alterado return buscaBinaria_2(vetor, valorProcurado, inicio, fim); }
//valor no encontrado return -1; }
ORDENAO / CLASSIFICAO
Ordenar corresponde ao processo de rearranjar um conjunto de objetos em ordem ascendente ou descendente. O objetivo principal da ordenao facilitar a recuperao posterior de itens do conjunto ordenado. A atividade de colocar as coisas em ordem est presente na maioria das aplicaes em que os objetos armazenados tm de ser pesquisados e recuperados.
A disciplina de Classificao de dados e anlise de suas complexidades ir apresentar com maiores detalhes estes algoritmos.
Mtodo de ordenao BubbleSort (Bolha)
o mtodo mais simples em termos de implementao, porm o menos e eficiente. A idia principal do algoritmo percorrer o vetor n - 1 vezes, a cada passagem fazendo flutuar para o inicio o menor elemento da seqncia. Essa movimentao, ilustrada na figura abaixo, lembra a forma como as bolhas procuram seu prprio nvel, por isso o nome do algoritmo. Seu uso no recomendado para vetores com muitos elementos.
Exemplo de ordenao em C
for(int i = 0; i < NUM_ELM; i++){ //percorre a lista at o penltimo elemento for(int j = 0; j < NUM_ELM - 1; j++){ int elAtual = vetorDesordenado[j]; int elProx = vetorDesordenado[j + 1]; if(elAtual > elProx){
//altera o elemento atual, informando o prximo vetorDesordenado[j] = elProx;
//altera o prximo elemento, informando o atual vetorDesordenado[j + 1] = elAtual; } } }