apostila de estrutura de dados - c#
TRANSCRIPT
-
5/28/2018 Apostila de Estrutura de Dados - C#
1/41
1
Apostila de Estrutura de Dados e Algoritmos em C#
Prof. Ms. Eduardo R. Marcelino
2009ndice
Tipos Abstratos de Dados (TAD)...................................................................................................................... 2Tipos de Dados Concretos (TDC)...................................................................................................................... 2Limitaes de uma implementao.................................................................................................................... 2Complexidade Computacional........................................................................................................................... 4PILHAS ............................................................................................................................................................ 6Exerccios sobre Pilhas.................................................................................................................................... 11FILAS............................................................................................................................................................. 12LISTAS .......................................................................................................................................................... 15Exerccios Sobre Listas, Filas e Pilhas............................................................................................................. 18Apontadores ou Ponteiros............................................................................................................................... 19
Pilhas utilizando apontadores.......................................................................................................................... 20rvores ........................................................................................................................................................... 23Caminhamento em rvores. ............................................................................................................................ 24rvores Binrias ............................................................................................................................................. 25rvores Binrias de Busca .............................................................................................................................. 26Implementao de uma rvore Binria de Busca em C# ................................................................................. 28Listas Simplesmente Encadeadas .................................................................................................................... 31Listas Duplamente Encadeadas .......................................................................................................................31Listas circulares .............................................................................................................................................. 32Grafos ............................................................................................................................................................. 33Recursividade ou Recurso ............................................................................................................................. 34Ordenao....................................................................................................................................................... 36
Pesquisa em Memria Primria .......................................................................................................................40
Referncias bsicas para o material desta apostila:
[1]PEREIRA, Silvio do Lago. Estruturas de dados fundamentais Conceitos e aplicaes. So Paulo:rica, 1996.
[2]ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Pascal e C, 2. ed. So Paulo:Pioneira Thomson Learning, 2005.
[3]GOODRICH, M.T., TAMASSIA, R. Estruturas de Dados e Algoritmos em Java, 2. ed. Porto Alegre:Bookman, 2002.
[4] FORBELLONE, A.L.V.,EBERSPACHER, H.F., Lgica de Programao A Construo de Alboritmos eEstrutura de Dados. 2. ed. So Paulo: 2000. Makron Books.
-
5/28/2018 Apostila de Estrutura de Dados - C#
2/41
2
TTiippoossAAbbssttrraattoossddeeDDaaddooss((TTAADD))
formado por um conjunto de valores e por uma srie de funes que podem ser aplicadas sobre estesvalores. Funes e valores, em conjunto, constituem um modelo matemtico que pode ser empregadopara modelar e solucionar problemas do mundo real, servido para especificar as caractersticas
relevantes dos objetos envolvidos no problema, de que forma eles se relacionam e como podem sermanipulados. O TAD define o quecada operao faz, mas no comoo faz.
EX: TADpara uma PILHA:Empilha (valor) Insere um valor no topo da pilha
Entrada: valor. Sada: nenhuma.
Desempilha - Retira um valor do topo da pilha e o devolve.Entrada: nenhuma. Sada: valor.
TTiippoossddeeDDaaddoossCCoonnccrreettooss((TTDDCC))
Sendo o TAD apenas um modelo matemtico, sua definio no leva em considerao como os valoressero representados na memria do computador, nem se preocupa com o tempo que ser gasto paraaplicar as funes (rotinas) sobre tais valores. Sendo assim, preciso transformar este TAD em um tipode dados concreto. Ou seja, precisamos implementar (programar) as funes definidas no TAD. durante o processo de implementao que a estrutura de armazenamento dos valores especificada, eque os algoritmos que desempenharo o papel das funes so projetados.
Tipo Abstrato de Dados Implementao Tipo de Dados Concreto
LLiimmiittaaeessddeeuummaaiimmpplleemmeennttaaoo
importante notar que nem todo TAD pode ser implementado em toda sua generalidade. Imagine por
exemplo um TAD que tenha como funo mapear todos os nmeros primos. Claramente, este um tipode dados abstrato que no pode ser implementado universalmente, pois qualquer que seja a estruturaescolhida para armazenar os nmeros primos, nunca conseguiremos mapear num espao limitado dememria um conjunto infinito de valores.Frequentemente, nenhuma implementao capaz de representar um modelo matemticocompletamente; assim, precisamos reconhecer as limitaes de uma implementao particular. Devemoster em mente que podemos chegar a diversas implementaes para um mesmo tipo de dados abstrato,cada uma delas apresentando vantagens e desvantagens em relao s outras. O projetista deve sercapaz de escolher aquela mais adequada para resolver o problema especfico proposto, tomando comomedidas de eficincia da implementao, sobretudo, as suas necessidades de espao dearmazenamentoe tempo de execuo. Abaixo, veja o quadro com a complexidade de alguns jogos:
Damas- 5 x 10 na potncia 20
Cerca de500.000.000.000.000.000.000posies possveis.S em 1994 um programa foicapaz de vencer um campeomundial. Em 2007 o jogo foi"solucionado" a ponto de serpossvel um programa imbatvel
Poker americano (Texas
holdem)- 10 na potncia 18Cerca de1.000.000.000.000.000.000posies possveis.O campeonato mundial dehumanos contra mquinascomeou nesta semana, comfavoritismo para os humanos.Um programa imbatvel podesurgir nos prximos anos
Xadrez- 1 x 10 na potncia 45
Cerca de1.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000 posies possveis.Em 1997, um supercomputador venceu umcampeo mundial depois de penar muito. Paracriar um programa imbatvel, porm, seriapreciso de um computador quntico, umamquina que por enquanto s existe na cabeados cientistas.
-
5/28/2018 Apostila de Estrutura de Dados - C#
3/41
3
Trecho da entrevista com JONATHAN SCHAEFFER, pesquisador na rea de inteligncia artificial.
Disponvel em:
http://circuitointegrado.folha.blog.uol.com.br/arch2007-07-22_2007-07-28.html#2007_07-25_07_57_02-11453562-0
FOLHA - Voc pretende continuar trabalhando no problema para chegar ao que os matemticoschamam de uma "soluo forte", mapeando cada uma das posies do jogo?
SCHAEFFER -No, por uma boa razo. Pondo em perspectiva, vemos que as damas possuem 5 x 10 napotncia 20 posies. Muitas pessoas tm computadores com discos rgidos de 100 gigabytes [10 napotncia 11 bytes]. Se voc tiver uma mquina "hiper-super" voc deve ter um disco de 1 terabyte [10na potncia 12]. Se voc for a um dos 50 supercomputadores mais poderosos do mundo, voc encontrarum disco de 1 petabyte [10 na potncia 15]. Um disco rgido desses custa cerca de US$ 1 milho. Asdamas tm 10 na potncia 20 posies. Para poder gravar a soluo forte do problema eu precisaria de
500 mil petabytes _o que custaria US$ 500 bilhes hoje. Acho que no muito factvel. Se euprocessasse a soluo, eu simplesmente no teria onde salv-la.
Referncias:PEREIRA, Silvio do Lago. Estruturas de dados fundamentais Conceitos e aplicaes. SoPaulo: rica, 1996.
-
5/28/2018 Apostila de Estrutura de Dados - C#
4/41
4
CCoommpplleexxiiddaaddeeCCoommppuuttaacciioonnaall
Fonte: http://www.dca.fee.unicamp.br/~ting/Courses/ea869/faq1.html
O que um problema computvel?
Um problema computvel se existe um procedimento que o resolve em um nmero finito de passos, ou seja se existeum algoritmo que leve sua soluo.Observe que um problema considerado "em princpio" computvel pode no ser tratvel na prtica, devido s limitaes
dos recursos computacionais para executar o algoritmo implementado.
Por que importante a anlise de complexidade computacional de um algoritmo?
A complexidade computacional de um algoritmo diz respeito aos recursos computacionais - espao de memria e tempode mquina - requeridos para solucionar um problema.Geralmente existe mais de um algoritmo para resolver um problema. A anlise de complexidade computacional portanto fundamental no processo de definio de algoritmos mais eficientes para a sua soluo. Apesar de parecercontraditrio, com o aumento da velocidade dos computadores, torna-se cada vez mais importante desenvolveralgoritmos mais eficientes, devido ao aumento constante do "tamanho" dos problemas a serem resolvidos.
O que entendemos por tamanho de um problema?
O tamanho de um problema o tamanho da entrada do algoritmo que resolve o problema. Vejamos os seguintesexemplos:
A busca em uma lista de N elementos ou a ordenao de uma lista de N elementos requerem mais operaes medidaque N cresce;O clculo do fatorial de N tem o seu nmero de operaes aumentado com o aumento de N;
A determinao do valor de F_N na sequncia de Fibonacci F_0, F_1, F_2, F_3, ... envolve uma quantidade de adiesproporcional ao valor de N.
{encont r ando o mai or nmer o}mai or : = numer o[ 1] ; 1 operaof or cont ador : = 2 t o 10 do / / n oper aes
i f numer o[ cont ador] > mai or t hen / / 1 operaomai or : = numer o[contador ] ; / / 1 operao
A complexidade dada por n elementos (o elemento que determina a taxa de crescimento do algoritmo acima)ou O(n) (linear)
For T: =1 t o 100 do / / n operaesFor X : = 1 t o 100 do / / n operaes
Wr i t el n( T, X) ; / / 1 oper ao
A complexidade dada por n2 (T*X) elementos ou O(n2) (quadrdico)
-
5/28/2018 Apostila de Estrutura de Dados - C#
5/41
5
Funes limitantes superiores mais conhecidas:
Melhor PiorConstante Logartmica Linear Quadrtica Polinomial Exponencial
O(1) O(log n) O(n) O(n2) O(nk) com k>=1 O(an) com a > 1
Crescimento de vrias funes
n log n n n2 2n2 1 2 4 44 2 4 16 168 3 8 64 25616 4 16 256 65.53632 5 32 1.024 4.294.967.29664 6 64 4.096 1,84 x 1019128 7 128 16.384 3,40 x 1038
256 8 256 65.536 1,18 x 1077
512 9 512 262.144 1,34 x 101541024 10 1024 1.048.576 1,79 x 10308
-
5/28/2018 Apostila de Estrutura de Dados - C#
6/41
6
PPIILLHHAASS(http://pt.wikibooks.org/wiki/Estrutura_de_Dados_II/Pilhas)
Uma pilha uma estrutura de dados onde em todas as inseres, retiradas e acessos ocorremapenas em um dos extremos (no caso, em seu topo).
Os elementos so removidos na ordem inversa daquela em que foram inseridos de modo que oltimo elemento que entra sempre o primeiro que sai, por isto este tipo de estrutura
chamada LIFO(Last In - First Out).O exemplo mais prtico que costuma utilizar-se para entender o processo de pilha como uma pilhade livros ou pilha de pratos, no qual ao se colocar diversos elementos uns sobre os outros, sequisermos pegar o livro mais abaixo deveremos tirar todos os livros que estiverem sobre ele.
Uma pilha geralmente suporta as seguintes operaes bsicas:
TOP (topo): acessa-se o elemento posicionado no topo da pilha; PUSH (empilhar): insere um novo elemento no topo da lista; POP (desempilhar): remove o elemento do topo da lista. ISEmpty (vazia?): indica sea pilha est vazia. Size (tamanho): retorna a quantidade de elementos da pilha.
Exemplo de utilizao de uma pilha:
Operao Pilha (topo) ----- (base) Retorno Tamanho da PilhaEmpilhar(1) 1 1
Vazia False 1Empilhar(2) 2,1 2Topo 2,1 2 2Empilhar(7) 7,2,1 3Tamanho 7,2,1 3 3Desempilhar 2,1 7 2Desempilhar 1 2 1Desempilhar 1 0
Vazia True 0
Topo da pilha: ltimoelemento inserido
Base da pilha: primeiroelemento inserido
EmpilharDesempilhar
Tamanho = 5
-
5/28/2018 Apostila de Estrutura de Dados - C#
7/41
7
// Esta pilha armazena em cada posio da pilha um dado do tipo String.
usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Li nq;usi ng Syst em. Text ;
namespace Pi l haEst at i ca{
/ / def i ni o da cl asse Pi l hapubl i c cl ass Pi l ha{
pri vat e const i nt CAPACI DADE = 10; / / def i ne o t amanho maxi mo dest a uma pi l ha.pri vat e s t r i ng[ ] dados = new s t r i ng[ CAPACI DADE] ; / / vet or par a guar dar os dados da pi l ha.pri vat e i nt t opo = - 1; / / var i vel que i r i ndi car a posi o no vet or do t opo da pi l ha.
/ / est e mtodo ret or na tr ue se a pi l ha est i ver vazi apubl i c bool vazi a( ){
return t amanho( ) == 0;}
/ / est e mtodo i nf or ma o t amanho da pi l hapubl i c i nt t amanho( ){
return t opo + 1;}
/ / est e mtodo empi l ha um val or st r i ng na pi l hapubl i c voi d empi l ha( s t r i ng p_val or){
i f ( t amanho( ) == CAPACI DADE){
t opo++;dados[ t opo] = p_val or ;
}el se{
Consol e. Wr i t eLi ne( "A PI LHA ESTA CHEI A! ! ! " ) ;}
}
/ / est e mtodo desempi l ha um val or da pi l hapubl i c s t r i ng desempi l ha()
{ i f ( vazi a() == true){
Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;return "" ;
}el se{
topo--;return dados[ t opo + 1] ;
}}
/ / est e mtodo devol ve o val or que est no topopubl i c s t r i ng r etornat opo( ){
i f ( vazi a() == true){Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;return "" ;
}el se{
return dados[ t opo] ;}
}}
-
5/28/2018 Apostila de Estrutura de Dados - C#
8/41
8
/ / cl asse do pr ogr ama pr i nci pal .c l ass Pi l ha_Vetor{
s ta t i c voi d Mai n(s t r i ng[] args){
i nt opcao;st r i ng val or ;Pi l ha mi nhaPi l ha = new Pi l ha( ) ; / / cri a uma i nst nci a da cl asse pi l ha!
do{
Consol e. Wr i t e( "\ n\ n Escol ha: 1- > empi l ha 2- >desempi l ha " + " 3- >t opo 4- > t amanho 9-> sai r : " ) ;
opcao = Convert . ToI nt 32( Consol e. ReadLi ne( ) ) ;
i f ( opcao == 1){
Consol e. Wri t e( ">>Di gi t e o val or que desej a empi l har : ") ;val or = Consol e. ReadLi ne( ) ;mi nhaPi l ha. empi l ha(val or ) ;
}el se i f ( opcao == 2){
val or = mi nhaPi l ha. desempi l ha() ;Consol e. Wr i t eLi ne( ">>Desempi l hado: {0} \ n\ n", val or ) ;
}el se i f ( opcao == 3){
val or = mi nhaPi l ha.r et or natopo( ) ;Consol e. Wr i t eLi ne( ">>Val or no t opo: {0} \ n\ n" , va lo r ) ;
}el se i f ( opcao == 4){
Consol e. Wr i t eLi ne( ">>Tamanho da pi l ha: {0}" , mi nhaPi l ha. t amanho() ) ;}el se i f ( opcao == 9){
/ / sai do pr ograma}
}whi l e (opcao ! = 9) ;
}
}
}
-
5/28/2018 Apostila de Estrutura de Dados - C#
9/41
9
// Esta pilha armazena em cada posio da pilha um dado heterogneo( cdigo e nome)
usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Li nq;usi ng Syst em. Text ;
namespace Pi l haEst at i ca{
/ / Est r ura par a armazenar dados heterogneos no vet or .publ i c struct regi str o{
publ i c i nt codi go;publ i c s t r i ng nome;};
/ / def i ni o da cl asse Pi l hapubl i c cl ass Pi l ha{
pri vat e const i nt CAPACI DADE = 10; / / def i ne o t amanho maxi mo dest a uma pi l ha.pri vat e regi st ro[ ] dados = new regi st r o[ CAPACI DADE] ; / / vet or par a guar dar os dados da pi l ha.pri vat e i nt t opo = - 1; / / var i vel que i r i ndi car a posi o no vet or do t opo da pi l ha.
/ / est e mtodo ret or na tr ue se a pi l ha est i ver vazi apubl i c bool vazi a( ){
return t amanho( ) == 0;}
/ / est e mtodo i nf or ma o t amanho da pi l hapubl i c i nt t amanho( ){
return t opo + 1;}
/ / est e mtodo empi l ha um val or st r i ng na pi l hapubl i c voi d empi l ha( regi st ro p_val or ){
i f ( t amanho( ) == CAPACI DADE){
t opo++;dados[ t opo] = p_val or ;
}el se
{ Consol e. Wr i t eLi ne( "A PI LHA ESTA CHEI A! ! ! " ) ;}
}
/ / est e mtodo desempi l ha um val or da pi l hapubl i c regi st ro desempi l ha( ){
i f ( vazi a() == true){
Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;
regi st ro nada;nada. codi go = 0;nada. nome = "" ;return nada;
}el se{
topo--;return dados[ t opo + 1] ;
}}
/ / est e mtodo devol ve o val or que est no topopubl i c regi st ro r et ornat opo( ){
i f ( vazi a() == true){
-
5/28/2018 Apostila de Estrutura de Dados - C#
10/41
10
Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;regi st ro nada;nada. codi go = 0;nada. nome = "";return nada;
}el se{
return dados[ t opo] ;}
}}
/ / cl asse do progr ama pr i nci pal .c l ass Pi l ha_Vetor{
s ta t i c voi d Mai n(s t r i ng[] args){
i nt opcao;regi st ro dado;Pi l ha mi nhaPi l ha = new Pi l ha( ) ; / / cri a uma i nst nci a da cl asse pi l ha!
do{
Consol e. Wr i t e( "\ n\ n Escol ha: 1- > empi l ha 2- >desempi l ha " + " 3- >t opo 4- > t amanho 9-> sai r : " ) ;
opcao = Convert . ToI nt 32( Consol e. ReadLi ne( ) ) ;
i f ( opcao == 1){
Consol e. Wri t e( ">>Di gi t e o nome para empi l har : " ) ;dado. nome = Consol e. ReadLi ne( );Consol e. Wri t e( ">>Di gi t e o cdi go para empi l har : " ) ;dado. codi go = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;
mi nhaPi l ha. empi l ha(dado) ;}el se i f ( opcao == 2){
dado = mi nhaPi l ha. desempi l ha( ) ;Consol e. Wr i t eLi ne( ">>Desempi l hado: Cdi go: {0} Nome: {1} \ n\ n",
dado. codi go, dado. nome) ;}
el se i f ( opcao == 3){dado = mi nhaPi l ha. retornat opo() ;Consol e. Wr i t eLi ne( ">>Dado no t opo: Cdi go: {0} Nome: {1} \ n\ n",
dado. codi go, dado. nome) ;}el se i f ( opcao == 4){
Consol e. Wr i t eLi ne( ">>Tamanho da pi l ha: {0}" , mi nhaPi l ha. t amanho() ) ;}el se i f ( opcao == 9){
/ / sai do pr ograma}
}whi l e (opcao ! = 9) ;
}}
}
-
5/28/2018 Apostila de Estrutura de Dados - C#
11/41
11
EExxeerrcccciioossssoobbrreePPiillhhaass
1. Crie uma pilha que manipule a seguinte estrutura:
Tfuncionario = registroNome : string;Salario : Real;
end;
Depois faa um programa para testar esta pilha (como no programa exemplo sobrepilhas).
A pilha deve possuir os seguintes mtodos:
Empilhar (p_funcionario); Empilhar um dado do tipo da estrutura que voc definir. Desempilhar : Tfuncionario; Desempilhar um valor e retornar o valor desempilhado RetornaTopo : Tfuncionario; Retorna o valor que est no topo da pilha Tamanho : integer; Retorna o tamanho da pilha Listar Exibe na tela os elementos da pilha, ou exibe pilha vazia. SomaSalarios : real Retorna a soma de todos os salrios de todos os funcionrios.
Observe que no h o mtodo vazio. Portanto, para saber se a pilha est vazia, vocdever utilizar o mtodo Tamanho.
2.Preencha a tabela abaixo, de acordo com os mtodos executados na primeira coluna:
Operao Pilha (topo) -----(base) Retorno Tamanho da PilhaTamanhoEmpilhar(O)Empilhar(Z)RetornaTopoEmpilhar(O)Vazio?DesempilharTamanhoEmpilhar(X)RetornaTopoDesempilharEmpilhar(O)Empilhar(B)
Veja o exemplo de preenchimento na documentao entregue sobre Pilhas.
-
5/28/2018 Apostila de Estrutura de Dados - C#
12/41
12
FFIILLAASS
Uma Fila (Queue) um caso particular de Listas Lineares que obedece ao critrio FIFO (First In, Firts Out,ou Primeiro a Entrar, Primeiro a Sair). Numa fila os elementos so inseridos em uma das extremidades eretirados na outra extremidade. Existe uma ordem linear para a fila que a ordem de chegada. Filasso utilizadas quando desejamos processar itens de acordo com a ordem primeiro-que-chega, primeiro-atendido.
Uma pilha normalmente possui as seguintes operaes (mtodos):
Enfileira ( valor ) Insere o valor no final da fila. Desenfileira Retorna o elemento do incio da fila, desenfileirando-o. Vazia Informa se a fila est fazia Tamanho retorna o tamanho da fila RetornaInicio retorna o elemento do incio da fila, mas no o desenfileira. RetornaFim retorna o elemento do final da fila, mas no o desenfileira.
Em uma implementao com arranjos (vetores), os itens so armazenados em posies contguas damemria. Por causa das caractersticas da fila, a operao enfileira faz a parte de trs da fila expandir-see a operao desenfileira faz a parte da frente da fila contrair-se. Consequentemente a fila tende acaminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parteda frente. Com poucas inseres e retiradas de itens, a fila vai ao encontro do limite do espao de
memria alocado para ela.
A soluo para o problema acima imaginar um vetor como um crculo, em que a primeira posio seguea ltima. Observe que a fila segue o sentido horrio. Conforme os elementos vo sendo desenfileirados, afila anda no sentido horrio. O mesmo ocorre com os itens que vo sendo enfileirados. Para evitarsobrepor elementos no vetor, devemos verificar o tamanho da fila antes de efetuar a operao enfileirar.Os elementos Frente e Trs so variveis que indicaro em que posio no vetor esto o primeiro e oltimo elemento inserido na fila.
Exemplo de utilizao de uma Fila:
Operao Fila trs --- frente Retorno Tamanho da FilaTamanho 0 0Enfileirar(A) A 1
Enfileirar(B) BA 2Vazia BA False 2Enfileirar(C) CBA 3RetornaFrente CBA A 3RetornaTras CBA C 3Desenfilera CB A 2Desenfilera C B 1Desenfilera C 0
Vazia True 0RetornaFrente ERRO 0
Frente
Trs Implementao circular para filas
-
5/28/2018 Apostila de Estrutura de Dados - C#
13/41
13
// Implementao de uma fila circular em C# utilizando vetor
usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Li nq;usi ng Syst em. Text ;
namespace Fi l aEstat i ca{
cl ass F i l a{const i nt CAPACI DADE = 10; / / capaci dade mxi ma da f i l apr i vate i nt quant i dade = 0; / / qt de de el ementos enfi l ei r adospr i vate i nt i ni ci o = 0; / / i ndi ca qual a pr i mei r a posi o da f i l apr i vate i nt f i m = 0; / / i ndi ca a pr xi ma posi opr i vate st r i ng[ ] dados = new s t r i ng[ CAPACI DADE] ; / / este vet or i r ar mazenar os dados da f i l a
/ / r et or na o t amanho da f i l apubl i c i nt t amanho( ){
return quant i dade;}
/ / enf i l ei ra umval or st r i ngpubl i c voi d enf i l ei rar ( s t r i ng p_val or ){
i f ( t amanho( ) == CAPACI DADE){
Consol e. Wr i t eLi ne( "A f i l a est chei a! !! ! ") ;}el se{
dados[ f i m ] = p_val or ;f i m = (f i m + 1) % CAPACI DADE;quant i dade++;
}}
/ / r emove o pr i mei r o el ement o da f i l a e devol ve.publ i c s t r i ng desenf i l ei ra(){
i f ( t amanho( ) == 0){Consol e. Wr i t eLi ne( "A f i l a est vazi a! " ) ;return "" ;
}el se{
st r i ng val or = dados[ i ni ci o];i ni ci o = ( i ni ci o + 1) % CAPACI DADE;quanti dade - - ;return val or ;
}}
} / / f i mda cl asse Fi l a
/ / progr ama pr i nci pal para test ar a f i l a ci r cul ar .c l ass Fi l aEstat i ca{
st at i c voi d Mai n( s t r i ng[] args){
s t r i ng opcao, val or;F i l a mi nhaf i l a = new F i l a( ) ;
Consol e. Wr i t eLi ne( "Si st ema em C# par a t estar a execuo de uma f i l a ci r cul ar\ n") ;
do{
Consol e. Wr i t eLi ne( "\ n\ nDi gi t e: 1- >Enf i l ei r ar 2- >Desenf i l ei rar " +
-
5/28/2018 Apostila de Estrutura de Dados - C#
14/41
14
"3- > Tamanho 9- >Sai r ") ;opcao = Consol e. ReadLi ne( ) ;
swi t ch ( opcao) {case "1":
Consol e. Wr i t eLi ne( "Di gi t e um val or para enf i l ei rar: ") ;val or = Consol e. ReadLi ne( ) ;mi nhaf i l a. enf i l ei rar( val or ) ;break;
case "2":Consol e. Wr i t eLi ne( "Desenf i l ei rado: {0}" , mi nhaf i l a. desenf i l ei ra( ) ) ;break;
case "3":Consol e. Wr i t eLi ne( "Tamanho da f i l a: {0}", mi nhaf i l a. t amanho( ) );break;
case "9":Consol e. Wr i t eLi ne( "Sai ndo do si st ema. . . ") ;break;
defaul t :Consol e. Wr i t eLi ne( "Opo i nvl i da! ! !" ) ;break;
}
}whi l e ( opcao != "9") ;}
} / / f i m da cl asse F i l aEst at i ca
-
5/28/2018 Apostila de Estrutura de Dados - C#
15/41
15
LLIISSTTAASS
http://www.inf.ufsc.br/~ine5384-hp/Capitulo2/EstruturasLista.html
Uma Estrutura de Dados Lista um conjunto de dados dispostos e/ou acessveis em uma seqnciadeterminada.
Este conjunto de dados pode possuir uma ordem intrnseca (Lista Ordenada) ou no. Este conjunto de dados pode ocupar espaos de memria fisicamente consecutivos,
espelhando a sua ordem, ou no. Se os dados estiverem dispersos fisicamente, para que este conjunto seja uma lista, ele deve
possuir operaes e informaes adicionais que permitam que seja tratado como tal (ListaEncadeada).
O conjunto de operaes a ser definido depende de cada aplicao. Um conjunto de operaesnecessrio a uma maioria de aplicaes :
1. Criar uma lista linear vazia. 2. Inserir um novo item imediatamente aps o i-simo item. 3. Retirar o i-simo item. 4. Localizar o i-simo item para examinar e/ou alterar o contedo de seus componentes. 5. Combinar duas ou mais listas lineares em uma lista nica. 6. Partir uma lista linear em duas ou mais listas. 7. Fazer uma cpia da lista linear. 8. Ordenar os itens da lista em ordem ascendente ou descendente, de acordo com alguns de
seus componentes. 9. Pesquisar a ocorrncia de um item com um valor particular em algum componente.
IMPLEMENTAO DE LISTAS LINEARES POR MEIO DE ARRANJOS
Os itens da lista so armazenados em posies contguas de memria. A lista pode ser percorrida em qualquer direo. A insero de um novo item pode ser realizada aps o ltimo item com custo constante. A insero de um novo item no meio da lista requer um deslocamento de todos os itens
localizados aps o ponto de insero. Retirar um item do incio da lista requer um deslocamento de itens para preencher o espao
deixado vazio.
-
5/28/2018 Apostila de Estrutura de Dados - C#
16/41
16
Abaixo, listagem de uma implementao de Lista com Arranjos:
usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Text ;
namespace Li staEst at i ca{
publ i c cl ass Li sta{
pri vat e const i nt CAPACI DADE = 10;
pri vat e s t r i ng[ ] dados = new s t r i ng[ CAPACI DADE] ;pri vat e i nt quanti dade = 0;
publ i c i nt t amanho( ){
return quant i dade;}
publ i c voi d i nsereNaPosi cao( i nt p_posi cao, s t r i ng p_val or ){
i f ( t amanho( ) == CAPACI DADE){
Consol e. Wr i t eLi ne( "A l i sta est chei a!! !\ n\ n" ) ;}el se{
quant i dade++;f or ( i nt i = t amanho( ) - 1; i > p_posi cao; i - - ){
dados[ i ] = dados[ i - 1];}dados[ p_posi cao] = p_val or;
}}
publ i c s t r i ng removeDaPosi cao( i nt posi cao){
i f ( t amanho( ) == 0){
Consol e. Wr i t eLi ne( "A l i sta est vazi a!! !! ") ;return "" ;
}el se{
st r i ng aux = dados[ posi cao];f or ( i nt i = posi cao; i < t amanho() - 1 ; i ++){
dados[ i ] = dados[ i + 1] ;}quant i dade- - ;return aux;
}}
publ i c voi d i nsereNoI ni ci o(s t r i ng p_val or ){
i nser eNaPosi cao( 0, p_val or );}
publ i c voi d i nsereNoFi m( st r i ng p_val or ){
i nser eNaPosi cao( t amanho( ) , p_val or ) ;}
-
5/28/2018 Apostila de Estrutura de Dados - C#
17/41
17
publ i c voi d i mpr i meLi st a(){
Consol e. Wr i t eLi ne( "\ n\ nI mpresso dos dados da l i st a: \ n") ;f or ( i nt i = 0; i < t amanho( ) ; i ++){
Consol e. Wr i t eLi ne( dados[i ] ) ;}
}} / / f i mda cl asse l i s ta
cl ass Progr am_Li st aEst at i ca{
sta t i c voi d Mai n(s t r i ng[] args){
st r i ng opcao, val or ;i nt posi cao;Li st a mi nhaLi st a = new Li s t a( ) ;Consol e. Wr i t eLi ne( "Si st ema em C# par a test ar a execuo de uma l i st a est t i ca\n") ;do{
Consol e. Wr i t eLi ne( " \ nDi gi te: \ n 1-> I nser i r no i n ci o \ n 2- > I nser i r no f i m \ n" +"3- > I nseri r emuma posi o \ n 4- > Tamanho \ n 5- > Li st ar \ n " +"6- > Remover el ement o de uma posi o \ n 9- > Sai r " ) ;
opcao = Consol e. ReadLi ne( ) ;swi t ch ( opcao){
case "1":Consol e. Wr i t eLi ne( "Di gi te um val or para i nser i r no i n c i o: ") ;val or = Consol e. ReadLi ne( );mi nhaLi sta. i nser eNoI ni ci o(val or );break;
case "2":Consol e. Wr i t eLi ne( "Di gi t e um val or para i nser i r no fi m: ") ;val or = Consol e. ReadLi ne( );mi nhaLi st a. i nser eNoFi m( val or) ;break;
case "3":Consol e. Wr i t eLi ne( "Di gi te um val or para i nser i r : ") ;val or = Consol e. ReadLi ne( );Consol e. Wr i t eLi ne( "Di gi t e a posi o: " ) ;posi cao = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;mi nhaLi st a. i nser eNaPosi cao ( posi cao, val or) ;
break;case "4":Consol e. Wr i t eLi ne( "Tamanho da l i st a: {0}", mi nhaLi st a. t amanho( ) ) ;break;
case "5":mi nhaLi st a. i mpri meLi st a( ) ;break;
case "6":Consol e. Wr i t eLi ne( "Di gi t e a posi o que desej a remover: ") ;posi cao = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;Consol e. Wr i t eLi ne( "Removi do: {0} " , mi nhaLi st a. r emoveDaPosi cao(posi cao) ) ;break;
case "9":Consol e. Wr i t eLi ne( "Sai ndo do si st ema. . . ") ;break;
def aul t :
Consol e. Wr i t eLi ne( "Opo i nvl i da!! ! " ) ;break;}
} whi l e ( opcao ! = "9") ;}
}}
-
5/28/2018 Apostila de Estrutura de Dados - C#
18/41
18
EExxeerrcccciioossSSoobbrreeLLiissttaass,,FFiillaasseePPiillhhaass
Sabendo-se que possvel implementar uma Pilha e uma Fila utilizando a estrutura de dados LISTA,faa:
Exerccio 1:Dada a Estrutura de Dados LISTA descrita e implementada acima, faa o programa principal de
forma que ele simule uma Pilha para armazenamento de strings.Deve executar os mtodos: Empilhar, Desempilhar e Tamanho.
Exerccio 2:Dada a Estrutura de Dados LISTA descrita e implementada acima, faa o programa principal de
forma que ele simule uma Fila para armazenamento de strings.Deve executar os mtodos: Enfileira, Desenfileira e Tamanho.
-
5/28/2018 Apostila de Estrutura de Dados - C#
19/41
19
AAppoonnttaaddoorreess oouuPPoonntteeiirrooss
timo material sobre apontadores:http://br.geocities.com/cesarakg/pointers.htmlhttp://www.deei.fct.ualg.pt/IC/t20_p.html
Um apontador um tipo de varivel especial, cujo objetivo armazenar um endereo da memria. Ou seja, ele noarmazena um valor como Ol mundo ou 55. Ao invs disso, ele armazena um endereo na memria e, nesteendereo, encontra-se uma informao til, como um texto ou um nmero.
Um apontadorcontm o endereo de um lugar na memria.
Quando voc executa comandos tais como:I := 10 ou J := 1
voc est acessando o contedo da varivel. O compilador procura automaticamente o endereo da varivel e acessa oseu contedo. Um apontador, entretanto, lhe permite determinar por si prprio o endereo da varivel .
Ex:
I := 42;
PonteiroParaI := &I;
Para mostrar o contedo do endereo para o qual a o ponteiro aponta, podemos utilizar:
Writeln( *PonteiroParaI ); { exibir 42 }
&X retorna o endereoda varivelx*p o contedodo endereo p
Para que o apontador saiba exatamente o tamanho da informao para a qual ele aponta na memria (veja figuraabaixo), uma varivel do tipo apontador deve estar associada a um tipo especfico de varivel ou registro. Para criar umavarivel do tipo apontador, coloque o smbolo ^ na frente do tipo da varivel.
Endereo ContedoE456 E123E455E454
E123 42
Varivel apontador:PonteiroParaI
Varivel Inteira I:
Cada tipo de dado ocupa um tamanhodiferente na memria. O apontador precisasaber para qual tipo de dado ele vaiapontar, para que ele possa acessarcorretamente a informao.
A esquerda temos 3 tipos de dados emPascal: Byte na primeira linha, word nasegunda e longint na terceira. Veja que ostamanhos so diferentes!
-
5/28/2018 Apostila de Estrutura de Dados - C#
20/41
20
Exemplo de um programa que utiliza apontadores:
usi ng Syst em;usi ng System. Col l ecti ons. Gener i c;usi ng System. Li nq;usi ng Syst em. Text ;
namespace Pont ei r os{
cl ass Pr ogr amPontei r o{
s t a t i c voi d Mai n( s t r i ng[] args){
/ / par a rodar este programa, voc deve conf i gur ar o seu proj eto par a rodar cdi go no pr otegi do./ / par a t ant o, v ao menu pr oj ect - > propert i es ( ul t i ma opo do menu) - > escol ha a aba BUI LD/ / e marque a opo "ALLOW UNSAFE CODE". Sal ve o pr oj et o e compi l e- o com F5.unsaf e{
i nt * p1; / / cr i a uma vari vel que pode apont ar par a uma/ / out r a var i vel i nte i ra
i nt numero = 7;
/ / &numero = endereo da var i vel numerop1 = &numer o; / / o pont ei r o p1 vai apontar par a o mesmo endereo
/ / que a vari vel numero
/ / *p1 - > val or armazenado no endereo apont ado por p1Consol e. Wri teLi ne( "Var i vel nmero: {0} pontei r o: {1}", numero, *p1) ;
Consol e. Wri te( "\ nDi gi te um val or para o pont ei ro: " ) ;*p1 = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;
Consol e. Wr i teLi ne( " Vari vel nmero: {0} ", numero) ;
Consol e. ReadLi ne() ;}
}}
}
PPiillhhaassuuttiilliizzaannddooaappoonnttaaddoorreess
As pilhas criadas utilizando-se apontadores so mais eficientes, pois no precisamos especificar o tamanho inicial,tampouco necessrio definir um Limite. Cada elemento da pilha aponta para o prximo, utilizando para issoapontadores.
Para criar uma pilha utilizando apontadores, precisamos definir uma estrutura que possua os seguintes campos:
program Ppilha;Type
Apontador= ^TElemento;
TElemento = recordAnterior : apontador;dado : String;
Cada elemento da pilha possui:
Valor que deve ser empilhado. Apontador para o elemento anteriorna pilha.
A base da pilha tem como elemento anterior o valor NIL.
NIL
Anterior
Anterior
Anterior
Base
Topo
-
5/28/2018 Apostila de Estrutura de Dados - C#
21/41
21
end;
Pilha = ObjectTopo :Apontador;Procedure Empilha( valor : string );...
{pi l ha ut i l i zando apont adores}pr ogram Ppi l ha;uses crt;
t ype{t i po de dado Apontador para apont ar par aum el ement o da pi l ha}
Apont ador = TEl ement o;
{est rutura que r epresent a umel ement o na pi l ha}TEl emento = r ecor d
ant er i or : apont ador ;dado : Str i ng;
end;
{est r utur a que repr esenta uma pi l ha}Pi l ha = Obj ect
Topo : Apontador;quant i dade : i nt eger;
procedur e i ni ci al i za;f unct i on Tamanho : i nt eger ;pr ocedur e Li st ar ;procedure empi l ha( p_val or : St ri ng ) ;f unct i on desempi l ha : st ri ng;
end;
{i ni ci a uma pi l ha vazi a}pr ocedure Pi l ha. i ni c i al i za;begi n
topo : = ni l ;quant i dade : = 0;
end;
{retorna o t amanho da pi l ha}f unct i on Pi l ha. Tamanho : i nt eger ;begi n
Tamanho : = quant i dade;end;
{l i st a os el ement os da pi l ha}pr ocedure Pi l ha. Li star;var el ement o : Apont ador ;begi n
i f t amanho > 0 t henbegi n
wr i t el n( ' I nf or maes conti das na pi l ha' ) ;el emento : = t opo;whi l e el emento NI L dobegi n
Wr i t el n( el emento . dado ) ;el ement o : = el ement o . ant er i or;
end;endel sebegi n
wr i t el n( ' A pi l ha est a vazi a!! ! ' ) ;end;
end;
{empi l ha um val or st r i ng}pr ocedur e Pi l ha. empi l ha( p_val or : Str i ng ) ;
var el ement o : apont ador ;Begi n
{reser va memr i a para o novo el emento}
new ( el ement o) ;
el ement o . ant er i or : = t opo;el ement o . dado : = p_val or ;
i f t amanho > 0 t henbegi n
el ement o . ant er i or : = t opo;end;t opo : = el ement o;quant i dade : = quant i dade + 1;
end;
{desempi l ha um val or st r i ng}f uncti on Pi l ha. desempi l ha : st ri ng;var el ement o : apont ador ;Begi n
i f ( t amanho = 0) t henbegi n
desempi l ha : = ' ' ;wri t el n( ' A pi l oha esta vazi a!' ) ;
endel sebegi n
desempi l ha : = t opo . dado;{guarda p/ depoi s l i berar o espaco}el emento : = t opo;t opo : = t opo . ant eri or;di spose( el ement o);quant i dade : = quant i dade - 1;
end;end;
{pr ogr ama pri nci pal para t est ar a pi l ha}var
Mi nhaPi l ha : Pi l ha;val or : s t r i ng;tecl a : char ;
begi ncl r s cr ;Mi nhaPi l ha. i ni c i al i za;
r epeatwr i t el n;wr i t el n( ' I nf orme 1- >Empi l har 2- >Desempi l har '+ ' 3->Tamanho 4- >Li st ar e 5- >Sai r ' ) ;readl n( t ecl a);
i f ( tecl a = ' 1' ) t henbegi n
wr i t e( ' I nf or me al go p/ empi l har: ' ) ;readl n(val or );Mi nhaPi l ha. empi l ha( val or ) ;
end
el se i f ( t ecl a = ' 2' ) thenbegi n
wr i t el n( ' Desempi l hado: ' ,
-
5/28/2018 Apostila de Estrutura de Dados - C#
22/41
22
mi nhaPi l ha. Desempi l ha ) ;endel se i f ( t ecl a = ' 3' ) thenbegi n
wr i t el n( ' Tamanho: ' , Mi nhaPi l ha. Tamanho ) ;endel se i f ( t ecl a = ' 4' ) thenbegi n
Mi nhaPi l ha. Li star;
end;unt i l ( t ecl a = ' 5' ) ;
end.
-
5/28/2018 Apostila de Estrutura de Dados - C#
23/41
23
rrvvoorreess
Material retirado da referncia [3].
Uma rvore um tipo abstrato de dados que armazena elementos de maneira hierrquica. Como exceo do elementodo topo, cada elemento tem um elemento pai e zero ou mais elementos filhos. Uma rvore normalmente desenhadacolocando-se os elementos dentro de elipses ou retngulos e conectando pais e filhos com linhas retas. Normalmente oelemento topo chamado de raiz da rvore, mas desenhado como sendo o elemento mais alto, com todos os demaisconectados abaixo (exatamente ao contrrio de uma rvore real).
EX: Uma rvore que representa a estrutura de pastas em um Hard Disk:
Uma rvore T um conjunto de nodosque armazenam elementos em relacionamentos pai-filhocom as seguintespropriedades:
Ttem um nodo especial, r, chamado de raizde T. Cada nodo vde Tdiferente de rtem um nodo pai u. Se um nodo u pai de um nodo v, ento dizemos que v filho de u. Dois nodos que so filhos de um mesmo pai so irmos. Um nodo externo (ou folha)se no tem filhos. Um nodo internose tem um ou mais filhos. Um subrvorede Tenraizada no nodo v a rvore formada por todos os descendentes de vem T(incluindo o
prprio v). O ancestralde um nodo tanto um ancestral direto como um ancestral do pai do nodo. Um nodo v descendentede use u um ancestral de v. Ex: na figura acima, Meus documentos ancestral
de 2 Semestre e 2 Semestre descendente de Meus documentos. Seja vum nodo de uma rvore T. A profundidadede v o nmero de ancestrais de v, excluindo o prprio v.
Observe que esta definio implica que a profundidade da raiz de T 0 (zero). Como exemplo, na figura acima, aprofundidade do nodo Trabalhos 2, e a profundidade do nodo 2 semestre 3.
A alturade um nodo o comprimento do caminho mais longo desde nodo at um n folha ou externo. Sendoassim, a altura de uma rvore a altura do nodo Raiz. No exemplo acima, a rvore tem altura 3. Tambm se dizque a altura de uma rvore T igual profundidade mxima de um nodo externo de T.
A figura abaixo representa uma subrvore da rvore acima. Esta subrvore possui 5 nodos, onde 2 so nodos internos(Meus Documentos e Trabalhos) e 3 so nodos externos (Provas, 1 Semestre e 2 Semestre). A altura desta subarvore
2.
Meus documentos
Trabalhos Provas
1 Semestre 2 Semestre
C:\
Arquivos de programas WindowsMeus documentos
Office 2000 MSN Trabalhos Provas System32 Media Config
1 Semestre 2 Semestre
Raiz
-
5/28/2018 Apostila de Estrutura de Dados - C#
24/41
24
Os principais mtodos de uma rvore so: Raiz: Retorna a raizda rvore Pai(nodo):Retorna o pai de um nodo. Ocorre um erro se nodo for a raiz. Filho(nodo):Retorna os filhos de um nodo. Nodo_eh_Interno(nodo):Testa se um nodo do tipo interno. Nodo_eh_externo(nodo):Testa se um nodo do tipo externo. Nodo_eh_raiz(nodo):Testa se um nodo a raiz. Tamanho:Retorna a quantidade de nodos de uma rvore.
CCaammiinnhhaammeennttooeemmrrvvoorreessO caminhamento de uma rvore a maneira ordenada de percorrer todos os nodos da rvore (percorrer todos os seusns, sem repetir nenhum e sem deixar de passar por nenhum). utilizada, por exemplo, para consultar ou alterar asinformaes contidas nos ns.
Caminhamento prefixado: Um nodo visitado antes de seus descendentes. Exemplo de aplicao: Imprimir umdocumento estruturado.
Os nmeros em vermelho indicam a ordem em que os nodos so visitados. Caso fossem impressos, o resultado seria:Documento, Captulo 1, Seo 1.1, Seo 1.2, Captulo 2, Seo 2.1, Seo 2.2, Seo 2.3, Referncias.
Caminhamento ps-fixado: Neste caminho, um nodo visitado aps seus descendentes. Exemplo de aplicao:Calcular o espao ocupado por arquivos em pastas e sub-pastas.
Os nmeros em vermelho indicam a ordem em que os nodos so visitados. Caso fossem impressos, o resultado seria:H1c.doc 3k, h1nc.doc 2k, homeworks/, DDR.java 10k, Stocks.java 25k, Robot.java 20k, programs/, todo.txt 1k,cs16/.
-
5/28/2018 Apostila de Estrutura de Dados - C#
25/41
25
rrvvoorreessBBiinnrriiaassMaterial retirado da referncia [2] e [3].
Uma rvore binria uma rvore ordenada na qual todo nodo tem, no mximo, dois filhos. Uma rvore binriaimprpria aquela que possui apenas 1 filho. J uma rvore binria prpria aquela em que todo nodo tem zero ou doisfilhos, ou seja, todo nodo interno tem exatamente 2 filhos. Isso porque um nodo externo no tem filhos, ou seja, zerofilhos. Para cada filho de um nodo interno, nomeamos cada filho como filho da esquerdae filho da direita. Essesfilhos so ordenados de forma que o filho da esquerda venha antes do filho da direita.
A rvore binria suporta mais 3 mtodos adicionais:
Filho_da_esquerda(nodo): Retorna o filho da esquerda do nodo. Filho_da_direita(nodo): Retorna o filho da direita do nodo. Irmo(nodo): Retorna o irmo de um nodo
Caminhamento adicional para rvores binrias
Caminhamento interfixado:pode ser informalmente considerado como a visita aos nodos de uma rvore da esquerdapara a direita. Para cada nodo v, o caminhamento interfixado visita vaps todos os nodos da subrvore esqueda de veantes de visitar todos os nodos da subrvore direita de v.
O Caminhamento de Euler:sobre uma rvore binria T pode ser informalmente definido como um passeio ao redorde T, no qual iniciamos pela raiz em direo ao filho da esquerda e consideramos as arestas de T como sendo paredesque devemos sempre manter nossa esquerda. Cada nodo de T visitado trs vezes pelo caminhamento de Euler.
Propriedades de uma rvore binriaSeja Tuma rvore binria (prpria) com nnodos e seja ha altura de T. Ento Ttem as seguintes propriedades:
1. O nmero de nodos externos de T pelo menos h+1 e no mximo 2h.2. O nmero de nodos internos de T pelo menos h e no mximo 2h 1.3. O nmero total de nodos de T pelo menos 2h +1 e no mximo 2h+1-1.4. A profundidade de T pelo menos log(n+1) -1 e no mximo (n-1)/2.
Os elementos acessados por estecaminhamento formam a expresso:
2 x (a 1) + (3 x b)
Os parnteses foram colocados para facilitar.
Prioridade das aes para efetuar o caminhamento:
Ao pela esquerda (antes do caminho sobrea subrvore esquerda de v);
Ao por baixo (entre o caminhamento sobreas duas subrvores de v);
Ao pela direita (depois do caminhamentosobre a subrvore direita de v).
-
5/28/2018 Apostila de Estrutura de Dados - C#
26/41
26
rrvvoorreessBBiinnrriiaassddeeBBuussccaa
Material retirado da referncia [2] e [3].
Uma rvore de pesquisa binria uma rvore binria em que todo n interno contm um registro, e, para cada n,todos os registros com chaves menores esto na subrvore esquerda e todos os registros com chaves maiores esto nasubrvore direita.
Podemos usar uma rvore binria de pesquisa Tpara localizar um elemento com um certo valor xpercorrendo parabaixo a rvore T. Em cada nodo interno, comparamos o valor do nodo corrente com o valor do elemento x sendo
pesquisado. Se a resposta da questo for menor, ento a pesquisa continua na subrvore esquerda. Se a resposta for igual, ento a pesquisa terminou com sucesso. Se a resposta for maior, ento a pesquisa continua na subrvore direita. Se encontrarmos um nodo externo (que vazio), ento a pesquisa terminou sem sucesso.
A figura acima representa uma rvore binria de pesquisa que armazena inteiros. O caminho indicado pela linha azulcorresponde ao caminhamento ao procurar (com sucesso) 36. A linha pontilhada vermelha corresponde aocaminhamento ao procurar (sem sucesso) por 70. Observe que o tempo de execuo da pesquisa em uma rvorebinria de pesquisa T proporcional altura de T.
Estrutura para armazenar um nodo da rvore binria:
Exemplo para os valores inseridos na ordem:1. Maria2. Mnica3. Daniela
58
31 90
62
75
42
36
25
12
N daesquerda
N dadireita
Informaodo n(valor)
Endereo N do pai
E2 E3Maria
E1 Nil
E4 E5Daniela
E2 E1
E6 E7Mnica
E3 E1
Nil Nil
E5 E2
Nil Nil
E4 E2
Nil Nil
E7 E3
Nil Nil
E6 E3
Os nodos folha semvalor so necessriospara que a rvore sejaprpria
Ordem em que oselementos foraminseridos:58,90,62,75,31,25,12,42,36
-
5/28/2018 Apostila de Estrutura de Dados - C#
27/41
27
Algoritmo para pesquisar um valor em uma rvore binria de pesquisa:
Pesquisa( nodo, valor_pesquisado ) : RetornoInicio
seNodo_eh_externo(Nodo)= verdadeiro entoescreva( Erro: Valor procurado no est na rvore!);pesquisa := nil
caso contrrioSevalor_pesquisado nodo.valor ento
pesquisa( nodo.direita, valor_pesquisado )caso contrrio
pesquisa := nodo.valor;Fim
Algoritmo para inserir um valor em uma rvore binria de pesquisa:
Insere( nodo, NovoValor )Incio
seNodo_eh_externo(nodo) = verdadeiro entoCriaNodoExterno( nodo.esquerda )
CriaNodoExterno( nodo.direita )Nodo.valor := NovoValorcaso contrrio
seNovoValor nodo.valor entoInsere( nodo.direita , NovoValor)
caso contrrioescreva(O valor j existe na rvore.);
Fim;
O mtodo CriaNodoExterno cria umnodo externo (sem valor e semfilhos)
-
5/28/2018 Apostila de Estrutura de Dados - C#
28/41
28
IImmpplleemmeennttaaooddeeuummaarrvvoorreeBBiinnrriiaaddeeBBuussccaaeemmCC##
/ / cl asse para r epr ent ar 1 Nodo na r vor ecl ass Nodo{
pr i vat e Nodo no_pai = nul l ;pr i vat e Nodo no_di rei t a = nul l ;pr i vat e Nodo no_esquer da = nul l ;pr i vat e i nt val or = 0;
publ i c i nt get _val or ( ) { return val or ; }
publ i c voi d set _val or( i nt v) { val or = v; }
publ i c voi d set _no_pai ( Nodo no) { no_pai = no; }
publ i c voi d set _no_di r ei t a( Nodo no) { no_di r ei t a = no; }
publ i c voi d set _no_esquerda( Nodo no) { no_esquerda = no; }
publ i c Nodo get _no_pai ( ) { return no_pai ; }
publ i c Nodo get _no_di r ei t a( ) { return no_di r ei t a; }
publ i c Nodo get_no_esquerda( ) { return no_esquerda; }}
/ / cl asse da rvor e de pesqui sa bi nri acl ass Ar voreBi n{
pr i vat e Nodo rai z = nul l ; / / r ai z da r vor epr i vat e i nt qtde = 0; / / qt de de nos i nt er nospr i vat e st r i ng r esul t ado = "";
publ i c i nt qtde_nos_i nt er nos( ) / / devol ve a qt de de ns i nt ernos{
return qt de;}
publ i c bool no_eh_ext erno( Nodo no) / / ver i f i ca se um det ermi nado Nodo ext erno{
return ( no. get _no_di r ei t a( ) == nul l ) && ( no. get _no_esquer da( ) == nul l ) ;}
publ i c Nodo cr i a_No_ext erno( Nodo Nopai ) / / cr i a um Nodo ext er no{
Nodo no = new Nodo( ) ;no. set _no_pai ( Nopai ) ;return no;
}
N daesquerda
N dadireita
Informao do n(valor)
Endereo N do pai
-
5/28/2018 Apostila de Estrutura de Dados - C#
29/41
29
publ i c voi d i nser e( i nt val or) / / i nser e um val or i nt{
Nodo no_aux;
i f ( qt de == 0){
/ / rvor e vazi a, devemos cr i ar o pr i mei r o Nodo, que ser a r ai zno_aux = new Nodo( ) ;r ai z = no_aux;
}
el se{/ / l ocal i za onde deve ser i nseri do o novo n.no_aux = r ai z;whi l e ( no_eh_ext erno(no_aux) == f al se){
i f ( val or > no_aux. get _val or ( ) )no_aux = no_aux. get_ no_di r ei t a() ;
el seno_aux = no_aux. get _no_esquerda( ) ;
}}/ / este er a um Nodo exter no e port ant o no t i nha f i l hos./ / Agora el e passar a t er val or . Tambmdevemos cr i ar out ros 2/ / Nodos ext er nos ( f i l hos) par a el e.no_aux. set _val or ( val or ) ;no_aux. set _no_di r ei t a( cri a_No_ext er no( no_aux)) ;no_aux. set_no_esquer da(cr i a_No_ext er no(no_aux) ) ;qt de++;
}
pr i vat e voi d Le_Nodo( Nodo no){
i f ( no_eh_ext erno( no))return;
Le_Nodo(no. get _no_esquerda() ) ;resul t ado = resul t ado + " - " + Conver t . ToI nt 32( no. get _val or ( ) ) ;Le_Nodo( no. get _no_di r ei t a( ) ) ;
}
/ / devol ve um st r i ng com os el ement os da r vor e, emor demcr escent epubl i c s t r i ng l i st agem( ){
resul t ado = "" ;Le_Nodo( r ai z) ;return r esul t ado;
}}
-
5/28/2018 Apostila de Estrutura de Dados - C#
30/41
30
Interface com o Usurio:
Cdigo da interface com o usurio:publ i c par t i al cl ass For m1 : Form {
pr i vat e Ar vor eBi n mi nhaAr vore = new Ar voreBi n( ) ;
publ i c Form1(){
I ni t i al i zeComponent ( ) ;}
pr i vat e voi d but t on1_Cl i ck(obj ect sender , EventAr gs e){
try{
mi nhaAr vor e. i nsere(Conver t . ToI nt 32( t xt Val or. Text ) ) ;l i st Box1. I t ems. Add( "I nser i do: " + txtVal or . Text ) ;
}catch{
MessageBox. Show( "Val or i nvl i do! Di gi t e apenas nmer os! " ) ;}txtVal or. Cl ear () ;txtVal or . Focus() ;
}
pr i vat e voi d but t on2_Cl i ck(obj ect sender , EventAr gs e){
l i st Box1. I t ems. Add( mi nhaAr vore. l i st agem( ) ) ;}
pr i vat e voi d but t on3_Cl i ck(obj ect sender , EventAr gs e){
l i st Box1. I t ems. Add( "Qt de: " + mi nhaAr vor e. qt de_nos_i nt er nos( ) ) ;}
pr i vat e voi d but t on4_Cl i ck(obj ect sender , EventAr gs e){
Cl ose( ) ;}
}
-
5/28/2018 Apostila de Estrutura de Dados - C#
31/41
31
LLiissttaassSSiimmpplleessmmeenntteeEEnnccaaddeeaaddaass
Material retirado da referncia [2], [3] e [4].
Em uma lista simplesmente encadeada, cada elemento contm um apontador que aponta para a o elemento seguinte. Naimplementao de listas utilizando vetores, os dados ocupavam posies contguas da memria. Sendo assim, sempreque inclumos ou apagamos um elemento no meio da lista, precisamos reorganizar os dados do vetor, o quecomputacionalmente pode ser muito custoso. Nas listas simplesmente encadeadas, os dados no ocupam posiescontguas da memria, portando operaes de remoo e incluso so executadas muito mais rapidamente. Um
elemento de uma lista simplesmente encadeada pode ser definido como na figura abaixo:
Quando criamos uma lista utilizando apontadores, precisamos ter uma varivel que aponta sempre para o incio da lista.Abaixo, temos um exemplo de uma lista simplesmente encadeada para armazenar nomes em ordem alfabtica:
Para incluir um novo elemento, por exemplo, o nome Daniela, devemos apenas alterar o apontador prximo doelemento que est no endereo E2. Veja abaixo:
Observe que a ordem dos endereos no importa. O que importa a ordem que eles esto encadeados!
O mesmo ocorre ao se removerum elemento da lista. Veja abaixo como ficaria a remoo do elemento Cludia:
LLiissttaassDDuuppllaammeenntteeEEnnccaaddeeaaddaass
Material retirado da referncia [2], [3] e [4].
A diferena de uma lista duplamente encadeada para uma lista simplesmente encadeada que em uma lista duplamenteencadeada cada elemento contm um segundo apontador que aponta para o elemento que o antecede. Assim, voc noprecisa se preocupar mais com o incio da lista. Se voc tiver um apontador para qualquer elemento da lista, podeencontrar o caminho para todos os outros elementos. Em uma lista duplamente encadeada, so necessrias variveispara apontar para o incio e para o final da lista. Abaixo temos a representao de um elemento de uma lista duplamenteencadeada:
DADOS
Endereo Prximo
Ana
E1 E2
Cludia
E2 E3
Maria
E3 NIL
Endereo doPrimeiro: E1
Ana
E1 E2
Cludia
E2 E4
Maria
E3 NIL
Endereo doPrimeiro: E1
Daniela
E4 E3
Ana
E1 E4
Cludia
E2 E4
Maria
E3 NIL
Endereo doPrimeiro: E1
Daniela
E4 E3
DADOS
Anterior PrximoEndereo
-
5/28/2018 Apostila de Estrutura de Dados - C#
32/41
32
Exemplo de uma lista duplamente encadeada para armazenar nomes em ordem alfabtica:
Para Inserir e Remover elementos, o processo semelhante ao apresentado na lista simplesmente encadeada. Adiferena que na lista duplamente encadeada necessrio tambm atualizar o campo anterior dos elementos.
LLiissttaasscciirrccuullaarreess
Material retirado da referncia [4].
So listas que possuem a caracterstica especial de ter, como sucessor do fim da lista, seu incio, ou melhor, o fim da listaaponta para seu incio, formando um crculo que permite uma trajetria contnua na lista. Veja o processo na ilustraoabaixo:
Alessandra
NIL E2
E1Endereo doPrimeiro: E1
Endereo doltimo: E3
Daniela
E1 E3
E2
Mnica
E2 NIL
E3
Ana
E1 E2
Cludia
E2 E3
Maria
E3 E1
Endereo doPrimeiro: E1
-
5/28/2018 Apostila de Estrutura de Dados - C#
33/41
33
GGrraaffooss
Material sobre grafos: [3], [4] e http://www.inf.ufsc.br/grafos/livro.html
Um grafo um conjunto de pontos, chamados vrtices (ou nodos ou ns), conectados por linhas, chamadas de arestas(ou arcos). Dependendo da aplicao, arestas podem ou no ter direo, pode ser permitido ou no arestas ligarem umvrtice a ele prprio e vrtices e/ou arestas podem ter um peso (numrico) associado. Se todas as arestas tm umadireo associada (indicada por uma seta na representao grfica) temos um grafo dirigido, ou dgrafo. Se todas asarestas em um grafo foram no-dirigidas, ento dizemos que o grafo um grafo no-dirigido. Um grafo que tem
arestas no-dirigidas e dirigidas chamado de grafo misto.
Algumas definies sobre grafos: Grau: nmero de setas que entram ou saem de um n. Grau de entrada: nmero de setas que chegam em um n X, in(X). Grau de sada: nmero de setas que saem de um n X, out(X). Fonte: todo n, cujo grau de entrada 0(zero). Sumidouro (poo): todo n, cujo grau de sada 0(zero).
Vrtice
Aresta
Exemplo de um grafo no-dirigidocom 6 vrtices e 7 arestas.
So PauloRio deJaneiro
Cuiab
Braslia
Manaus
Exemplo de um grafo dirigidocom 8 arestas e 5 vrtices.
-
5/28/2018 Apostila de Estrutura de Dados - C#
34/41
34
RReeccuurrssiivviiddaaddeeoouuRReeccuurrssoo
Material retirado de:http://pt.wikipedia.org/wiki/Recursividade (muito bom)http://pt.wikipedia.org/wiki/Recursividade_%28ci%C3%AAncia_da_computa%C3%A7%C3%A3o%29(timo)http://www.di.ufpe.br/~if096/recursao/ (bom)Referncia [1]
O que Recursividade:Uma Rotina ou Funo recursiva quando ela chama a si mesma, seja de forma direta ouindireta.
Por exemplo, segue uma definio recursiva da ancestralidade de uma pessoa: Os pais de uma pessoa so seus antepassados (caso base); Os pais de qualquer antepassado so tambm antepassados da pessoa em considerao (passo recursivo).
Um outro exemplo simples poderia ser o seguinte:Se uma palavra desconhecida vista em um livro, o leitor pode tomar nota do nmero da pgina e colocar emuma pilha (que at ento est vazia). O leitor pode consultar esta nova palavra e, enquanto l o texto, podeachar mais palavras desconhecidas e acrescentar no topo da pilha. O nmero da pgina em que estas palavrasocorrem tambm so colocados no topo da pilha. Em algum momento do texto, o leitor vai achar uma frase ouum pargrafo onde est a ltima palavra anotada e pelo contexto da frase vai descobrir o seu significado. Entoo leitor volta para a pgina anterior e continua lendo dali. Paulatinamente, remove-se seqencialmente cada
anotao que est no topo da pilha. Finalmente, o leitor volta para a sua leitura j sabendo o significado da(s)palavra(s) desconhecida(s). Isto uma forma de recurso.
Clculo do Fatorial sem Recurso, usamos apenasuma estrutura de repetio (iterador)
Clculo do Fatorial com Recursodireta
l ong f at_ i terat i vo( i nt numer o){
l ong r =1;
f or ( i nt i =2; i = 2)return numero*f at_r ecur si vo( numero- 1) ;
el sereturn numer o;
}
Teste de Mesa do Fatorial de 5: azul = ida(chamada recursiva) , vermelho = volta (retorno da funo recursiva)
Resposta = Fat_recursivo(5)
Fat_recursivo(5) = 5 * Fat_recursivo( 5 1 )
Fat_recursivo(4) = 4 * Fat_recursivo( 4 1 )
Fat_recursivo(3) = 3 * Fat_recursivo( 3 1 )
Fat_recursivo(2) = 2 * Fat_recursivo( 2 1 )
Fat_recursivo(1) = 1
Recurso versus Iterao
No exemplo do fatorial, a implementao iterativa tende a ser ligeiramente mais rpida na prtica do que aimplementao recursiva, uma vez que uma implementao recursiva precisa registrar o estado atual do processamentode maneira que ela possa continuar de onde parou aps a concluso de cada nova excecuo subordinada doprocedimento recursivo. Esta ao consome tempo e memria.Existem outros tipos de problemas cujas solues so inerentemente recursivas, j que elas precisam manter registros deestados anteriores. Um exemplo o percurso de uma rvore;
1
2
6
24
120
-
5/28/2018 Apostila de Estrutura de Dados - C#
35/41
35
Toda funo que puder ser produzida por um computador pode ser escrita como funo recursiva sem o uso de iterao;reciprocamente, qualquer funo recursiva pode ser descrita atravs de iteraes sucessivas. Todos altoritmorecursivo pode ser implementado iterativamente com a ajuda de uma pilha, mas o uso de uma pilha, de certaforma, anula as vantagens das solues iterativas.
Tipos de Recursividade:
Direta: Quando chama a si mesma, quando dada situao requer uma chamada da prpria Rotina em execuo para simesma. Ex: O exemplo de fatorial recursivo dado acima.
Indireta: Funes podem ser recursivas (invocar a si prprias) indiretamente, fazendo isto atravs de outras funes:assim, "P" pode chamar "Q" que chama "R" e assim por diante, at que "P" seja novamente invocada.
Ex:doubl e Cal cul o( doubl e a, b ){
return Di vi de(a, b) + a + b;}
doubl e Di vi de( doubl e a, b ){
i f ( b == 0)b = Cal cul o( a, b + a) ;
return a/ b;}
Em cauda: As funes recursivas em cauda formam uma subclasse das funes recursivas, nas quais a chamadarecursiva a ltima instruo a ser executada. Por exemplo, a funo a seguir, para localizar um valor em uma listaligada recursiva em cauda, por que a ltima coisa que ela faz invocar a si mesma:
Ex: Vamos usar como exemplo o algoritmo para pesquisar um valor em uma rvore binria de pesquisa:
Pesquisa( nodo, valor_pesquisado ) : RetornoInicio
seNodo_eh_externo(Nodo)= verdadeiro ento
escreva( Erro: Valor procurado no est na rvore!);pesquisa := nilcaso contrrio
Se valor_pesquisado nodo.valor entopesquisa( nodo.direita, valor_pesquisado )
caso contrriopesquisa := nodo.valor;
Fim
Note que a funo f ator i al usada como exemplo na seo anterior no recursiva em cauda, pois depois que
ela recebe o resultado da chamada recursiva, ela deve multiplicar o resultado por VALOR antes de retornar parao ponto em que ocorre a chamada.
Qual a desvantagem da Recurso?Cada chamada recursiva implica em maior tempo e espao, pois, toda vez que uma Rotina chamada, todas as variveislocais so recriadas.
Qual a vantagem da Recurso?Se bem utilizada, pode tornar o algoritmo: elegante, claro, conciso e simples. Mas, preciso antes decidir sobre o uso daRecurso ou da Iterao.
Aqui ocorre arecursividade
indireta!
-
5/28/2018 Apostila de Estrutura de Dados - C#
36/41
36
OOrrddeennaaoo
Material retirado de:Referncia [2], [3]http://pt.wikipedia.org/wiki/Algoritmo_de_ordena%C3%A7%C3%A3o (com exemplos em vrias linguagens)
Ordenar corresponde ao processo de rearranjar um conjunto de objetos em uma ordem ascendente ou descendente. Oobjetivo principal da ordenao facilitar a recuperao posterior de itens do conjunto ordenado. Imagine como seriadifcil utilizar um catlogo telefnico se os nomes das pessoas no estivessem listados em ordem alfabtica!Existem diversos mtodos para realizar ordenao. Iremos estudar aqui dois dos principais mtodos.
Bubble sort
O bubble sort, ou ordenao por flutuao (literalmente "por bolha"), um algoritmo de ordenao dos mais simples. Aideia percorrer o vector diversas vezes, a cada passagem fazendo flutuar para o topo o menor elemento da sequncia.Essa movimentao lembra a forma como as bolhas em um tanque de gua procuram seu prprio nvel, e disso vem onome do algoritmo.
No melhor caso, o algoritmo executa (n2) / 2 operaes relevantes. No pior caso, so feitas 2n2operaes. No casomdio, so feitas (5n2) / 2 operaes. A complexidade desse algoritmo de Ordem quadrtica. Por isso, ele no recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.O algoritmo pode ser descrito em pseudo-cdigo como segue abaixo. V um VECTOR de elementos que podem ser
comparados e n o tamanho desse vector.BUBBLESORT ( V[ ] , n)1 houveTr oca : = verdade # uma var i vel de cont r ol e2 enquant o houveTroca f or verdade f aa3 houveTr oca : = f al so4 para i de 1 at n- 1 f aa5 se V[ i ] vem depoi s de V[i + 1]6 ent o t r oque V[ i ] e V[ i + 1] de l ugar e7 houveTroca : = ver dade
Implementao em C# utilizando For e While
cl ass C_Bubbl eSort{
stat i c i nt [ ] Or dena_Bubbl eSort ( i nt [ ] vetor){
i nt aux;
f or ( i nt i = vet or. Lengt h - 1; i >= 1; i - - ){
f or ( i nt j = 0; j vet or[ j + 1]){
/ / ef etua a tr oca de val oresaux = vetor[ j ] ;vetor[ j ] = vet or[ j + 1];vetor [j + 1] = aux;
}}
}return vet or;
}
stat i c voi d Mai n( s t r i ng[] args)
{ i nt [ ] dados = new i nt [10];
f or ( i nt i = 0; i < dados. Length; i ++){
Consol e. Wr i t eLi ne( " I nf or me um nmero" ) ;dados[ i ] =Convert . ToI nt 16(Consol e. ReadLi ne( )) ;
}
Or dena_Bubbl eSort ( dados) ;
Consol e. Wr i t eLi ne( "\ n\ nDados or denados: " ) ;f or ( i nt i = 0; i < dados. Length; i ++){
Consol e. Wri t eLi ne( dados[i ] ) ;}Consol e. ReadKey( ) ;
cl ass C_Bubbl eSort{
s t a t i c i nt [ ] Or dena_Bubbl eSort ( i nt [ ] vetor){
i nt aux;bool houvetr oca;
do{
houvet r oca = f a l se;f or ( i nt j = 0; j vet or[ j + 1]){
/ / ef etua a tr oca de valor eshouvet r oca = true;aux = vetor[ j ] ;vetor[ j ] = vet or[ j + 1];vetor[ j + 1] = aux;
}}
}whi l e ( houvetr oca == true) ;
return vetor;}
s t a t i c voi d Mai n( s t r i ng[] args){
i nt [ ] dados = new i nt [10];
f or ( i nt i = 0; i < dados. Length; i ++){
Consol e. Wr i t eLi ne( "I nf orme umnmer o") ;dados[i ] = Conver t . ToI nt16( Consol e. ReadLi ne()) ;
}
Or dena_Bubbl eSort ( dados) ;
Consol e. Wr i t eLi ne( "\ n\ nDados ordenados: " ) ;
-
5/28/2018 Apostila de Estrutura de Dados - C#
37/41
37
}}
f or ( i nt i = 0; i < dados. Length; i ++){
Consol e. Wri t eLi ne( dados[ i ] );}
Consol e. ReadKey( ) ;}
}
Quicksort
O algoritmo Quicksort um mtodo de ordenao muito rpido e eficiente, inventado por C.A.R. Hoare em 1960,quando visitou a Universidade de Moscou como estudante. Foi publicado em 1962 aps uma srie de refinamentos.
O Quicksort adota a estratgia de diviso e conquista. Os passos so:
1. Escolha um elemento da lista, denominado piv (de forma randmica);2. Rearranje a lista de forma que todos os elementos anteriores ao piv sejam menores ou iguais a ele, e todos os
elementos posteriores ao piv sejam maiores ou iguais a ele. Ao fim do processo o piv estar em sua posiofinal. Essa operao denominada partio;
3. Recursivamente ordene a sublista dos elementos menores e a sublista dos elementos maiores;A base da recurso so as listas de tamanho zero ou um, que esto sempre ordenadas. O processo finito pois a cadaiterao pelo menos um elemento posto em sua posio final e no ser mais manipulado na iterao seguinte.
Complexidade
O(n lg2n) no melhor casoe no caso mdio O(n2) nopior caso;
Implementaes
Algori tmo em por tugus estruturado
proc qui cksor t (x :vet [ n] i nt ; i ni : i nt ; f i m: i nt ; n: i nt )var
i nt : i , j , y, aux;
i n ci oi
-
5/28/2018 Apostila de Estrutura de Dados - C#
38/41
38
-
5/28/2018 Apostila de Estrutura de Dados - C#
39/41
39
Implementao em C#
Mtodo que efetua a ordenaos ta t i c voi d Qui ckSor t ( i nt [ ] vetor , i nt esq, i nt di r ){
i nt pi vo, aux, i , j ;i nt mei o;
i = esq;j = di r ;
mei o = ( i nt ) ( ( i + j ) / 2) ;pi vo = vet or [ mei o] ;
do{
whi l e ( vet or [ i ] < pi vo) i = i + 1;whi l e ( vet or [ j ] > pi vo) j = j - 1;
i f ( i i ) ;
i f ( esq < j ) Qui ckSort ( vet or , esq, j ) ;i f ( i < di r ) Qui ckSor t (vetor , i , di r ) ;
}
Mtodo MAIN que solicita os nmeros e chama o mtodo quicksort para ordenar.
s ta t i c voi d Mai n( s t r i ng[] args){i nt [ ] dados = new i nt [ 10] ;
Consol e. Wr i t eLi ne( "Ent r e com {0} nmeros" , dados. Lengt h) ;f or ( i nt i = 0; i < dados. Lengt h; i ++){
dados[ i ] = Conver t . ToI nt 16( Consol e. ReadLi ne( ) ) ;}
Qui ckSor t ( dados, 0, dados. Lengt h - 1) ;
Consol e. Wr i t eLi ne( "\ n\ nNmeros or denados: \ n" ) ;f or ( i nt i = 0; i < dados. Lengt h; i ++){
Consol e. Wr i t eLi ne ( dados[ i ] ) ;}
Consol e. ReadLi ne( ) ;}
-
5/28/2018 Apostila de Estrutura de Dados - C#
40/41
40
PPeessqquuiissaaeemmMMeemmrriiaaPPrriimmrriiaa
Pesquisa seqencial
Retirado de : http://pucrs.campus2.br/~annes/alg3_pesqseq.html[2]
O mtodo de pesquisa mais simples que existe funciona da seguinte forma: a partir do primeiro registro, pesquisesequencialmente at encontrar a chave procurada; ento pare. A complexidade desta pesquisa no pior caso n, onde n o tamanho total do vetor sendo pesquisado.
{Algoritmo em Pascal}Function PesquisaSequencial(vetor : array of Integer, chave,n : integer) : integer;
Var i: integer;Achou : boolean;
BeginPesquisaSequencial := -1; { significa que no encontrou }
Achou := false;i:= 1;Repeat
If vetor[i] = chave thenBegin
Achou := true;
PesquisaSequencial := i;End;i := i + 1;
Until (i > n) or (achou = true);End;
Dado o exemplo:
5 7 1 9 3 21 15 99 4 8
No exemplo acima, seriam necessrias 7 iteraes para encontrar o valor 15.
Pesquisa Binria
Retirado de : http://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria[2]
A pesquisa ou busca binria ( em ingls binary search algorithm ou binary chop ) um algoritmo de busca em vetoresque requer acesso aleatrio aos elementos do mesmo. Ela parte do pressuposto de que o vetor est ordenado, erealiza sucessivas divises do espao de busca comparando o elemento buscado (chave) com o elemento no meio dovetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso. Caso contrrio, se o elemento do meiovier antes do elemento buscado, ento a busca continua na metade posterior do vetor. E finalmente, se o elemento domeio vier depois da chave, a busca continua na metade anterior do vetor. A complexidade desse algoritmo da ordemde log2 n, onde n o tamanho do vetor de busca.
Um pseudo-cdigo recursivo para esse algoritmo, dados V o vetor com elementos comparveis, n seu tamanho e e oelemento que se deseja encontrar:
BUSCA- BI NRI A ( V[ ], i ni ci o, f i m, e}i recebe o ndi ce no mei o de i ni ci o e f i m
se V[ i ] i gual a eent o devol va o ndi ce i # encont r ei eseno se V[ i ] vemantes de e
ent o faa a BUSCA- BI NRI A( V, i +1, f i m, e)seno f aa a BUSCA- BI NRI A( V, i ni ci o, i - 1, e)
-
5/28/2018 Apostila de Estrutura de Dados - C#
41/41
41
{Algortmo em Pascal}f uncti on BuscaBi nar i a (Vet or: ar ray of st r i ng; Chave: st ri ng; Di m: i nt eger) : i nt eger ;
var i ni ci o, f i m: i nt eger ; {Auxi l i ares que represent am o i ni ci o e o f i m do vet or anal i sado}mei o: i nteger; {Mei o do vetor }
begi nf i m : = Di m; {O val or do l t i mo ndi ce do vet or}i ni ci o := 1; {O val or do pr i mei r o ndi ce do vet or }
r epeatmei o : = ( i ni ci o+f i m) di v 2;
i f ( Chave = vet or[ mei o] ) thenBuscaBi nar i a : = mei o;
i f ( Chave < vet or[ mei o] ) thenf i m: =( mei o-1);
i f ( Chave > vet or [ mei o] ) then
i ni ci o: =( mei o+1) ;unti l ( Chave = Vetor [ mei o]) or ( i ni ci o > f i m) ;i f ( Chave = Vet or[ mei o]) t hen
BuscaBi nari a : = mei oel se
BuscaBi nar i a : = - 1; {Retor na o val or encont r ado, ou - 1 se a chave nao f oi encont r ada. }end;
rvores de pesquisa
Vide rvores Binrias de Busca.