Beruflich Dokumente
Kultur Dokumente
2013
Pesq_Ord_de_Dados 1
22/04/13 14:53
Copyright 2013. Todos os direitos reservados desta edio SECRETARIA DE APOIO S TECNOLOGIAS EDUCACIONAIS
(SATE/UECE). Nenhuma parte deste material poder ser reproduzida, transmitida e gravada, por qualquer meio
eletrnico, por fotocpia e outros, sem a prvia autorizao, por escrito, dos autores.
Presidente da Repblica
Dilma Vana Rousseff
Ministro da Educao
Aloizio Mercadante
Presidente da CAPES
Jorge Almeida Guimares
Diretor de Educao a Distncia da CAPES
Joo Carlos Teatini de Souza Climaco
Governador do Estado do Cear
Cid Ferreira Gomes
Reitor da Universidade Estadual do Cear
Jos Jackson Coelho Sampaio
Design instrucional
Laurisa Nuting
Coordenador Editorial
Rocylnia Isidio
Projeto grfico
Rafael Straus Timb Vasconcelos
Marcos Paulo Rodrigues Nobre
Pesq_Ord_de_Dados 2
Pr-Reitora de Graduao
Marclia Chagas Barreto
Coordenador da SATE e UAB/UECE
Francisco Fbio Castelo Branco
Coordenadora Adjunta UAB/UECE
Elosa Maia Vidal
Coordenador da Licenciatura em Informtica
Joaquim Celestino Junior
Coordenadora de Tutoria da Licenciatura em Informtica
Andr Ribeiro Cardoso
Diagramao
Francisco Jos da Silva Saraiva
Ilustrao
Marcos Paulo Rodrigues Nobre
Capa
Emilson Pamplona Rodrigues de Castro
22/04/13 14:53
Apresentao........................................................................................................................ 5
Captulo 1
Introduo............................................................................................................................. 7
Apresentao...................................................................................................................... 9
1. Introduo....................................................................................................................... 9
2. Armazenamento de Informaes.................................................................................... 10
3. Procedimentos e Funes............................................................................................... 11
4. Estruturas Utilizadas nos Algoritmos.............................................................................. 14
5. Exemplo de Uso de Procedimentos e Funes............................................................... 16
Captulo 2
Ordenao Interna................................................................................................................ 17
Apresentao...................................................................................................................... 19
1. Ordenao Interna.......................................................................................................... 19
2. O Problema da Ordenao.............................................................................................. 20
3. Bolha............................................................................................................................... 21
4. Insero........................................................................................................................... 24
5. Seleo............................................................................................................................ 25
6. Shellsort.......................................................................................................................... 26
7. Mergesort....................................................................................................................... 27
8. Quicksort......................................................................................................................... 31
9. Heaps Binrios................................................................................................................ 35
10. Heapsort....................................................................................................................... 38
11. Countingsort................................................................................................................. 38
12. Bucketsort..................................................................................................................... 40
13. Radixsort....................................................................................................................... 41
Captulo 3
Ordenao Externa................................................................................................................ 45
Apresentao...................................................................................................................... 47
1. Definio e mecanismos................................................................................................. 47
2. Intercalao de dois caminhos........................................................................................ 48
3. Intercalao de trs caminhos........................................................................................ 51
4. Intercalao de k caminhos............................................................................................. 53
5. Comparao entre Distribuies Equilibradas................................................................ 53
6. Intercalao Polifsica..................................................................................................... 56
Pesq_Ord_de_Dados 3
22/04/13 14:53
Captulo 4
Tcnicas de pesquisa............................................................................................................. 61
Apresentao...................................................................................................................... 63
1. Tcnicas de Pesquisa....................................................................................................... 63
2. Busca Sequencial............................................................................................................. 64
3. Busca Binria................................................................................................................... 65
4. Tabelas de Disperso....................................................................................................... 66
5. rvores de Busca Balanceadas........................................................................................ 71
Dados dos Autores................................................................................................................ 86
Anexo
Relao de Algoritmos........................................................................................................... 87
Pesq_Ord_de_Dados 4
22/04/13 14:53
O problema da ordenao um dos mais importantes e mais estudados na cincia da computao. Em diversas situaes cotidianas preciso colocar uma lista
em ordem para facilitar a busca de informaes nela contidas. Ordenar, ou classificar
dados, significa armazen-los numa forma adequada de modo a facilitar sua pesquisa,
ou busca, e assim tornar mais gil a recuperao das informaes.
Neste livro sero mostradas inicialmente as tcnicas clssicas de classificao
de dados, seguidas pelos mtodos usuais de pesquisa. Em todos os procedimentos
descritos utilizam-se estruturas de dados conhecidas, como vetores, matrizes, rvores,
listas, pilhas e filas.
Adiantamos que, uma classificao dita interna, quando os dados podem ser
totalmente armazenados na memria principal, e externa, se parte deles estiverem,
durante o processo de ordenao, num meio de armazenamento auxiliar. Os mtodos
de classificao externa so realizados atravs de uma tcnica de projeto de algoritmos denominada diviso e conquista, onde os dados so divididos em sries menores, de tamanho tal que seja possvel orden-los por algum mtodo de classificao
interna; ao final, as sries devem ser intercaladas a fim de gerar uma nica sada,
totalmente ordenada.
A pesquisa, outra tarefa importante na computao, corresponde busca de informaes contidas num arquivo ou, em geral, numa lista ou coleo de dados. Desejase que esse processo seja executado sem que haja a necessidade de inspecionar toda a
coleo de dados, para isto so apresentadas diversas tcnicas e estruturas de dados
que permitem fazer pesquisa com bastante eficincia. Discutimos as operaes de insero, busca e remoo nessas estruturas, analisando sua complexidade temporal e
espacial. Essa anlise tambm feita para os procedimentos de classificao interna.
Ao final de cada captulo so propostos exerccios, cujo objetivo avaliar os conhecimentos adquiridos e rever as definies abordadas no respectivo captulo.
Os Autores
Pesq_Ord_de_Dados 5
22/04/13 14:53
Pesq_Ord_de_Dados 6
22/04/13 14:53
Captulo
Introduo
Objetivos:
Pesq_Ord_de_Dados 7
22/04/13 14:53
Pesq_Ord_de_Dados 8
22/04/13 14:53
Apresentao
Nas consideraes gerais contidas neste captulo introdutrio, destacamos inicialmente a importncia da Pesquisa e Ordenao para a computao, e a necessidade do uso de tcnicas eficientes para que seu processamento seja realizado no menor tempo possvel. Mostramos, tambm, que
a abordagem deste assunto deve ser feita de forma integrada entre os dois
tpicos, pesquisa e ordenao, e que requerida uma reviso do assunto
Estrutura de Dados para que seja compreendido como as informaes so
armazenadas e de que forma os processos as utilizam. Por fim, apresentada a forma padro usada para codificao dos algoritmos, bem como de
seus procedimentos e funes.
1. Introduo
A pesquisa e a ordenao so operaes bastante utilizadas nos sistemas de programao, desde a origem da computao. Independente da
gerao ou do ambiente computacional, ordenar, ou classificar dados, significa armazen-los numa forma adequada de modo a facilitar sua pesquisa,
ou busca, e assim tornar mais gil a recuperao das informaes.
O conceito de um conjunto ordenado de elementos tem importncia
tanto na informtica como em nossa vida cotidiana. Imagine quo complicado seria localizar um nmero de telefone num catlogo se o mesmo no
fosse classificado por ordem alfabtica nem por endereo. O processo de
busca somente facilitado porque existe uma ordenao relacionada; observe no exemplo citado que, se temos o nmero de um telefone e desejamos
identificar seu proprietrio, ou seu endereo, a pesquisa seria complexa
caso no existisse uma ordenao numrica, crescente ou decrescente, destes telefones. Em geral, a lista de telefones nesta ordem no existe porque
esta uma consulta incomum.
Aqui sero mostradas inicialmente as tcnicas clssicas de classificao de dados, seguidas pelos mtodos usuais de pesquisa. Em todos os
procedimentos descritos utilizam-se estruturas de dados conhecidas, como
vetores, matrizes, rvores, listas, pilhas e filas. Os algoritmos correspondentes a estes procedimentos so apresentados numa forma de programa
estruturado, sendo ao final apresentados alguns algoritmos de ordenao,
na linguaguem de programao "C". Nosso propsito que o leitor entenda
com facilidade a metodologia empregada.
Adiantamos tambm que uma classificao dita interna se os dados
puderem ser totalmente armazenados na memria principal e dita externa se parte deles estiverem, durante o processo de ordenao, num meio de
Pesq_Ord_de_Dados 9
9
22/04/13 14:53
2. Armazenamento de Informaes
Na prtica o processo de ordenao no se resume apenas a classificar
dados isolados. Embora a maioria das abordagens a este tema sempre seja
feita com valores numricos, por motivos didticos, devemos estar cientes
que as aplicaes representam informaes em forma de registro, ou coleo de dados, que em geral contm um campo especial chamado chave
que o valor a ser ordenado que pode ser numrico ou no. No caso geral
podemos cham-lo de alfanumrico correspondendo a uma sequncia de
caracteres (letras, dgitos ou especiais) que so geralmente armazenados
em oito bits usualmente codificados em ASCII (American Standard Code for
Information Interchange).
Assim, quando um algoritmo de ordenao, aps a comparao de
duas chaves, necessita troc-las de posio necessrio trocar tambm
todos os dados correspondentes acoplados a cada chave. Numa ordenao
ascendente (do menor para o maior) do exemplo abaixo, se K1>K 2 ento, os
campos Nome e Endereo do registro R1 devem ser permutados pelos
respectivos campos de R 2 , ou seja, os registros trocam de posio (R1R 2).
Chave
Nome
Endereo
...
...
R1 (posio i)
K1
.
.
.
.
.
.
.
.
R2 (posio j)
K2
Guilherme Viana
...
...
...
...
Luan Lima
...
i 1
i
...
...
...
...
i +1
.
.
j 1
...
j +1
Para permutar dois registros h necessidade de se utilizar uma varivel auxiliar que tem a mesma estrutura dos registros, conforme mostrado
na Figura 1.2.
10
Pesq_Ord_de_Dados 10
22/04/13 14:53
R(aux)
Chave
Nome
Endereo
R1R 2;
R 2R(aux);
3. Procedimentos e Funes
3.1 Blocos de Comandos
Um bloco uma parte delimitada de um algoritmo que contm comandos. Um comando pode ser de atribuio, ou uma declarao de entrada ou sada, ou uma estrutura de controle, ou de repetio, ou ainda pode
referenciar uma chamada a outros blocos. Os blocos, organizados de forma
indentada, podem ser aninhados conforme mostrado na Figura 1.3.
Pesq_Ord_de_Dados 11
11
22/04/13 14:53
ALGORITMO <nome>
// <comentrios>
ENTRADA: <lista de variveis>
SADA: <lista de variveis>
BLOCO
// <comentrios>
COMANDOS
BLOCO
// <comentrios>
COMANDOS
FIM {nome}
Figura 1.3: Estrutura geral de um algoritmo
3.2 Procedimentos
Um procedimento um bloco criado atravs de uma declarao que
o associa a um nome ou identificador para que seja feita sua chamada ou
referncia. O uso de procedimentos possibilita que um bloco usado repetidas vezes em vrios pontos do algoritmo possa ser escrito uma nica vez e
chamado quando necessrio.
A forma de um procedimento mostrada na Figura 1.4.
PROCEDIMENTO <nome> (parmetros)
// <comentrios>
ENTRADA: <lista de variveis>
SADA: <lista de variveis>
BLOCO
// <comentrios>
COMANDOS
BLOCO
// <comentrios>
COMANDOS
RETORNE
FIM {nome}
O procedimento um objeto esttico, no sentido de que para ser executado necessrio que seja ativado por uma chamada pelo seu <nome> a
partir do mdulo principal do algoritmo ou atravs de outro procedimento
num nvel hierrquico superior.
Atravs dos parmetros possvel a transferncia de dados entre os
mdulos envolvidos. Cada parmetro pode armazenar um nico valor se a
varivel corresponde simples ou vrios valores se for uma varivel estruturada de forma homognea com uma ou mais dimenso.
12
Pesq_Ord_de_Dados 12
22/04/13 14:53
F = F * i
// fim para
FAT = F
DEVOLVA FAT
FIM {FAT}
Pesq_Ord_de_Dados 13
13
22/04/13 14:53
14
Pesq_Ord_de_Dados 14
22/04/13 14:53
BLOCO
// Desvio Duplo
SE < condio >
BLOCO-1
SENO
BLOCO-2
// Desvio Mltiplo
CASE < expresso-teste >
<lista-1>: BLOCO-1
<lista-2>: BLOCO-2
. . .
<lista-n>: BLOCO-n
Estruturas de Repetio:
// Com teste no fim do bloco
FAA
BLOCO
BLOCO
Pesq_Ord_de_Dados 15
15
22/04/13 14:53
mn,
calcular o valor de
m!
m
=
n n !(m n)!
Utilizar a funo FAT definida em 3.4.a (Algoritmo 1.1).
ALGORITMO BINMIO
ENTRADA: INTEIROS m E n
SADA: REAL b COM O VALOR BINOMIAL
PROCEDIMENTO TROCA ( x , y )
ENTRADA: INTEIROS x E y
SADA: x E y COM VALORES TROCADOS
w = x
x = y
y = w
RETORNA
FIM {TROCA}
FUNO FAT (n)
FIM {FAT}
SE m < n
TROCA ( m , n )
b = FAT (m) / ( FAT (n) * FAT (m-n) )
FIM {BINMIO}
Algoritmo 1.3: Calcula o Binmio de Newton
16
Pesq_Ord_de_Dados 16
22/04/13 14:53
Captulo
Ordenao Interna
Objetivos:
Definir o problema da ordenao
Apresentar os mtodos de classificao interna
Analisar a complexidade dos algoritmos de ordenao
Pesq_Ord_de_Dados 17
22/04/13 14:53
Pesq_Ord_de_Dados 18
22/04/13 14:53
Apresentao
Neste captulo iniciamos definindo formalmente o problema da ordenao e os principais critrios de classificao de dados. Em seguida,
apresentamos em detalhes os mtodos de ordenao interna, discutindo
sua eficincia em termos de consumo de tempo e de memria e outros aspectos relevantes. Na ordem, abordaremos os mtodos Bolha, Insero e
Seleo que so bastante simples e servem para introduzir ideias a serem
utilizadas em outros mtodos mais eficientes. Seguimos com os mtodos
Shellsort, Mergesort, Quicksort e Heapsort, considerados superiores aos
anteriores, tambm, como eles, baseados na operao de comparao. Por
fim, discutiremos os mtodos Countingsort, Bucketsort e Radixsort que
tm em comum o fato de no utilizarem a operao de comparao e, sob
algumas hipteses, eles ordenam em tempo linearmente proporcional ao
tamanho da lista.
1. Ordenao Interna
Como dito no captulo anterior, a ordenao de dados um dos problemas mais importantes e mais estudados dentro da cincia da computao.
Em diversas situaes cotidianas preciso colocar uma lista em ordem
para facilitar a busca de informaes nela contidas.
Neste captulo discorremos sobre os principais critrios de ordenao,
definindo antes, na seo 2, formalmente o problema da ordenao. Nas sees seguintes so apresentados em detalhes os diversos mtodos de ordenao interna. Para cada um deles mostrada sua eficincia em termos de
consumo de tempo e de memria e outros aspectos considerados relevantes.
Inicialmente, nas sees 3, 4 e 5, abordaremos os mtodos Bolha,
Insero e Seleo. Tais mtodos, considerados inferiores, so bastante simples, mas introduzem ideias que servem de base para outros mtodos mais
eficientes. Esses mtodos utilizam como uma de suas operaes bsicas a
comparao de elementos da lista.
Em seguida, nas sees 6, 7, 8 e 10, apresentaremos os mtodos
Shellsort, Mergesort, Quicksort e Heapsort. Esses mtodos, considerados
superiores, utilizam estratgias mais sofisticadas como, por exemplo, diviso e conquista e o uso de estruturas de dados conhecidas como heaps
binrios, descritos na Seo 9. Esses mtodos tambm so baseados na
operao de comparao.
Por fim, nas sees 11, 12 e 13, discutiremos os mtodos Countingsort,
Bucketsort e Radixsort. Esses ltimos mtodos tm em comum o fato de no
utilizarem a operao de comparao. Alm disso, sob certas hipteses, eles
ordenam em tempo linearmente proporcional ao tamanho da lista.
Pesq_Ord_de_Dados 19
19
22/04/13 14:53
2. O Problema da Ordenao
Aquilo
que
definimos
como ordem crescente
chamada por alguns autores de ordem no decrescente enquanto que o
que chamamos de ordem
estritamente crescente
chamada por esses mesmos autores de ordem
crescente. O que chamamos de ordem decrescente chamada por alguns
de ordem no crescente
enquanto que a ordem
estritamente decrescente
chamada de ordem decrescente.
20
Para que uma lista possa ser ordenada os seus elementos devem ser
comparveis dois a dois. Isso significa que dados dois elementos da lista
deve ser sempre possvel determinar se eles so equivalentes ou se um deles
menor que o outro. A idia associada ao termo menor depende do critrio de comparao utilizado.
Diz-se que uma lista est em ordem crescente se cada um de seus
elementos menor ou igual ao seu sucessor segundo algum critrio de
comparao. A definio de ordem decrescente anloga. Como dito, uma
lista somente pode ser colocada em ordem se os seus elementos forem dois
a dois comparveis. O problema da ordenao consiste em, dada uma lista,
coloc-la em ordem crescente ou decrescente. Os principais critrios so
comparao numrica, comparao alfabtica e comparao cronolgica.
Comparao numrica: um nmero x menor do que um nmero y
se a expresso x y resulta em um nmero negativo. Esse o tipo
mais comum de comparao e, de certa forma, todos os demais critrios de comparao derivam dele.
Comparao alfabtica: um caractere menor do que outro se precede esse outro na ordem do alfabeto. Por exemplo, o caractere a
precede o b, o b precede o c e assim por diante. No computador,
os caracteres so representados atravs de nmeros (segundo alguma codificao, por exemplo, ASCII, UNICODE etc). Dessa forma, a
comparao entre caracteres acaba sendo uma comparao entre os
seus cdigos numricos e, portanto, uma comparao numrica.
Comparao cronolgica: Uma data menor do que outra se ela antecede essa outra. Uma data pode ser representada atravs de trs
nmeros, um para representar o ano, outro para o ms e outro para
o dia. Ao comparar uma data com outra, comparamos o ano. Em
caso de empate, comparamos o ms. Em caso de novo empate, comparamos o dia. Sendo assim, a comparao cronolgica tambm
feita comparando-se nmeros.
possvel definir outros critrios de comparao. Por exemplo, podemos comparar caixas, considerando menor aquela que apresentar menor
volume. Como o volume expresso por um nmero, esse tipo de comparao tambm uma comparao numrica.
Poderamos, no entanto, considerar uma caixa menor do que outra
se ela cabe nessa outra. Nesse caso, podemos ter caixas incomparveis.
Utilizando esse critrio de comparao, podemos ter uma lista de caixas
que no pode ser ordenada. Alm disso, quando temos listas heterogneas, pode no ser possvel orden-la. Por exemplo, a lista (4, bola, 2,
15/02/2011) no pode ser ordenada, pois seus elementos no so todos
dois a dois comparveis.
Dizemos que uma lista est em ordem crescente se cada elemento da
lista menor ou igual (segundo o critrio de comparao adotado) ao seu sucessor. Se cada elemento da lista estritamente menor do que seu sucessor,
dizemos que a lista est em ordem estritamente crescente. Analogamente,
dizemos que uma lista est em ordem decrescente se cada elemento da lista
maior ou igual ao seu sucessor. Se cada elemento da lista estritamente
maior do que seu sucessor, dizemos que a lista est em ordem estritamente
decrescente. Obviamente, ordenao estrita somente possvel se todos os
elementos da lista forem distintos.
Pesq_Ord_de_Dados 20
22/04/13 14:53
3. Bolha
O Mtodo Bolha bastante simples e intuitivo. Nesse mtodo os elementos da lista so movidos para as posies adequadas de forma contnua,
assim como uma bolha move-se num lquido. Se um elemento est inicialmente numa posio i e, para que a lista fique ordenada, ele deve ocupar a
posio j, ento ele ter que passar por todas as posies entre i e j.
Em cada iterao do mtodo, percorremos a lista a partir de seu incio comparando cada elemento com seu sucessor, trocando-os de posio
se houver necessidade. possvel mostrar que, se a lista tiver n elementos,
aps no mximo (n1) iteraes a lista estar em ordem. A seguir fornecemos uma descrio em pseudocdigo do Bolha.
ALGORITMO BOLHA
ENTRADA: UM VETOR L COM N POSIES
SADA: O VETOR L EM ORDEM CRESCENTE
PARA i = 1 at n - 1
PARA j = 0 at n 1 - i
SE L[j] > L[j+1]
AUX = L[j] // SWAP
L[j] = L[j+1]
L[j+1] = AUX
FIM {BOLHA}
Algoritmo 2.1: Bolha
Pesq_Ord_de_Dados 21
21
22/04/13 14:53
22
Comparaes
0
1
...
n1
n2
...
n1
Total
(n - n)/2
2
Pesq_Ord_de_Dados 22
22/04/13 14:53
Lista original
1 iterao
2 iterao
3 iterao
4 iterao
5 iterao
0
9
4
4
4
4
4
1
4
5
5
5
5
5
2
5
9
5
5
5
5
3
10
5
8
8
8
8
4
5
8
9
9
9
9
5
8
10
10
10
10
10
Pesq_Ord_de_Dados 23
23
22/04/13 14:53
4. Insero
O Mtodo Insero, tambm conhecido como Insero Direta, bastante simples e apresenta um desempenho significativamente melhor que
o Mtodo Bolha, em termos absolutos. Alm disso, como veremos no final
dessa seo, ele extremamente eficiente para listas que j estejam substancialmente ordenadas.
Nesse mtodo consideramos que a lista est dividida em parte esquerda, j ordenada, e parte direita, em possvel desordem. Inicialmente, a parte
esquerda contm apenas o primeiro elemento da lista. Cada iterao consiste em inserir o primeiro elemento da parte direita (piv) na posio adequada da parte esquerda, de modo que a parte esquerda continue ordenada.
fcil perceber que se a lista possui n elementos, aps n 1 inseres ela
estar ordenada.
Para inserir o piv percorremos a parte esquerda, da direita para a
esquerda, deslocando os elementos estritamente maiores que o piv uma
posio para direita. O piv deve ser colocado imediatamente esquerda do
ltimo elemento movido.
ALGORITMO INSERO
ENTRADA: UM VETOR L COM N POSIES
SADA: O VETOR L EM ORDEM CRESCENTE
PARA i = 1 at n - 1
PIVO = L[i]
j = i - 1
ENQUANTO j 0 e L[i] > PIVO
L[j+1] = L[j]
j = j - 1
L[j+1] = PIVO
FIM {INSERO}
Algoritmo 2.3: Insero
24
Pesq_Ord_de_Dados 24
22/04/13 14:53
0
9
4
4
4
4
4
1
4
9
5
5
5
5
2
5
5
9
9
5
5
3
4
5
10 5
8
10 5
8
10 5
8
10 5
8
9 10 8
8
9 10
5. Seleo
O Mtodo Seleo tem como ponto forte o fato de que ele realiza poucas operaes de swap. Seu desempenho, em termos absolutos, costuma
ser superior ao do Mtodo Bolha, mas inferior ao do Mtodo Insero.
Assim como no Mtodo Insero, nesse mtodo consideramos que a
lista est dividida em parte esquerda, j ordenada, e parte direita, em possvel desordem. Alm disso, os elementos da parte esquerda so todos menores ou iguais aos elementos da parte direita.
Cada iterao consiste em selecionar o menor elemento da parte direita (piv) e troc-lo com o primeiro elemento da parte direita. Com isso, a
parte esquerda aumenta, pois passa a incluir o piv, e a parte direita diminui. Note que o piv maior que todos os demais elementos da parte esquerda, portanto a parte esquerda continua ordenada. Alm disso, o piv era o
menor elemento da parte direita e, portanto, continua sendo verdade que
os elementos da parte esquerda so todos menores ou iguais aos elementos
da parte direita. Inicialmente, a parte esquerda vazia. Se a lista possui n
elementos, aps n 1 iteraes ela estar ordenada.
ALGORITMO SELEO
ENTRADA: UM VETOR L COM N POSIES
SADA: O VETOR L EM ORDEM CRESCENTE
PARA i = 0 ate n - 2
MIN = i
PARA j = i + 1 at n - 1
SE L[j] < L[MIN]
MIN= j
TROCA(L[i], L[MIN])
FIM {SELEO}
Algoritmo 2.4: Seleo
Pesq_Ord_de_Dados 25
25
22/04/13 14:53
Lista original
1 iterao
2 iterao
3 iterao
4 iterao
5 iterao
0
10
2
2
2
2
2
1
4
4
3
3
3
3
2
5
5
5
4
4
4
3
3
3
4
5
5
5
4
10
10
10
10
10
10
5
2
10
10
10
10
10
6. Shellsort
O Mtodo Shellsort foi proposto por Donald Shell em 1959 e um
exemplo de um algoritmo fcil de descrever e implementar, mas difcil de
analisar. Uma explicao precisa para seu surpreendente desempenho
um dos enigmas que desafiam os pesquisadores h dcadas.
Para descrever o Shellsort com mais facilidade conveniente definir o
termo h-lista. Dada uma lista L, uma h-Lista de L uma sublista maximal
de L na qual cada elemento est a distncia h de seu sucessor. Por exemplo, para h = 3, a lista a seguir contm trs h-listas. A primeira h-lista
constituda dos elementos nas posies 0, 3 e 6 do vetor. A segunda h-lista
contm os elementos nas posies 1, 4 e 7. A terceira h-lista constituda
dos elementos nas posies 2 e 5.
0
10
1
4
2
5
3
3
4
10
5
2
6
1
7
12
26
Pesq_Ord_de_Dados 26
22/04/13 14:53
* H + 1
diviso inteira
Insero adaptado para h-listas
> PIVO
1
4
2
2
3
3
4
10
5
5
6
10
7
12
7. Mergesort
Esse mtodo, proposto por John Von Neumann em 1945, baseado
numa estratgia de resoluo de problemas conhecida como diviso e conquista. Essa tcnica consiste, basicamente, em decompor a instncia a ser
resolvida em instncias menores do mesmo tipo de problema, resolver tais
instncias (em geral, recursivamente) e por fim utilizar as solues parciais
para obter uma soluo da instncia original.
Naturalmente, nem todo problema pode ser resolvido atravs de diviso e conquista. Para que seja vivel aplicar essa tcnica a um problema ele
deve possuir duas propriedades estruturais. O problema deve ser decompoPESQUISA E ORDENAO DE DADOS
Pesq_Ord_de_Dados 27
27
22/04/13 14:53
28
Pesq_Ord_de_Dados 28
22/04/13 14:53
PROCEDIMENTO MERGE
ENTRADA: UM VETOR L E AS POSIES INICIO, MEIO E FIM
(L TEM QUE ESTAR EM ORDEM CRESCENTE DA POSIO
INICIO AT MEIO E DA POSIO MEIO + 1 AT FIM)
SADA: O VETOR L EM ORDEM CRESCENTE DA POSIO INICIO AT
A POSIO FIM
i = inicio, j = meio + 1, k = 0
ENQUANTO i meio e j fim
SE L[i] L[j]
AUX[k] = L[i], i = i + 1
SENAO
AUX[k] = L[j], j = j + 1
k = k + 1
SE i meio
PARA j = meio at i(passo -1)
L[fim-meio+j] = L[j]
PARA i=0 ate k-1
L[i+inicio] = AUX[i]
FIM {MERGE}
Algoritmo 2.7: Procedimento Merge
Uma anlise cuidadosa desse procedimento nos leva a concluir que ele
requer tempo linearmente proporcional ao tamanho do intervalo. Vamos chamar de n o tamanho do intervalo, ou seja, n = fim inicio + 1. Observe que
a condio do primeiro lao somente verdadeira se i meio e j fim. Logo,
para que o lao continue e ser executado preciso termos i + j meio + fim.
Observe que inicialmente i + j = inicio + meio + 1. Como a cada iterao
do primeiro lao ou i ou j incrementado, aps n 1 iteraes teremos:
i
i
i
i
+
+
+
+
j
j
j
j
=
=
=
=
inicio + meio + 1 + n 1
inicio + meio + n
inicio + meio + fim inicio + 1
meio + fim + 1
Pesq_Ord_de_Dados 29
29
22/04/13 14:53
...
10
11
12
13
14
15
16
17
13
INICIO
AUX
...
MEIO
...
FIM
10
11
12
13
14
15
16
17
13
INICIO
...
FIM
Como o Algoritmo Mergesort foi descrito de maneira recursiva, podemos facilmente fazer sua anlise utilizando frmulas de recorrncia. Para
isso, vamos denotar por T(n) o tempo requerido para ordenar um intervalo
de tamanho n. Sendo assim o tempo necessrio para ordenar um intervalo
de tamanho n/2 ser T(n/2). Como o Procedimento Merge requer tempo
linear, podemos supor que ele requer tempo cn (onde c uma constante
positiva). Temos ento a seguinte frmula de recorrncia para T:
T(n) = 2T(n/2) + cn
T(1) = c
Podemos resolver essa frmula facilmente utilizando o mtodo da iterao supondo n = 2k. A partir da recorrncia original, podemos obter as
seguintes recorrncias:
T(n) = 2T(n/2) + cn
2T(n/2) = 4T(n/4) + cn
4T(n/4) = 8T(n/8) + cn
...
2k-1T(n/2k-1) = 2k T(n/2k) + cn
2k T(n) = 2kc
Somando tais frmulas chegamos a T(n) = cnk + 2kc. Lembre-se de
que supomos n = 2k, logo, k = log 2n. Sendo assim, T(n) = cnlog 2n + cn.
Conclumos que a complexidade temporal do Algoritmo Mergesort pertence a (n log n).
Vamos agora denotar por E(n) o espao extra de memria requerido
para ordenar um intervalo de tamanho n. Como o Procedimento Merge requer espao linear e a memria utilizada numa chamada recursiva pode
30
Pesq_Ord_de_Dados 30
22/04/13 14:53
8. Quicksort
Esse mtodo, desenvolvido em 1960 por C. A. R. Hoare e publicado
em 1962, talvez o mais utilizado de todos os mtodos de ordenao. Isso
ocorre porque quase sempre o Quicksort significativamente mais rpido
do que todos os demais mtodos de ordenao baseados em comparao.
Alm disso, suas caractersticas fazem com que ele, assim como o Mergesort, possa ser facilmente paralelizado. Ele tambm pode ser adaptado para
realizar ordenao externa (Quicksort Externo).
Um aspecto que torna o Quicksort muito interessante sob o ponto de
visto terico o fato de que, embora em geral ele seja extremamente rpido,
existem casos (muito raros, verdade) em que seu desempenho bem ruim,
chegando a ser pior do que o de mtodos de ordenao considerados inferiores como os mtodos Bolha, Insero e Seleo.
Assim como o Mergesort, o Quicksort tambm baseado na estratgia
de diviso e conquista. Ocorre que, enquanto no Mergesort a fase de diviso
trivial e a fase de conquista trabalhosa, no Quicksort, com veremos a
seguir, acontece o contrrio, a fase de diviso trabalhosa e a fase de conquista trivial.
Nesse mtodo, a lista dividida em parte esquerda e parte direita, sendo que os elementos da parte esquerda so todos menores que os elementos
da parte direita, conforme mostrado na Figura 2.7. Essa fase do mtodo
chamada de partio.
Em seguida, as duas partes so ordenadas recursivamente (usando o
prprio Quicksort). A lista estar ento ordenada.
Uma estratgia para fazer a partio escolher um valor como piv e
ento colocar na parte esquerda os elementos menores ou iguais ao piv e
na parte direita os elementos maiores que o piv.
Embora existam diversas maneiras de escolher o piv, algumas das
quais sero apresentadas nessa seo, adotaremos a princpio uma estratgia extremamente simples, mas que costuma apresentar resultados prticos muito bons. Alm disso, tal estratgia facilita perceber os casos em
que o procedimento de partio no divide a lista de maneira equilibrada.
Dessa forma, torna-se mais fcil caracterizar e analisar o pior caso do Mtodo Quicksort.
Utilizaremos como piv o primeiro elemento da lista. Nesse caso, o
piv deve ser colocado entre as duas partes. O Procedimento Partio, que
implementa tal estratgia, descrito no Algoritmo 2.8.
Pesq_Ord_de_Dados 31
31
22/04/13 14:53
...
PIV
INICIO
PIV
j
> PIV
FIM
...
PROCEDIMENTO PARTIO
ENTRADA: UM VETOR L E AS POSIES INICIO E FIM
SADA:j, tal que L[INICIO]..L[j-1] L[j] e
L[j+1]..L[FIM] > L[j]
// j a posio onde ser colocado o piv, como
// ilustrado na figura abaixo
No Procedimento Partio a varivel i avana at encontrar um elemento maior do que o piv e a varivel j recua at encontrar um elemento
menor ou igual ao piv. feita ento a troca do elemento que est na posio i com o elemento que est na posio j. Esse processo repetido at
termos i > j. Para finalizar, o piv colocado entre as duas partes fazendo
troca(L[INICIO], L[j]). A posio j devolvida ao chamador do procedimento.
A regio crtica do Procedimento Partio constituda dos dois laos
mais internos, sendo n o tamanho do intervalo. Observe que inicialmente
j i = n 2. Note ainda que a cada iterao de um dos laos internos ou i
incrementado ou j decrementado. Isso significa que a cada iterao de um
desses laos a expresso j i decrementada de uma unidade. Consequentemente, aps no mximo n 1 iteraes desses laos teremos j i = -1 o que
implica que j ser menor do que i. O lao ser ento finalizado. Conclumos
que o Procedimento Partio requer tempo linear. Claramente, esse procedimento tem complexidade espacial constante.
Na Figura 2.8 ilustrada a partio de uma lista. Observe que nesse
exemplo que a partio ficou equilibrada, pois quatro elementos ficaram
esquerda do piv e trs elementos ficaram direita do piv.
...
10
11
12
13
14
15
16
17
INICIO
...
FIM
1 troca
2 troca
3 troca
32
Pesq_Ord_de_Dados 32
22/04/13 14:53
...
10
11
12
13
14
15
16
17
...
Nesse exemplo, percebemos que o Procedimento Partio pode inverter a ordem existente entre os elementos repetidos. Consequentemente, o
Quicksort no-estvel.
Se o elemento escolhido como piv for o maior elemento do intervalo,
teremos uma partio desequilibrada, como ilustrado na Figura 2.9. Note
que apenas uma troca ser executada.
...
10
11
12
13
14
15
16
17
INICIO
...
...
FIM
10
11
12
13
14
15
16
17
...
Pesq_Ord_de_Dados 33
33
22/04/13 14:53
T(n) = T(n 1) + cn
T(1) = c
Essa frmula pode ser facilmente resolvida resultando em T(n) = (n2 - n)/2.
A complexidade espacial do Quicksort no pior caso dada por:
E(n) = E(n 1) + c
E(1) = c
34
Pesq_Ord_de_Dados 34
22/04/13 14:53
que linear. No entanto, em termos absolutos, o tempo requerido pela partio aumentar. Alm disso, o piv poder no ser um elemento do intervalo e
isso exigir algumas alteraes adicionais do Procedimento Partio.
No ltimo caso temos a verso conhecida como Quicksort probabilstico. A principal vantagem dessa verso o fato de tornar impossvel garantir que o Quicksort vai requerer tempo quadrtico para uma determinada
lista. Como vimos anteriormente, ao escolher deterministicamente o piv,
possvel que algum disposto a degradar a performance Quicksort construa
listas para as quais seu desempenho seja quadrtico. Isso no mais possvel na verso probabilstica do algoritmo.
9. Heaps Binrios
Um heap uma coleo de dados parcialmente ordenados. Num heap
crescente vlida a seguinte propriedade: o pai menor ou igual aos seus
filhos. Num heap decrescente, temos a propriedade anloga: o pai maior
ou igual aos seus filhos. Existem diversos tipos de heaps: binrios, binomiais, de Fibonacci etc. Abordaremos apenas heaps binrios.
Um heap binrio se caracteriza pelo fato de que cada elemento possui
no mximo dois filhos. Podemos implementar heaps binrios usando uma
rvore binria, conforme mostra a Figura 2.10. Tal rvore ter todos os
nveis completos, com exceo do ltimo nvel, que pode estar incompleto.
Alm disso, os nveis so preenchidos da esquerda para a direita.
3
10
2
5
3
3
4
7
5
10
Pesq_Ord_de_Dados 35
35
22/04/13 14:53
x (l-se cho de x) o
maior inteiro que menor
ou igual a x.
//HEAP OVERFLOW
// DIVISO INTEIRA
3
1
5
2
3
3
10
10
7
8
10
10
novo valor
2 movimentao
1 movimentao
36
Pesq_Ord_de_Dados 36
22/04/13 14:53
Para remover o menor elemento de um heap binrio crescente implementado num vetor, movemos o ltimo valor contido no heap (piv) para a
posio 1 do vetor. Em seguida, comparamos o piv com seus filhos, trocando-o com o menor de seus filhos se houver necessidade. Esse procedimento
repetido at que o piv seja menor ou igual aos seus filhos ou at o piv
atingir uma posio que no tenha filhos.
ALGORITMO REMOVE_MENOR
ENTRADA: UM HEAP BINRIO CRESCENTE H
SADA: SE H NO ESTIVER VAZIO, REMOVE E DEVOLVE O MENOR
ELEMENTO DE H; CASO CONTRRIO; DEVOLVE UM ERRO
SE H.ultima = 0 //HEAP UNDERFLOW
devolva ERRO e PARE
valor= H.vetor[1]
H.vetor[1] = H.vetor[H.ultima]
H.ultima = H.ultima - 1
i = 1
ENQUANTO (2*i H.ultima e H.vetor[i] > H.vetor[2*i]) ou
(2*i < H.ultima e H.vetor[i] > H.vetor[2*i+1])
menor = 2*i
SE 2*i < H.ultima e H.vetor[2*i+1] H.vetor[2*i]
menor= menor+1
TROCA(H.vetor[i], H.vetor[menor])
i = menor
DEVOLVA valor
FIM {REMOVE_MENOR}
A Figura 2.13 mostra a remoo do menor elemento de um heap binrio crescente. Observe que aps mover o valor 10 para a primeira posio
do vetor, precisamos troc-lo com o valor 3 e depois com o valor 6 para
restaurar a ordenao parcial do heap. Note ainda que a remoo do menor
elemento pode inverter a ordem entre elementos repetidos.
1
2
1
4
2
4
1 troca
3
3
6
2 troca
10
10
10
10
1 movimentao
Seja n = h.ultima. Observe que h.ultima / 2 possui log2n bits significativos. Inicialmente, a varivel i possui apenas um bit significativo. A cada
iterao do lao, i ganha um bit significativo. Aps log2n iteraes, i ter
log2n + 1 bits significativos e, portanto, teremos i > h.ultima/2. Consequentemente, o lao ser finalizado. Conclumos que o Algoritmo Remove_Menor
requer tempo O(log n).
Pesq_Ord_de_Dados 37
37
22/04/13 14:53
10. Heapsort
Podemos usar heaps binrios para ordenar com bastante eficincia
e elegncia. O Mtodo Heapsort baseado no uso de heap binrio. Inicialmente, inserimos os elementos da lista num heap binrio crescente. Em seguida, fazemos sucessivas remoes do menor elemento do heap, colocando
os elementos removidos do heap de volta na lista. A lista estar ento em
ordem crescente.
ALGORITMO HEAP SORT
ENTRADA: UM VETOR L COM N POSIES
SADA: O VETOR L EM ORDEM CRESCENTE
inicialize um HBC H com n posies
PARA i = 0 at n - 1
INSERE_HBC(H, L[i])
PARA i = 0 at n - 1
L[i] = REMOVE_MENOR(H)
FIM {HEAP SORT}
Algoritmo 2.12: Heapsort
11. Countingsort
denota complexidade no
melhor caso.
38
Esse mtodo foi proposto por Harold H. Seward em 1954 e faz a ordenao usando a ideia de contagem. Uma restrio desse mtodo que ele
somente ordena listas de nmeros naturais.
Essa no uma restrio muito severa, pois podemos converter diversos tipos de listas em listas de nmeros naturais. Por exemplo, uma
lista de nmeros inteiros onde o menor valor -x pode ser convertida numa
lista de nmeros naturais somando x a cada elemento da lista. Uma lista
de nmeros racionais pode ser convertida numa lista de nmeros inteiros
multiplicando-se os elementos da lista por uma constante apropriada.
De fato, sempre que existir uma bijeo entre o tipo dos dados da lista
e um subconjunto dos naturais possvel converter a lista em uma lista de
nmeros naturais. Infelizmente, algumas dessas converses podem ter um
impacto negativo sobre o desempenho do mtodo.
Pesq_Ord_de_Dados 38
22/04/13 14:53
INICIALIZACAO DE C
CONTAGEM
SOMA ACUMULADA
ORDENACAO
COPIANDO AUX PARA L
Pesq_Ord_de_Dados 39
39
22/04/13 14:53
Lista original
Vetor C
1 lao
2 lao
3 lao
4 lao
5 lao
Vetor aux
0
8
1
4
2
5
3
3
4
8
5
2
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
1
0
1
0
2
0
2
1
2
1
2
0
2
0
3
0
3
1
3
2
3
1
3
1
4
0
4
1
4
3
4
2
4
2
5
0
5
1
5
4
5
3
5
3
0
2
1
3
2
4
3
5
4
8
5
8
6
0
6
0
6
4
6
4
6
4
7
0
7
0
7
4
7
4
7
4
8
0
8
2
8
6
8
4
8
4
12. Bucketsort
Embora esse mtodo permita ordenar listas de nmeros quaisquer,
descreveremos uma verso desse mtodo que ordena listas de nmeros no
negativos.
Se a lista a ser ordenada tem n elementos, ser usado um vetor de
ponteiros (bucket) com n posies. Se o maior elemento da lista k, cada
posio do bucket apontar para uma lista encadeada na qual sero inseridos os elementos da lista que pertencem ao intervalo [ i * (k + 1) / n , (i + 1)
* (k + 1) / n). Observe que o intervalo fechado esquerda e aberto direita.
A ideia do mtodo dividir o intervalo que vai de 0 at k em n subintervalos de mesmo tamanho. Cada subintervalo estar associado a uma
lista ligada que ir conter os elementos da lista que pertencem quele subintervalo. Por exemplo, se a lista tem oito elementos o maior deles 71,
teremos oito intervalos: [0, 9), [9, 18), ..., [63, 72). A posio zero do bucket
apontar para uma lista encadeada que ir conter os elementos da lista que
so maiores ou iguais a zero e menores que 9, e assim por diante.
Chamaremos o bucket de vetor B. Para construir as listas encadeadas
devemos inserir cada valor j contido na lista a ser ordenada na lista encadeada apontada por B[ j * n / (k + 1)]. Em seguida, ordenamos as listas encadeadas com um mtodo de ordenao qualquer (de preferncia estvel). Aps
isso, a concatenao das listas encadeadas produz a lista original ordenada.
ALGORITMO BUCKET SORT
ENTRADA: UM VETOR L CONTENDO N NMEROS NO INTERVALO DE
0 AT K
SADA: O VETOR L EM ORDEM CRESCENTE
PARA i = 0 at n - 1 //INICIALIZACAO
B[i] = NULO
//CONSTRUINDO AS LISTAS ENCADEADAS
PARA i = n - 1 at 0 (PASSO -1)
insira L[i] no inicio da lista ligada apontada por
B[L[i] * n / (K + 1)]
// DIVISO INTEIRA
//ORDENANDO E CONCATENANDO AS LISTAS ENCADEADAS
j = 0
PARA i = 0 at n - 1
40
Pesq_Ord_de_Dados 40
22/04/13 14:53
53 12
12
12
12
28
40
53
71
Lista original
28
71 40
2
Bucket
6
7
13. Radixsort
Esse mtodo permite ordenar listas cujos elementos sejam comparveis dois
a dois. Uma verso desse mtodo foi utilizada em 1887 por Herman Hollerith,
fundador da Tabulating Machine Company que mais tarde deu origem IBM.
PESQUISA E ORDENAO DE DADOS
Pesq_Ord_de_Dados 41
41
22/04/13 14:53
Podemos adaptar o Countingsort e utiliz-lo como subrotina no Radixsort. Observe que os elementos da lista so constitudos de smbolos de
algum alfabeto. Por exemplo, se a lista contm nmeros decimais, o alfabeto
formado pelos dgitos do sistema numrico decimal. Note que o maior smbolo encontrado numa posio de um elemento no excede o maior smbolo
do alfabeto. Como o tamanho do alfabeto constante, podemos garantir que
a complexidade temporal e a complexidade espacial dessa verso do Countingsort pertencem a (n).
Outra possibilidade seria adaptar o Bucketsort e utiliz-lo como subrotina. Para isso, o bucket dever ter uma posio para cada elemento do
alfabeto. No haver necessidade de ordenar as listas encadeadas visto que
cada uma delas contm apenas elementos com o mesmo smbolo na posio
que est sendo ordenada. Podemos ento garantir que a complexidade temporal dessa verso do Bucketsort ser (n).
Note que tanto o Countingsort quanto o Bucketsort so estveis. Utilizando qualquer um deles como subrotina, o Radixsort ter complexidade
temporal (dn) e complexidade espacial (n). Se d for constante a complexidade temporal ser (n). Note que o Radixsort necessariamente estvel,
qualquer que seja o mtodo usado como subrotina.
32
500
500
500
431
32
431
32
431
32
248
9
32
32
48
Ordenando
pela
unidade
63
Ordenando
pela
dezena
32
ordenando
pela
centena
63
32
248
248
248
63
48
48
431
48
63
500
42
Pesq_Ord_de_Dados 42
22/04/13 14:53
Complexidade temporal
Melhor caso
Pior caso
Caso mdio
(n2)
(n2)
(n2)
Complexidade
estvel?
espacial
O(1)
Sim
Pesq_Ord_de_Dados 43
43
22/04/13 14:53
44
Pesq_Ord_de_Dados 44
22/04/13 14:53
Captulo
Ordenao Externa
Objetivos:
Pesq_Ord_de_Dados 45
22/04/13 14:53
Pesq_Ord_de_Dados 46
22/04/13 14:53
Apresentao
No incio deste captulo indicamos que quando os arquivos a serem
classificados no podem ser armazenados integralmente na memria principal, impossvel realizar uma ordenao interna atravs de um dos mtodos definidos no captulo anterior. Mostramos tambm que, para resolver este problema, o arquivo original deve ser dividido em partes menores,
de tamanho tal que a classificao interna seja suportada e que a seguir
estas partes, ordenadas, devem ser intercaladas. Apresentamos ento as
formas eficientes de se processar uma intercalao destacando que os mtodos abordados objetivam minimizar o nmero de leitura e gravao dos
registros de cada parte armazenada em disco magntico, chamada rea de
trabalho. So, por fim, indicados os principais fatores que influem na eficincia de um algoritmo de classificao de forma geral, ou seja, usando a
ordenao interna e se necessrio a externa.
1. Definio e mecanismos
Quando os arquivos a serem classificados contm muitos registros,
de modo que no podem ser contidos integralmente na memria principal,
impossvel realizar uma ordenao interna atravs de um dos mtodos
definidos no captulo anterior.
Para resolver este problema, o arquivo original deve ser dividido em
partes menores de tamanho tal que a classificao interna seja suportada.
Uma vez que as partes ou sries j estejam ordenadas elas so intercaladas
sucessivamente at que todas estejam presentes num arquivo final ordenado.
Neste captulo apresentaremos as formas eficientes de se processar
uma intercalao. Os mtodos abordados objetivam minimizar o nmero de
leitura e gravao dos registros de cada parte armazenada em disco magntico, chamada rea de trabalho. Os registros esto organizados nesta rea
de forma sequencial.
Os fatores que influem na eficincia de um algoritmo de classificao
geral so os seguintes:
Nmero de registros e tamanho de cada um deles;
Uso ou no da memria auxiliar (necessita ou no da ordenao
externa);
Tipos e meios de armazenamento utilizados;
Grau de classificao j existente e
Periodicidade de atualizao do arquivo.
Pesq_Ord_de_Dados 47
47
22/04/13 14:53
Arq1
R1
3
R2
7
Arq3
S1
1
S2
i=1
k=2
R3
9
S3
S4
Arq2
R4
11
R5
1
j=5
S5
S6
S7
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
48
Pesq_Ord_de_Dados 48
22/04/13 14:53
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=1
k=3
R3
9
S3
Arq2
R4
11
S4
j=6
S5
S6
R5
1
S7
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=2
k=4
R3
9
S3
5
Arq2
R4
11
S4
j=6
S5
S6
R5
1
S7
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=2
k=5
R3
9
S3
5
R4
11
S4
7
Arq2
S5
R5
1
j=7
S6
S7
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=3
k=6
R3
9
S3
5
Arq2
R4
11
S4
7
S5
8
R5
1
j=7
S6
S7
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=3
k=7
R3
9
S3
5
Arq2
R4
11
S4
7
j=8
S5
8
S6
9
R5
1
S7
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=4
k=8
R3
9
S3
5
Arq2
R4
11
S4
7
R5
1
j=8
S5
8
S6
9
S7
9
R6
5
S8
R7
8
S9
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=4
k=9
R3
9
S3
5
Arq2
R4
11
S4
7
R5
1
j=9
S5
8
S6
9
S7
9
R6
5
S8
11
S9
R7
8
R8
9
R9
12
R10
13
S10
Pesq_Ord_de_Dados 49
49
22/04/13 14:53
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=5
k=10
R3
9
R4
11
S3
5
Arq2
R5
1
j=9
S4
7
S5
8
S6
9
R6
5
S7
9
R7
8
S8
11
S9
12
R8
9
R9
12
R10
13
S10
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=5
k=11
R3
9
R4
11
S3
5
S4
7
Arq2
R5
1
j=10
S5
8
S6
9
R6
5
S7
9
R7
8
S8
11
S9
12
R8
9
S10
13
R9
12
R10
13
Arq1
R1
3
R2
7
Arq3
S1
1
S2
3
i=5
k=11
R3
9
S3
5
R4
11
S4
7
FIM
Arq2
R5
1
j=11
S5
8
S6
9
S7
9
R6
5
S8
11
R7
8
S9
12
R8
9
S10
13
R9
12
R10
13
( ponteiro i )
( ponteiro j )
( ponteiro k )
50
Pesq_Ord_de_Dados 50
22/04/13 14:53
i = 1; k = 1; j = m + 1
ENQUANTO ( i m E j n )
SE ( Ki Kj )
Sk = Ri
i = i + 1
SENO
Sk = Rj
j = j + 1
SE ( i > m )
ini = j
fim = n
SENO
ini = i
fim = m
PARA i = ini AT fim
Sk = R i
k = k + 1
// fim para
// fim enquanto
RETORNA
FIM {MERGE2}
Algoritmo 3.1: Merge2 Intercalao de dois caminhos
(
(
(
(
ponteiro
ponteiro
ponteiro
ponteiro
i )
j )
l )
k )
Uma vez atingido o fim de um dos arquivos, ser utilizada o procedimento Merge2, definido na seo 3.2, para intercalar os demais registros
dos outros dois arquivos. definida uma funo MENOR que identifica o
menor de trs valores numricos.
PROCEDIMENTO MERGE3 (R, S, p, q, N)
ENTRADA: INTEIROS p, q, N
Registro R com trs sries a intercalar
R1:p (primeira srie ordenada)
Rp+1:q (segunda srie ordenada)
Rq+1:N (terceira srie ordenada)
SADA: Registro S com uma nica srie ordenada
// S1:N (srie ordenada/intercalada)
Pesq_Ord_de_Dados 51
51
22/04/13 14:53
// Variveis auxiliares
K: vetor [1:n] de inteiros
i, j, k, l, m, n: ponteiros/contadores
FUNO MENOR ( X, Y, Z ): inteiro
ENTRADA: X, Y, Z inteiros
SADA: MENOR
// retorna 1 se o menor X
// retorna 2 se o menor Y
// retorna 3 se o menor Z
// Variveis auxiliares
v: vetor [1:3] de inteiros
w: inteiro
v[1] = X;
v[2] = Y;
v[3] = Z;
MENOR = 1;
w = v[1];
PARA i = 2 AT 3
SE v[i] < w
w = v[i]
MENOR = i
// fim para
DEVOLVA MENOR
FIM {MENOR}
i = 1;
k = 1;
j = p + 1;
ENQUANTO ( i p E j q E l n )
CASO MENOR( Ki , Kj , Kl )
1: Sk = Ri
i = i + 1
2: Sk = Rj
j = j + 1
3: Sk = Rl
l = l + 1
// fim caso
k = k + 1
l = q + 1
= q j + 1
= N - l + 1
> p )
= p i + 1
= N - l + 1
= p i + 1
= q j + 1
MERGE2 ( R, S, m, n )
// fim enquanto
RETORNA
FIM {MERGE3}
Algoritmo 3.2: Merge3 Intercalao de trs caminhos
52
Pesq_Ord_de_Dados 52
22/04/13 14:53
4. Intercalao de k caminhos
Num caso geral, o algoritmo para fazer a intercalao de k caminhos,
identificado como o procedimento Mergek, pode ser implementado de forma
similar ao algoritmo da seo 3.
Por exemplo, para o Merge4 (k=4), a funo MENOR selecionaria o
menor valor entre quatro nmeros e no momento em que fosse atingido o
fim de um dos arquivos, deveria ser chamado o procedimento Merge3 para
finalizar o processo de intercalao.
Porm, como j foi citado anteriormente, no comum a utilizao de
uma intercalao com mais de trs caminhos, devido a complexidade deste
algoritmo, mesmo sabendo que o nmero de leituras e gravaes poderia
ser reduzido.
Os algoritmos de classificao por intercalao de k caminhos so conhecidos como de distribuio equilibrada. Na seo seguinte faremos uma
comparao entre intercalaes equilibradas para diferentes valores de k.
Arq1
Arq2
R11000
R10012000
R20013000
R30014000
R40015000
R50016000
R60017000
Pesq_Ord_de_Dados 53
53
22/04/13 14:53
Arq3
Arq4
R12000
R20014000
R40016000
R60017000
Arq1
Arq2
Arq3
Arq4
R14000
R40017000
R17000
10
11
12
13
14
15
16
17
18
19
20
Ki
27
14
29
22
33
18
23
11
17
12
23
Arq1
Arq2
5-14-27
9-18-33
4-11-17
5-23
2-22-29
1-7-23
8-9-12
Arq3 2-5-14-22-27-29
Arq4 1-7-9-18-23-33
4-8-9-11-12-17
5-23
Arq1
1-2-5-7-9-14-18-22-23-27-29-33
Arq3
1-2-4-5-5-7-8-9-9-11-12-14-1718-22-23-23-27-29-33
Arq2
4-5-8-9-11-12-17-23
Arq4
54
Pesq_Ord_de_Dados 54
22/04/13 14:53
Arq1
Arq2
Arq3
Arq4
R11000
R10012000
R20013000
R30014000
R40015000
R50016000
R60017000
Arq1
Arq2
Arq3 R12000
Arq4 R20014000
(ponteiro)
R40016000
R60017000
Arq1
Arq2
Arq3
Arq4
S15000
R40016000
Arq1
Arq2
Arq3
Arq4
S17000
Fase-1
Fase-2
Fase-3
Fase-4
Total (L/G)
7.000
6.000
5.000
7.000
25.000
Pesq_Ord_de_Dados 55
55
22/04/13 14:53
Arq1
Arq2
Arq3
Arq4
Arq5
R11000
R10012000
R20013000
R30014000
R40015000
R50016000
R60017000
Fase-2 (Merge4 )
Arq1
Arq2
Arq3
Arq4
Arq5
R14000
R40015000
R50016000
R60017000
Fase-3 (Merge4 )
Arq4
R17000
Fase-2
4.000
Fase-3
7.000
Total (L/G)
18.000
6. Intercalao Polifsica
O objetivo deste tipo de intercalao distribuir as sries iniciais de
forma desequilibrada, de modo que menos passos sejam necessrios para
a classificao total.
Em funo do nmero de arquivos T a serem utilizados gerada uma
tabela de distribuio com base na Srie de Fibonacci. necessrio ento
que o algoritmo de classificao externa contenha uma tabela desta distribuio em funo do valor de T. Sabemos que, de modo similar intercalao
de mltiplos caminhos, para T arquivos devemos ter k = (T 1) caminhos.
A seguir mostramos as tabelas para alguns casos. Caso o nmero
de sries no esteja contido na tabela, considerar a distribuio imediatamente superior; isso acarreta que durante a fase de intercalao as sries
complementares sejam vazias, ou seja, j foi atingido seu final de arquivo.
56
Pesq_Ord_de_Dados 56
22/04/13 14:53
Por exemplo, na Tabela 3.1, caso o nmero de sries seja igual a 10, a distribuio usada seria a de nvel 5, ou 13 sries, sendo que nesse caso, 3 delas
seriam vazias.
Tabela 3.1: Distribuio polifsica para k=2 ( T=3 arquivos, usar o Merge2 )
Nvel
N
n+1
0
1
2
3
4
5
6
7
8
9
10
11
...
T1
a
a+b
1
1
2
3
5
8
13
21
34
55
89
144
...
T2
b
a
0
1
1
2
3
5
8
13
21
34
55
89
...
Sries
T
t+a
1
2
3
5
8
13
21
34
55
89
144
233
...
Tabela 3.2: Distribuio polifsica para k=3 ( T=4 arquivos, usar o Merge3 )
Nvel
N
n+1
0
1
2
3
4
5
6
7
8
...
T1
a
a+b
1
1
2
4
7
13
24
42
79
...
T2
b
a+c
0
1
2
3
6
11
18
37
66
...
T3
c
a
0
1
1
2
4
7
13
24
42
Sries
t
t+2a
1
3
5
9
17
31
55
103
187
...
Tabela 3.3: Distribuio polifsica para k=4 ( T=5 arquivos, usar o Merge4 )
Nvel
n
n+1
0
1
2
3
4
5
6
7
8
...
T1
a
a+b
1
1
2
4
8
15
29
56
108
...
T2
b
a+c
0
1
2
4
7
14
27
52
100
...
T3
C
a+d
0
1
2
3
6
12
23
44
85
T4
d
a
0
1
1
2
4
8
15
29
56
Sries
t
t+3a
1
4
7
13
25
49
94
181
349
...
Pesq_Ord_de_Dados 57
57
22/04/13 14:53
Tabela 3.4: Distribuio para k=4 caminhos e T=5 arquivos do Exemplo 3.1
Fase
1
2
3
4
5
8
4
2
1
T1
x1
x1
x1
x1
T2
7x1
3x1
1x1
1 x 25
T3
6x1
2x1
1 x 13
T4
4x1
2x7
1x7
T5
4x4
2x4
1x4
Fase
1
2
3
4
5
6
T1
13 x 1
6x1
2x1
1 x 17
T2
11 x 1
4x1
2x9
1x9
T3
7x
4x
2x
1x
1
5
5
5
T4
7x3
3x3
1x3
1 x 31
1. O algoritmo Merge2 da seo 2 no leva em considerao se os dois blocos a serem intercalados so tais que todas as chaves de um bloco sejam
maiores que o outro. Faa ento uma alterao neste procedimento para
prever este caso especfico. Indique qual o benefcio desta ao.
2. Para a intercalao de 4 caminhos (Merge4) poderia ser usada uma das
tcnicas citadas a seguir. Indique qual a melhor delas e justifique.
a) De forma semelhante ao Merge3 da seo 3, modificando a funo
MENOR para comparar quatro nmeros e ampliando as comparaes.
b) Merge4 ( A, B, C, D ) = Merge2 ( Merge3 (A,B,C), D)
c) Merge4 ( A, B, C, D ) = Merge2 ( Merge2 (A,B) , Merge2 (C,D))
3. Utilize algum procedimento apresentado neste captulo para classif icar um arquivo contendo 4.500 registros, sabendo que possvel
classif icar no m ximo 750 destes registros na memria interna.
Indique o nmero de leituras e gravaes ocorridas.
4. Defina uma estratgia diferente da utilizada no item anterior de modo a
reduzir o nmero de leituras e gravaes.
58
Pesq_Ord_de_Dados 58
22/04/13 14:53
10
11
12
13
14
15
16
17
18
19
20
15
24
19
12
13
28
53
21
17
42
19
18
13
Suponha a existncia de uma funo MEDIANA(V,N), que calcula a mediana de um vetor V[1:N] e dos procedimentos QSORT(A,N) que ordena
o vetor A[1:N] totalmente na memria principal e Merge2 (X, m,Y, n, S)
que faz a intercalao de 2 caminhos, onde S[1:(m+n)] o vetor ordenado
resultante da intercalao dos vetores X[1:m] e Y[1:n].
Apresente os resultados aps executar cada um dos seguintes passos:
a) W = MEDIANA (K, 20)
b) X = Ki, se Ki < W e Y = Ki, se Ki > W, i = 1:20
Pesq_Ord_de_Dados 59
59
22/04/13 14:53
Pesq_Ord_de_Dados 60
22/04/13 14:53
Captulo
Tcnicas de pesquisa
Objetivos:
Pesq_Ord_de_Dados 61
22/04/13 14:53
Pesq_Ord_de_Dados 62
22/04/13 14:53
Apresentao
Neste captulo apresentamos diversas tcnicas e estruturas de dados
que permitem fazer pesquisa com bastante eficincia. Inicialmente, apresentamos o procedimento de busca sequencial que, apesar de ser ineficiente,
serve para efeito de comparao com os demais mtodos. A seguir abordamos
a busca binria, que permite encontrar um valor contido num vetor ordenado
com extrema eficincia. No entanto, as operaes de insero e remoo tm
custo computacional elevado, por isso comum utilizar outras estruturas
de pesquisa em que os dados estejam implicitamente ordenados, como as
tabelas de disperso onde, sob certas hipteses, essas operaes podem ser
feitas em tempo esperado constante. No final do captulo abordamos trs tipos de rvores de busca balanceadas: rvores AVL, rvores B e rvores B+.
Descrevemos as operaes de insero, busca e remoo nessas estruturas e
mostramos que tais operaes so feitas em tempo logartmico, no pior caso.
1. Tcnicas de Pesquisa
Uma das tarefas de maior importncia na computao a pesquisa
de informaes contidas em colees de dados. Em geral, desejamos que
essa tarefa seja executada sem que haja a necessidade de inspecionar toda
a coleo de dados.
Neste captulo apresentamos diversas tcnicas e estruturas de dados
que permitem fazer pesquisa com bastante eficincia. Discutimos as operaes de insero, busca e remoo nessas estruturas, analisando sua
complexidade temporal e espacial.
Inicialmente, nas sees 2 e 3, descrevemos respectivamente os procedimentos de busca sequencial que trivial e ineficiente, e de busca binria,
que permite encontrar um valor contido num vetor ordenado com extrema
eficincia. Sabe-se, no entanto, que as operaes de insero e remoo
num vetor ordenado tm custo computacional elevado.
Em seguida, na seo, apresentamos as tabelas de disperso, discutindo as tcnicas de hashing fechado e hashing aberto. Tais tcnicas podem
ser usadas para resolver o problema da coliso de chaves que inerente ao
uso dessas estruturas. Mostramos que, sob certas hipteses, as operaes
de insero, busca e remoo em tabelas de disperso so feitas em tempo
esperado constante.
Finalmente, na seo 5 abordamos trs tipos de rvores de busca
balanceadas: rvores AVL, rvores B e rvores B+. Nessas estruturas as
operaes de insero, busca e remoo so feitas em tempo logartmico.
Pesq_Ord_de_Dados 63
63
22/04/13 14:53
2. Busca Sequencial
Podemos procurar, ou buscar, um valor x num vetor L inspecionando
em sequncia as posies de L a partir da primeira posio. Se encontrarmos x, a busca tem sucesso. Se alcanarmos a ltima posio de L sem
encontrar x, conclumos que x no ocorre no vetor L. Esse tipo de busca
chamado de busca sequencial.
Considerando que o vetor L contm n elementos, ordenados ou no,
fcil verificar que a busca sequencial requer tempo linearmente proporcional ao tamanho do vetor, ou seja, O(n); por isso, comum dizer que a
busca sequencial uma busca linear. Observa-se que, no melhor caso, o
elemento x encontrado logo na primeira tentativa da busca, atravs de
uma comparao; no pior caso, x encontra-se na ltima posio e so feitas
n comparaes, logo, no caso mdio, o elemento encontrado aps (n+1)/2
comparaes. Para vetores de mdio ou grande porte, esse tempo considerado inaceitvel, dado que existem tcnicas mais eficientes descritas nas
sees seguintes.
Antes apresentamos dois algoritmos para a busca sequencial.
PROCEDIMENTO BUSCA_SEQUENCIAL ( L , X , POS )
ENTRADA: UM VETOR L e UM VALOR X
SADA: POS = i, SE X OCORRE NA POSIO i DE L // SUCESSO
POS = 0, CASO CONTRRIO.
POS = 0
PARA i = 1 at N
SE L[i] = X
POS = i
ESCAPE
// fim para
DEVOLVA POS
FIM {BUSCA_SEQUENCIAL}
Algoritmo 4.1: Busca Sequencial Simples
PROCEDIMENTO BUSCA_SEQUENCIAL_REC ( L , N, X )
ENTRADA: UM VETOR L DE TAMANHO N e UM VALOR X
SADA: i, SE X OCORRE NA POSIO i DE L
// SUCESSO
0, CASO CONTRRIO.
SE N = 1
SE L[1] = X
DEVOLVA 1
SENO
DEVOLVA 0
SENO
SE L[N] = X
DEVOLVA N
SENO
BUSCA_SEQUENCIAL_REC ( L , N-1, X )
FIM {BUSCA_SEQUENCIAL_REC}
Algoritmo 4.2: Busca Sequencial Recursiva
64
Pesq_Ord_de_Dados 64
22/04/13 14:53
3. Busca Binria
Quando o vetor L estiver em ordem crescente, podemos determinar se
x ocorre em L de forma mais rpida da seguinte maneira: inspecionamos a
posio central de L; se ela contm x a busca para, tendo sido bem sucedida,
caso contrrio, se x for menor do que o elemento central passamos a procurar x, recursivamente, no intervalo de L que est esquerda da posio
central. Se x for maior do que o elemento central continuamos a procurar x,
recursivamente, no intervalo de L que est direita da posio central. Se o
intervalo se tornar vazio, a busca para, tendo sido mal sucedida.
O procedimento que acabamos de descrever chamado de busca binria. Facilmente, podemos adaptar a busca binria para procurar valores
em vetores que estejam em ordem decrescente. O Algoritmo 4.3 fornecemos
uma descrio recursiva em pseudocdigo desse procedimento.
PROCEDIMENTO BUSCA_BINARIA
ENTRADA: UM VETOR L EM ORDEM CRESCENTE, UM VALOR X, E AS
POSIES INICIO E FIM.
SADA: SIM, SE X OCORRE ENTRE AS POSIES INICIO E FIM DE
L; NO, CASO CONTRRIO.
SE INICIO > FIM
DEVOLVA NO E PARE
MEIO = (INICIO+FIM)/2
// DIVISO INTEIRA
SE X = L[MEIO]
DEVOLVA SIM E PARE
SE X < L[MEIO]
DEVOLVA BUSCA_BINARIA(L, X, INICIO, MEIO - 1)
SENAO
DEVOLVA BUSCA_BINARIA(L, X, MEIO + 1, FIM)
FIM {BUSCA_BINARIA}
0
2
1
5
2
5
Chamada
1
2
3
3
8
4
10
x
34
34
34
5
13
6
16
7
17
INICIO
0
9
9
8
29
9
31
FIM
17
17
12
10
34
11
36
12
43
MEIO
8
13
10
13
49
14
51
15
56
16
65
17
69
Valor
devolvido
Sim
Sim
Sim
Pesq_Ord_de_Dados 65
65
22/04/13 14:53
Chamada
1
2
3
4
5
x
7
7
7
7
7
INICIO
0
0
0
2
3
FIM
17
7
3
2
2
MEIO
8
3
1
2
-
Valor
devolvido
No
No
No
No
No
Vamos denotar por T(n) o tempo requerido pelo Algoritmo Busca Binria para procurar um valor num intervalo com n posies. Note que se x
no estiver na posio central do intervalo ser feita uma chamada recursiva para procurar x num intervalo que ter aproximadamente n/2 posies.
Dessa forma, correto afirmar que:
T(n) T(n/2) + c
T(0) = c
Resolvendo essa frmula de recorrncia conclumos que T(n) O(log
n). Sendo assim, a complexidade temporal do Algoritmo Busca Binria pertence a O(log n).
fcil perceber que a complexidade espacial desse algoritmo tambm
dada pela mesma frmula de recorrncia. Conclumos que tal complexidade tambm pertence a O(log n). Vale salientar que se implementarmos
o procedimento de busca binria ser usar recursividade, a complexidade
espacial passa a ser constante.
possvel adaptar o procedimento de busca binria para encontrar
um valor mais prximo de x num vetor ordenado. Por exemplo, no vetor da
Figura 4.1, o valor mais prximo do 40 43. Esse tipo de busca conhecida
como busca binria aproximada. Tal adaptao deixada como exerccio
para o leitor no final deste captulo.
Apesar da busca binria ser extremamente eficiente, as operaes de
insero e remoo so feitas em tempo linearmente proporcional ao tamanho do vetor e isso, em geral, considerado inaceitvel. Por esse motivo,
nas situaes em que as operaes de insero e remoo so frequentes,
prefervel utilizar uma estrutura de dados onde os dados estejam implicitamente ordenados e que tambm permitam fazer inseres e remoes com
bastante eficincia. Na Seo 4 descrevemos alguns tipos de rvores que
possuem tais caractersticas.
4. Tabelas de Disperso
As tabelas de disperso, tambm conhecidas como tabelas de espalhamento ou tabelas de hashing, armazenam uma coleo de valores, sendo
que cada valor est associado a uma chave. Tais chaves tm que ser todas
distintas e so usadas para mapear os valores na tabela. Esse mapeamento
feito por uma funo de hashing, que chamaremos de h.
Por exemplo, podemos implementar uma tabela de disperso usando
um vetor com oito posies e utilizar h(x) = x mod 8 como funo de hashing.
Dizemos que h(k) a posio original da chave k e nessa posio da tabe-
66
Pesq_Ord_de_Dados 66
22/04/13 14:53
la que a chave k deve ser inserida. A Figura 4.2 ilustra a insero de uma
coleo de valores com suas respectivas chaves numa tabela de disperso.
Chave
Valor
25
Lia
Funo de hashing:
18
Ana
h(x) = x mod 8
Rui
31
Gil
4
5
6
7
Observe que o valor Gil foi colocado na posio 7 da tabela, pois a chave associada a Gil 31 e h(31) = 7. O que aconteceria se tentssemos inserir
nessa tabela o valor Ivo com chave 33 ? Observe que h(33) = 1, mas a posio 1 da tabela j est ocupada. Dizemos que as chaves 25 e 33 colidiram.
Mais precisamente, duas chaves x e y colidem se h(x) = h(y).
Note que o problema da coliso de chaves ocorre porque, na maioria
dos casos, o domnio das chaves maior que a quantidade de posies da
tabela. Sendo assim, pelo princpio da casa de pombos, qualquer funo do
conjunto das chaves para o conjunto das posies da tabela no injetora.
No aceitvel recusar a insero de uma chave que colida com outra
j existente na tabela se ela ainda tiver posies livres. Precisamos, portanto, de alguma estratgia para lidar com as colises de chaves. Existem
diversas tcnicas para lidar com as colises. Nas prximas duas subsees
apresentaremos duas dessas tcnicas.
Pesq_Ord_de_Dados 67
67
22/04/13 14:53
Chave
Valor
23*
Edu
25
Lia
Funo de hashing:
18
Ana
h(x) = x mod 8
33*
Ivo
Rui
31
Gil
4
5
6
7
68
Pesq_Ord_de_Dados 68
22/04/13 14:53
Valor
25
Lia
Funo de hashing:
33*
Ivo
h(x) = x mod 8
Rui
23
Edu
Naturalmente existe um
limite para a quantidade
de chaves que podem ser
armazenadas numa tabela de hashing aberto. No
entanto, esse limite determinado pela memria
fsica do computador e no
pelo tamanho da tabela.
4
5
6
7
25
Lia
31
Gil
18
Ana 23 Edu 33
Funo de hashing:
h(x) = x mod 5
Rui
Ivo
Pesq_Ord_de_Dados 69
69
22/04/13 14:53
25
Lia
Rui
23
Edu 33
Ivo
Funo de hashing:
h(x) = x mod 5
3
4
70
Pesq_Ord_de_Dados 70
22/04/13 14:53
Pesq_Ord_de_Dados 71
71
22/04/13 14:53
31
-1
15
39
7
0
19
34
9
17
Figura 4.7: Exemplo de rvore AVL
72
Pesq_Ord_de_Dados 72
22/04/13 14:53
31
0
15
39
7
0
17
19
34
9
Existe ainda mais uma possibilidade a tratar. Se o bal de um n tornar-se 2 ou 2, o que inaceitvel, ser necessrio realizar um procedimento nesse n de modo a restaurar o balanceamento da rvore. Tal procedimento chamado de rotao.
Em rvores AVL, existem essencialmente dois tipos de rotao: simples e dupla. Essas rotaes podem ser esquerda ou direita. A figura 4.9
ilustra graficamente a rotao simples esquerda, tambm chamada de
rotao left-left ou simplesmente rotao LL. Nessa figura, B e C so subrvores de altura H e A uma subrvore de altura H + 1. Observe que o n
n1 toma o lugar do n n que ento movido para a direita. A subrvore B
posicionada esquerda do n n.
2
n1
0
C
A
LL
n1
n1
-1
n1
RR
C
B
Pesq_Ord_de_Dados 73
73
22/04/13 14:53
n2
n
-1
n1
n1
1
-1
D
LR
n2
A
A
B
-2
n2
n
1
n1
n1
RL
n2
D
B
Todas essas rotaes podem ser feitas em tempo constante, pois exigem apenas o redirecionamento de uma quantidade limitada de ponteiros
74
Pesq_Ord_de_Dados 74
22/04/13 14:53
31
0
15
39
17
34
9
16
19
Pesq_Ord_de_Dados 75
75
22/04/13 14:53
tao esquerda, que pode ser simples ou dupla, visto que o filho esquerdo
da raiz tem bal 0. Optamos por fazer uma rotao LR para que possamos
fazer uma remoo mais interessante em seguida.
0
17
1
15
31
16
19
39
16
0
31
15
19
39
Vamos agora analisar a complexidade das operaes de busca, insero e remoo em rvores AVL. No pior caso da operao de busca, preciso
percorrer a rvore a partir da raiz at atingir uma folha que esteja no ltimo
nvel. Na insero e na remoo pode ser necessrio percorrer a rvore desde a raiz at atingir o ltimo nvel e ento subir na rvore atualizando o bal
dos ancestrais do n que foi inserido ou removido e, eventualmente, fazendo
rotaes. Torna-se claro, portanto, que essas operaes gastam tempo limi-
76
Pesq_Ord_de_Dados 76
22/04/13 14:53
5.2 rvores B
Nessa e na prxima seo estudaremos as rvores B e as rvores B+.
Tais estruturas so muito utilizadas na prtica devido extrema eficincia
com que so feitas as operaes de busca, insero e remoo. A maioria
dos sistemas gerenciadores de bancos de dados utiliza essas estruturas,
especialmente as rvores B+, para criar arquivos de ndices. Elas tambm
so utilizadas por diversos sistemas de arquivos.
As rvores B foram propostas em 1972 por Rudolf Bayer e Edward
McCreight, pesquisadores da Boeing Research Labs, e constituem uma generalizao das rvores 2-3.
Ao contrrio das rvores AVL, cada n de uma rvore B pode armazenar diversas chaves. Uma caracterstica importante de uma rvore B a
sua ordem. A ordem da rvore determina a quantidade de chaves que um n
pode armazenar e tambm a quantidade de filhos que um n pode ter. Uma
rvore B de ordem m possui as seguintes propriedades:
Cada n da rvore armazena de m a 2m chaves, exceto a raiz, que
armazena de 1 a 2m chaves.
Se um n interno armazena k chaves ento ele tem que ter k + 1 filhos.
Todas as folhas esto contidas no ltimo nvel da rvore.
A subrvore esquerda de uma chave x contm apenas chaves menores do que x e a subrvore direita de x contm apenas chaves
maiores do que x.
Em cada n da rvore as chaves so mantidas em ordem estritamente crescente.
As trs primeiras propriedades garantem o balanceamento da rvore.
De fato, as rvores B so extremamente bem balanceadas. Surpreendentemente, no h necessidade de rotaes para manter o balanceamento. Isso
decorre do fato de que tais rvores crescem para cima, na direo da raiz,
fato incomum entre as rvores.
As outras duas propriedades garantem que as chaves contidas na rvore estejam implicitamente ordenadas. Elas tambm implicam que rvores
B no podem armazenar chaves repetidas.
A estrutura de um n de uma rvore B de ordem m pode ser constituda dos seguintes campos:
c: um vetor de chaves com 2m posies.
p: um vetor de ponteiros com 2m + 1 posies.
numchaves: indica a quantidade de chaves contidas no n.
pai: ponteiro para o n pai.
Pesq_Ord_de_Dados 77
77
22/04/13 14:53
Os campos numchaves e pai, embora no sejam imprescindveis, facilitam sobremaneira a implementao de diversas operaes em rvores B.
Em um n da rvore, o ponteiro armazenado em p[i] aponta para a subrvore esquerda da chave armazenada em c[i] e p[i + 1] aponta para a subrvore direita de c[i]. A figura 4.16 mostra como poderia ser a estrutura de
um n de uma rvore B de ordem 2.
pai
numchaves
0
c
p
12
0
19
1
25
2
29
69 84
37 42
55
78
89 96
78
Pesq_Ord_de_Dados 78
22/04/13 14:53
a partir da raiz, como se estivssemos procurando k. Se a chave k for encontrada, a insero deve ser abortada, pois rvores B no podem ter chaves
repetidas. Caso contrrio, atingiremos uma folha. Se essa folha tiver menos
do que 2m chaves, basta inserir k de modo que as chaves contidas nessa
folha continuem em ordem crescente.
Suponha agora que a folha contenha 2m chaves. Nesse caso, a folha precisar ser subdividida, criando-se uma nova folha. Distribuiremos a
chave k e as chaves contidas nessa folha da seguinte maneira. As m menores chaves continuaro na folha, as m maiores chaves sero movidas para
a nova folha e a chave central (aquela que no est entre as m menores nem
entre as m maiores chaves) deve subir para o n pai. Note que se o n pai
tiver 2m chaves, ele tambm precisar ser subdividido.
Esse processo de subdiviso pode propagar-se at a raiz da rvore. Se
a raiz for subdividida, a chave central ser armazenada numa nova raiz e a
altura da rvore aumentar. A Figura 4.18 mostra como seria a subdiviso
da folha esquerda ao inserir a chave 12.
33
12 33
36
4 25
25
36
29
42
37
45
69 84
55
73 78
89 96
8
73 78
Figura 4.19: rvore B da Figura 4.17 aps a insero das chaves
73 e 45
Observe que se inserirmos a chave 80 na rvore da Figura 4.19, teremos que subdividir a folha que contm o 73 e o 78, seu n pai, que contm
o 69 e o 84, e a raiz da rvore. Com isso, a rvore passar a ter altura 4.
Vamos agora a discutir operao de remoo. Para remover uma chave
k de uma rvore B de ordem m precisamos encontrar o n da rvore que
contm k. Vamos tratar primeiramente o caso em que tal n uma folha. Se
essa folha tiver mais do que m chaves ou for a raiz da rvore, basta remover
k apropriadamente dessa folha.
Suponha agora que a folha que contm k no a raiz da rvore e armazena exatamente m chaves. Aps remover k dessa folha, devemos tentar
obter mais uma chave para essa folha de modo que ele continue armazenando m chaves. Para isso, a folha irm esquerda (preferencialmente) ou
Pesq_Ord_de_Dados 79
79
22/04/13 14:53
a folha irm direita deve doar uma chave. Essa chave movida para o n
pai e a chave do n pai que est entre as folhas envolvidas na doao deve
ser movida para a folha que continha k. A Figura 4.20 ilustra a doao de
uma chave da folha irm esquerda.
25
12
4 12
25
Se nem a folha irm esquerda nem a folha irm direita tiver mais
do que m chaves, ser necessrio fundir a folha que contm k com a folha
irm sua esquerda (preferencialmente) ou com a folha irm sua direita.
A chave do n pai que est entre as folhas que esto se fundindo deve ser
movida para a nova folha que ser obtida com a fuso. A Figura 4.21 ilustra
a fuso de duas folhas.
25 33
33
36
36
4 25
Observe que ao fundir duas folhas o n pai dessas folhas perde uma
chave. Se ele no for a raiz e tiver exatamente m chaves ser necessrio obter a doao de uma chave do seu n irmo esquerda (preferencialmente)
ou do seu n irmo direita. Se nenhum desses dois ns irmos puder doar
uma chave, devemos fundir o n pai com o seu n irmo esquerda (preferencialmente) ou com o seu n irmo direita.
Esse processo de subdiviso pode propagar-se at os filhos da raiz da
rvore. Se for necessrio fundir os nicos dois filhos da raiz, a raiz antiga
deixar de existir, o n obtido com a fuso passar a ser a nova raiz e a altura da rvore diminuir.
Na Figura 4.22 exibimos a rvore da Figura 4.19 aps a remoo das
chaves 4 e 55, nessa ordem. Note que a folha que contm a chave 4 tem
mais do que m chaves e, portanto, basta remover tal chave dessa folha. J
a remoo da chave 55 leva necessidade de obter a doao de uma chave
da folha irm sua direita.
33 51
25
4
29
42
37
73 84
69
69
78
89 96
55
38
Figura 4.22: rvore B da Figura 4.19 aps a remoo das chaves 4 e 5573 78
45
Ao removermos a chave 45 da rvore da Figura 4.22 teremos que fundir a folha que contm tal chave com folha irm esquerda. O n pai das
folhas que sero fundidas precisar obter uma doao do n irmo direita. A rvore resultante mostrada na Figura 4.23.
80
Pesq_Ord_de_Dados 80
22/04/13 14:53
33 73
25
4
51
29
37 42
84
69
78
89 96
55 da chave38
Figura 4.23: rvore B da Figura 4.22 aps a remoo
45
69
37 42
84
69
78
89 96
Deve ter ficado claro que a operao de busca requer que a rvore seja
percorrida a partir da raiz at, no mximo, atingir uma folha. Dessa forma,
tal operao gasta tempo linearmente proporcional altura da rvore, no
pior caso. Na insero e na remoo necessrio percorrer a rvore da raiz
at atingir o ltimo nvel e, eventualmente, subir na rvore realizando subdivises ou fuses. Fica claro, portanto, que essas operaes gastam tempo
limitado pela altura da rvore. O teorema a seguir relaciona a altura de
uma rvore B com a quantidade de chaves contidas na rvore.
Teorema de Bayer-McCreight: Seja H a altura de uma rvore B de
ordem m que contm n chaves. Ento:
log2m(n + 1) H logm+1(n + 1).
Esse teorema implica que a complexidade temporal das operaes de
busca, insero e remoo em rvores B O(logn). Vemos ainda que quanto
maior a ordem da rvore, menor ser sua altura. Na prtica, em comum utilizar ordens bem maiores do que 1, fazendo com que a altura da rvore seja
muito pequena. Por exemplo, se a ordem da rvore B for 50 e ela armazenar
1 bilho de chaves, sua altura ser no mximo 5. So, portanto, estruturas
de pesquisa extremamente eficientes.
Pesq_Ord_de_Dados 81
81
22/04/13 14:53
5.3 rvores B+
As rvores B+, tambm propostas por Bayer e McCreight, so bem parecidas com as rvores B, tendo apenas duas diferenas mais significativas:
Todas as chaves vlidas contidas na rvore tm que aparecer em
alguma folha da rvore.
Cada folha possui um ponteiro que aponta para a folha imediatamente sua direita.
Convm salientar que as chaves contidas nos ns internos servem
apenas para orientar o caminhamento na rvore. A primeira diferena
mais importante e requer o relaxamento de uma das propriedades das rvores B, descrita no incio da Subseo 5.2:
A subrvore esquerda de uma chave x contm apenas chaves menores ou iguais a x e a subrvore direita de x contm apenas chaves maiores do que x.
A Figura 4.25 mostra uma rvore B+ de ordem 1 com as mesmas chaves contidas na rvore B da Figura 4.24.
37 73
25
4 25
29 37
42 51
51
84
69
69 73
89 96
73 78
78 84
Figura 4.25: Exemplo de rvore B+ 38
82
Pesq_Ord_de_Dados 82
22/04/13 14:53
51
75 78
84
89 96
55
38
Figura 4.26: rvore B+ da Figura 4.25 aps a insero da chave 7573 78
4 25
29 37
42 51
78 84
69
69 73
51
75 84
69
29 37
42 51
75
4 25
69 73
78
89 96
33
55
9 Figura 4.27: rvore B+ da Figura 4.26 aps a remoo da
38chave 8473 78
29 37
51
42 51
84
69
69 73
78
89 96
38
73 75
78
Figura 4.28: rvore B+ da Figura 4.27 aps a remoo da chave
possvel mostrar que uma rvore B+ que contenha as mesmas chaves vlidas que uma rvore B ter no mximo um nvel a mais do que a
rvore B. Sendo assim, pelo Teorema de Bayer-McCreight, conclumos que
a altura de uma rvore B+ logartmica na quantidade de chaves contidas
na rvore.
Claramente, as operaes de busca, insero e remoo em rvores
B+ gastam tempo linearmente proporcional altura da rvore. Sendo assim, tais operaes so feitas em tempo (logn). Assim como as rvores B,
as rvores B+ tambm so estruturas de pesquisa extremamente eficientes.
PESQUISA E ORDENAO DE DADOS
Pesq_Ord_de_Dados 83
83
22/04/13 14:53
84
Pesq_Ord_de_Dados 84
22/04/13 14:53
13. Escreva uma funo que receba um ponteiro para a raiz de uma rvore
B+ e devolva a quantidade de chaves contidas na rvore.
14. Discorra sobre a eficincia das operaes de insero, remoo, busca,
busca aproximada e listagem em ordem em rvores B e B+.
Sites
http://pt.wikipedia.org/wiki/Bubble_sort
http://pt.wikipedia.org/wiki/Insertion_sort
http://pt.wikipedia.org/wiki/Selection_sort
http://pt.wikipedia.org/wiki/Shell_sort
http://pt.wikipedia.org/wiki/Merge_sort
http://pt.wikipedia.org/wiki/Quick_sort
http://pt.wikipedia.org/wiki/Heapsort
http://pt.wikipedia.org/wiki/Count_sort
http://pt.wikipedia.org/wiki/Bucket_sort
http://pt.wikipedia.org/wiki/Radix_sort
http://pt.wikipedia.org/wiki/Busca_binria
http://pt.wikipedia.org/wiki/Tabela_de_disperso
http://pt.wikipedia.org/wiki/rvore_AVL
http://pt.wikipedia.org/wiki/rvore_B
http://pt.wikipedia.org/wiki/rvore_B+
http://pt.wikipedia.prg/wiki/Sort-merge_utility
http://www.cs.pitt.edu/~kirk/cs1501/animations/Sort1.html
http://slady.net/java/bt/view.php?w=750&h=500
Pesq_Ord_de_Dados 85
85
22/04/13 14:53
86
Pesq_Ord_de_Dados 86
22/04/13 14:53
Anexo
Relao de Algoritmos
Pesq_Ord_de_Dados 87
22/04/13 14:53
Pesq_Ord_de_Dados 88
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <stdbool.h>
int main() {
int vetor[5], i, aux;
bool parar = false;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vetor[i]);
}
while(parar == false)
{
parar = true;
for(i=0;i<4;++i)
{
if(vetor[i]>vetor[i+1])
{
parar = false;
aux = vetor[i];
vetor[i] = vetor[i+1];
vetor[i+1] = aux;
}
}
}
for(i=0;i<5;++i)
{
printf("%d\n",vetor[i]);
}
getch();
return 0;
}
Pesq_Ord_de_Dados 89
89
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void insertionSort(int *V, int tam)
{
int i, j, aux;
for(i = 1; i < tam; i++){
j = i;
while((V[j] < V[j - 1])&&(j!=0)) {
aux = V[j];
V[j] = V[j - 1];
V[j - 1] = aux;
j--;
}
}
}
int main() {
int vet[5], i, aux;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vet[i]);
}
insertionSort(vet, 5);
for(i=0;i<5;++i)
{
printf("%d\n",vet[i]);
}
getch();
}
90
Pesq_Ord_de_Dados 90
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void selectionsort(int * vet, int tam)
{
int i, j, min;
for (i = 0; i < (tam-1); i++)
{
min = i;
for (j = (i+1); j < tam; j++) {
if(vet[j] < vet[min]) {
min = j;
}
}
if (i != min) {
int swap = vet[i];
vet[i] = vet[min];
vet[min] = swap;
}
}
}
int main() {
int vetor[5], i, aux;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vetor[i]);
}
selectionsort(vetor, 5);
for(i=0;i<5;++i)
{
printf("%d\n",vetor[i]);
}
getch();
}
Pesq_Ord_de_Dados 91
91
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void shellsort(int * vet, int size) {
int i , j , value;
int gap = 1;
do {
gap = 3*gap+1;
} while(gap < size);
do {
gap /= 3;
value =vet[i];
j = i - gap;
j -= gap;
int main() {
int vetor[5], i, aux;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vetor[i]);
}
shellsort(vetor, 5);
for(i=0;i<5;++i)
{
printf("%d\n",vetor[i]);
}
getch();
}
92
Pesq_Ord_de_Dados 92
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void merge(int vec[], int vecSize) {
int mid;
int i, j, k;
int* tmp;
tmp = (int*) malloc(vecSize * sizeof(int));
if (tmp == NULL) {
exit(1);
}
mid = vecSize / 2;
i = 0;
j = mid;
k = 0;
while (i < mid && j < vecSize) {
if (vec[i] < vec[j]) {
tmp[k] = vec[i];
++i;
}
else {
tmp[k] = vec[j];
++j;
}
++k;
}
if (i == mid) {
while (j < vecSize) {
tmp[k] = vec[j];
++j;
++k;
}
}
else {
while (i < mid) {
tmp[k] = vec[i];
++i;
++k;
}
}
Pesq_Ord_de_Dados 93
93
22/04/13 14:53
94
Pesq_Ord_de_Dados 94
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void swap(int* a, int* b) {
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int vec[], int left, int right) {
int i, j;
i = left;
for (j = left + 1; j <= right; ++j) {
if (vec[j] < vec[left]) {
++i;
swap(&vec[i], &vec[j]);
}
}
swap(&vec[left], &vec[i]);
return i;
}
void quickSort(int vec[], int left, int right) {
int r;
if (right > left) {
r = partition(vec, left, right);
quickSort(vec, left, r - 1);
quickSort(vec, r + 1, right);
}
}
int main() {
int vec[5], i, aux;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vec[i]);
}
quickSort(vec, 0, 5);
for(i=0;i<5;++i)
{
printf("%d\n",vec[i]);
}
getch();
}
Pesq_Ord_de_Dados 95
95
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
for (;;)
{
if (i > 0)
{
i--;
t = vec[i];
}
else
{
n--;
if (n == 0)
return;
t = vec[n];
vec[n] = vec[0];
}
pai = i;
filho = i*2 + 1;
96
Pesq_Ord_de_Dados 96
22/04/13 14:53
}
}
int main() {
int vec[5], i, aux;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vec[i]);
}
heapsort(vec, 5);
for(i=0;i<5;++i)
{
printf("%d\n",vec[i]);
}
getch();
}
Pesq_Ord_de_Dados 97
97
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void countingsort(int *vet, int n, int min, int max)
{
int i, j, z;
int range = max - min + 1;
int *count = malloc(range * sizeof(*vet));
for(i = 0; i < range; i++)
count[i] = 0;
for(i = 0; i < n; i++)
for(i = min, z = 0; i <= max; i++)
{
vet[z++] = i;
}
free(count);
}
int main() {
int vet[5], i, maior;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vet[i]);
}
printf("Qual o maior elemento: ");
scanf("%d",&maior);
countingsort(vet, 5, 0, maior );
for(i=0;i<5;++i)
{
printf("%d\n",vet[i]);
}
getch();
}
98
Pesq_Ord_de_Dados 98
22/04/13 14:53
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define n 5
#define num_bucket 3
typedef struct {
int topo;
int balde[n];
} bucket;
for(i=0;i<tam;i++){
j=(num_bucket)-1;
while(1){
if(j<0)
break;
if(vet[i]>=j*10){
Pesq_Ord_de_Dados 99
99
22/04/13 14:53
b[j].balde[b[j].topo]=vet[i];
(b[j].topo)++;
break;
}
j--;
}
}
for(i=0;i<num_bucket;i++)
if(b[i].topo)
bubble(b[i].balde,b[i].topo);
i=0;
for(j=0;j<num_bucket;j++){
for(k=0;k<b[j].topo;k++){
vet[i]=b[j].balde[k];
i++;
}
}
}
int main() {
int vet[n], i, maior;
for(i=0;i<n;++i)
{
scanf("%d",&vet[i]);
bucketsort(vet, n);
for(i=0;i<n;++i)
{
printf("%d\n",vet[i]);
}
getch();
}
100
Pesq_Ord_de_Dados 100
22/04/13 14:53
#include <limits.h>
#include <stdlib.h>
#include <conio.h>
/* find left most with bit, and right most without bit, swap */
swap(*ll, *rr);
/* sort signed ints: flip highest bit, sort as unsigned, flip back */
static void radix_sort(int *a, const size_t len)
{
size_t i;
uint *x = (uint*) a;
for(i=0;i<len;++i)
x[i] ^= INT_MIN;
rad_sort_u(x, x + len, INT_MIN);
for(i=0;i<5;++i)
x[i] ^= INT_MIN;
}
Pesq_Ord_de_Dados 101
101
22/04/13 14:53
int main(void)
{
int vet[5], i;
for(i=0;i<5;++i)
{
printf("Digite o valor: ");
scanf("%d",&vet[i]);
}
radix_sort(vet, 5);
for(i=0;i<5;++i)
{
printf("%d\n", vet[i]);
}
getch();
return 0;
}
102
Pesq_Ord_de_Dados 102
22/04/13 14:53
Lista de Algoritmos
Captulo 1
Algoritmo 1.1: Calcula o fatorial de N de forma direta...................... 13
Algoritmo 1.2: Calcula o fatorial de N de forma recursiva................. 14
Algoritmo 1.3: Calcula o Binmio de Newton.................................... 16
Captulo 2
Algoritmo 2.1: Bolha.......................................................................... 21
Algoritmo 2.2: Bolha com Flag........................................................... 23
Algoritmo 2.3: Insero...................................................................... 24
Algoritmo 2.4: Seleo....................................................................... 25
Algoritmo 2.5: Shellsort..................................................................... 27
Algoritmo 2.6: Mergesort.................................................................. 28
Algoritmo 2.7: Procedimento Merge................................................. 30
Algoritmo 2.8: Procedimento Partio............................................... 32
Algoritmo 2.9: Quicksort.................................................................... 34
Algoritmo 2.10: Insere_HBC............................................................... 36
Algoritmo 2.11: Remove_Menor....................................................... 37
Algoritmo 2.12: Heapsort................................................................... 38
Algoritmo 2.13: Countingsort............................................................ 39
Algoritmo 2.14: Bucketsort................................................................ 41
Algoritmo 2.15: Radixsort.................................................................. 42
Captulo 3
Algoritmo 3.1: Merge2 Intercalao de dois caminhos................... 51
Algoritmo 3.2: Merge3 Intercalao de trs caminhos................... 52
Captulo 4
Algoritmo 4.1: Busca Sequencial Simples ......................................... 64
Algoritmo 4.2: Busca Sequencial Recursiva........................................ 64
Algoritmo 4.3: Busca Binria.............................................................. 65
Pesq_Ord_de_Dados 103
103
22/04/13 14:53
104
Pesq_Ord_de_Dados 104
22/04/13 14:53