elaboradas por Fabiano C. Botelho, Leonardo Rocha, Leonardo Mata e Nivio Ziviani
Transparncias
Dicionrio
Nome comumente utilizado para descrever uma estrutura de dados para pesquisa. Dicionrio um tipo abstrato de dados com as operaes: 1. Inicializa 2. Pesquisa 3. Insere 4. Retira Analogia com um dicionrio da lngua portuguesa: Chaves palavras Registros entradas associadas com cada palavra: pronncia denio sinnimos outras informaes
Pesquisa Seqencial
Mtodo de pesquisa mais simples: a partir do primeiro registro, pesquise seqencialmente at encontrar a chave procurada; ento pare. Armazenamento de um conjunto de registros por meio do tipo estruturado arranjo.
Pesquisa Seqencial
package cap5; import cap4. Item ; / / vide programa do captulo 4 public class Tabela { private Item registros [ ] ; private int n; public Tabela ( int maxN) { this . registros = new Item [maxN+1]; this .n = 0; } public int pesquisa ( Item reg ) { this . registros [0] = reg ; / / sentinela int i = this .n; while ( this . registros [ i ] .compara ( reg ) ! = 0 ) i ; return i ; } public void insere ( Item reg ) throws Exception { i f ( this .n == ( this . registros . length 1)) this . registros[++ this .n] = reg ; } } throw new Exception ( "Erro : A tabela esta cheia" ) ;
Pesquisa Seqencial
Cada registro contm um campo chave que identica o registro. A Interface Item denida no captulo 4 foi utilizada por permitir a criao de mtodos genricos. Alm da chave, podem existir outros componentes em um registro, os quais no tm inuncia nos algoritmos. O mtodo pesquisa retorna o ndice do registro que contm a chave passada como parmetro no registro reg ; caso no esteja presente, o valor retornado zero. Essa implementao no suporta mais de um registro com a mesma chave.
10
Pesquisa Seqencial
Utilizao de um registro sentinela na posio zero do array: 1. Garante que a pesquisa sempre termina: se o ndice retornado por Pesquisa for zero, a pesquisa foi sem sucesso. 2. No necessrio testar se i > 0, devido a isto: o anel interno da funo Pesquisa extremamente simples: o ndice i decrementado e a chave de pesquisa comparada com a chave que est no registro. isto faz com que esta tcnica seja conhecida como pesquisa seqencial rpida.
11
Pesquisa Seqencial
Anlise Pesquisa com sucesso: melhor caso : C (n) = 1 pior caso caso m edio : C (n) = n : C (n) = (n + 1)/2
Pesquisa sem sucesso: C (n) = n + 1. O algoritmo de pesquisa seqencial a melhor escolha para o problema de pesquisa em tabelas com at 25 registros.
12
Pesquisa Binria
Pesquisa em tabela pode ser mais eciente Se registros forem mantidos em ordem Para saber se uma chave est presente na tabela 1. Compare a chave com o registro que est na posio do meio da tabela. 2. Se a chave menor ento o registro procurado est na primeira metade da tabela 3. Se a chave maior ento o registro procurado est na segunda metade da tabela. 4. Repita o processo at que a chave seja encontrada, ou que apenas um registro cuja chave diferente da procurada, signicando uma pesquisa sem sucesso.
13
14
15
Pesquisa Binria
Anlise A cada iterao do algoritmo, o tamanho da tabela dividido ao meio. Logo: o nmero de vezes que o tamanho da tabela dividido ao meio cerca de log n. Ressalva: o custo para manter a tabela ordenada alto: a cada insero na posio p da tabela implica no deslocamento dos registros a partir da posio p para as posies seguintes. Conseqentemente, a pesquisa binria no deve ser usada em aplicaes muito dinmicas.
16
rvores de Pesquisa
A rvore de pesquisa uma estrutura de dados muito eciente para armazenar informao. Particularmente adequada quando existe necessidade de considerar todos ou alguma combinao de: 1. Acesso direto e seqencial ecientes. 2. Facilidade de insero e retirada de registros. 3. Boa taxa de utilizao de memria. 4. Utilizao de memria primria e secundria.
17
1. Todos os registros com chaves menores esto na subrvore esquerda. 2. Todos os registros com chaves maiores esto na subrvore direita.
18
O nvel do n raiz 0. Se um n est no nvel i ento a raiz de suas subrvores esto no nvel i + 1. A altura de um n o comprimento do caminho mais longo deste n at um n folha. A altura de uma rvore a altura do n raiz.
19
Implementao do Tipo Abstrato de Dados Dicionrio usando a Estrutura de Dados rvore Binria de Pesquisa
Estrutura de dados: Contm as operaes inicializa , pesquisa , insere e retira . A operao inicializa implementada pelo construtor da classe ArvoreBinaria .
20
Implementao do Tipo Abstrato de Dados Dicionrio usando a Estrutura de Dados rvore Binria de Pesquisa
package cap5; import cap4. Item ; / / vide programa do captulo 4 public class ArvoreBinaria { private static class No { Item reg ; No esq, dir ; } private No raiz ; / / Entram aqui os mtodos privados das transparncias 21, 22 e 26 public ArvoreBinaria ( ) { this . raiz = null ; } public Item pesquisa ( Item reg ) { return this .pesquisa ( reg , this . raiz ) ; } public void insere ( Item reg ) { this . raiz = this . insere ( reg , this . raiz ) ; } public void retira ( Item reg ) { this . raiz = this . retira ( reg , this . raiz ) ; } }
21
22
23
24
25
Assim: para retirar o registro com chave 5 na rvore basta troc-lo pelo registro com chave 4 ou pelo registro com chave 6, e ento retirar o n que recebeu o registro com chave 5.
26
27
bye to be
and
be
be to and to
and
28
Caminhamento Central
Aps construda a rvore, pode ser necessrio percorrer todos os registros que compem a tabela ou arquivo. Existe mais de uma ordem de caminhamento em rvores, mas a mais til a chamada ordem de caminhamento central. O caminhamento central mais bem expresso em termos recursivos: 1. caminha na subrvore esquerda na ordem central; 2. visita a raiz; 3. caminha na subrvore direita na ordem central. Uma caracterstica importante do caminhamento central que os ns so visitados de forma ordenada.
29
Caminhamento Central
Percorrer a rvore:
5 3 2 1 4 6 7
usando caminhamento central recupera as chaves na ordem 1, 2, 3, 4, 5, 6 e 7. Caminhamento central e impresso da rvore:
public void imprime ( ) { this . central ( this . raiz ) ; } private void central (No p) { i f (p ! = null ) { central (p.esq) ; System. out . println (p. reg . toString ( ) ) ; central (p. dir ) ; } }
30
Anlise
O nmero de comparaes em uma pesquisa com sucesso: melhor caso : C (n) = O(1), pior caso caso m edio : C (n) = O(n), : C (n) = O(log n).
O tempo de execuo dos algoritmos para rvores binrias de pesquisa dependem muito do formato das rvores.
31
Anlise
1. Para obter o pior caso basta que as chaves sejam inseridas em ordem crescente ou decrescente. Neste caso a rvore resultante uma lista linear, cujo nmero mdio de comparaes (n + 1)/2. 2. Para uma rvore de pesquisa randmica o nmero esperado de comparaes para recuperar um registro qualquer cerca de 1, 39 log n, apenas 39% pior que a rvore completamente balanceada. Uma rvore A com n chaves possui n + 1 ns externos e estas n chaves dividem todos os valores possveis em n + 1 intervalos. Uma insero em A considerada randmica se ela tem probabilidade igual de acontecer em qualquer um dos n + 1 intervalos. Uma rvore de pesquisa randmica com n chaves uma rvore construida atravs de n inseres randmicas sucessivas em uma rvore inicialmente vazia.
32
33
34
35
rvores SBB
rvores B estrutura para memria secundria. (Bayer R. e McCreight E.M., 1972) rvore 2-3 caso especial da rvore B. Cada n tem duas ou trs subrvores. Mais apropriada para memria primria. Exemplo: Uma rvore 2-3 e a rvore B binria correspondente(Bayer, R. 1971)
7 2,5 1 3,4 6 8,9 10 11 1 2 3 5 4 6 8 7 10 9 11
36
rvores SBB
rvore 2-3 rvore B binria (assimetria inerente) 1. Referncias esquerda apontam para um n no nvel abaixo. 2. Referncias direita podem ser verticais ou horizontais. Eliminao da assimetria nas rvores B binrias rvores B binrias simtricas (Symmetric Binary B-trees SBB) rvore SBB uma rvore binria com 2 tipos de referncias: verticais e horizontais, tal que: 1. todos os caminhos da raiz at cada n externo possuem o mesmo nmero de referncias verticais, e 2. no podem existir dois referncias horizontais sucessivos.
3 1 2 4 6 5 7 9 8 10
37
1 2
3 1
2 3
38
39
40
41
42
43
Exemplo
Insero de uma seqncia de chaves em uma rvore SBB inicialmente vazia. 1. rvore esquerda obtida aps a insero das chaves 7, 10, 5. 2. rvore do meio obtida aps a insero das chaves 2, 4 na rvore anterior. 3. rvore direita obtida aps a insero das chaves 9, 3, 6 na rvore anterior.
5 5 7 10 2 4 7 10 2 3 4 5 6 7 9 10
44
Procedimento Retira
Assim como o mtodo insere mostrado anteriormente, o mtodo retira possui uma verso privada, que foi sobrecarregada com uma interface que contm um parmetro a mais que a sua verso pblica. O mtodo privado retira utiliza trs mtodos auxiliares, a saber: esqCurto (dirCurto ) chamado quando um n folha (que referenciado por uma referncia vertical) retirado da subrvore esquerda (direita), tornando-a menor na altura aps a retirada; Quando o n a ser retirado possui dois descendentes, o mtodo antecessor localiza o n antecessor para ser trocado com o n a ser retirado.
45
46
47
48
49
Exemplo
Dada a rvore:
5 5 7 10 2 4 7 10 2 3 4 5 6 7 9 10
Resultado obtido quando se retira uma seqncia de chaves da rvore SBB mais direita acima: A rvore esquerda obtida aps a retirada da chave 7 da rvore direita acima. A rvore do meio obtida aps a retirada da chave 5 da rvore anterior. A rvore direita obtida aps a retirada da chave 9 da rvore anterior.
3 2 4 5 6 9 10 2 3 4 6 9 10 2 3 4 6 10
50
1a chamada DirCurto
2a chamada DirCurto
2 chamadas DirCurto
Caso 2: 4 2 1 3 6 10 8 12 2 1 3 4 6 8 10 1 2 3 6 4 8 10
1a
chamada DirCurto
51
4 2 1 3 5 8 6 10
52
Anlise
Nas rvores SBB necessrio distinguir dois tipos de alturas: 1. Altura vertical h necessria para manter a altura uniforme e obtida atravs da contagem do nmero de referncias verticais em qualquer caminho entre a raiz e um n externo. 2. Altura k representa o nmero mximo de comparaes de chaves obtida atravs da contagem do nmero total de referncias no maior caminho entre a raiz e um n externo. A altura k maior que a altura h sempre que existirem referncias horizontais na rvore. Para uma rvore SBB com n ns internos, temos que h k 2h.
53
Anlise
De fato Bayer (1972) mostrou que log (n + 1) k 2 log(n + 2) 2. Custo para manter a propriedade SBB Custo para percorrer o caminho de pesquisa para encontrar a chave, seja para inser-la ou para retir-la. Logo: O custo O(log n). Nmero de comparaes em uma pesquisa com sucesso na rvore SBB melhor caso : C (n) = O(1), pior caso caso m edio : C (n) = O(log n), : C (n) = O(log n).
Observe: Na prtica o caso mdio para Cn apenas cerca de 2% pior que o Cn para uma rvore completamente balanceada, conforme mostrado em Ziviani e Tompa (1982).
54
Pesquisa Digital
Pesquisa digital baseada na representao das chaves como uma seqncia de caracteres ou de dgitos. Os mtodos de pesquisa digital so particularmente vantajosos quando as chaves so grandes e de tamanho varivel. Um aspecto interessante quanto aos mtodos de pesquisa digital a possibilidade de localizar todas as ocorrncias de uma determinada cadeia em um texto, com tempo de resposta logartmico em relao ao tamanho do texto. Trie Patrcia
55
Trie
Uma trie uma rvore M -ria cujos ns so vetores de M componentes com campos correspondentes aos dgitos ou caracteres que formam as chaves. Cada n no nvel i representa o conjunto de todas as chaves que comeam com a mesma seqncia de i dgitos ou caracteres. Este n especica uma ramicao com M caminhos dependendo do (i + 1)-simo dgito ou caractere de uma chave. Considerando as chaves como seqncia de bits (isto , M = 2), o algoritmo de pesquisa digital semelhante ao de pesquisa em rvore, exceto que, em vez de se caminhar na rvore de acordo com o resultado de comparao entre chaves, caminha-se de acordo com os bits de chave.
56
Exemplo
Dada as chaves de 6 bits: B C J = 010010 = 010011 = 100001
H = 011000 M = 101000
0 1 0 0 1 0 1 1 0
1 0 1
57
Faz-se uma pesquisa na rvore com a chave a ser inserida. Se o n externo em que a pesquisa terminar for vazio, cria-se um novo n externo nesse ponto contendo a nova chave, exemplo: a insero da chave W = 110110. Se o n externo contiver uma chave cria-se um ou mais ns internos cujos descendentes contero a chave j existente e a nova chave. exemplo: insero da chave K = 100010.
0 1 0 0 1 0 1 1 0 1 0 1 1
W Q
H
0
0 1
J C
58
59
60
61
Insero da Chave K
1 3 6 B C H J 3 Q
Para inserir a chave K = 100010 na rvore acima, a pesquisa inicia pela raiz e termina quando se chega ao n externo contendo J. Os ndices dos bits nas chaves esto ordenados da esquerda para a direita. Bit de ndice 1 de K 1 a subrvore direita Bit de ndice 3 subrvore esquerda que neste caso um n externo. Chaves J e K mantm o padro de bits 1x0xxx, assim como qualquer outra chave que seguir este caminho de pesquisa. Novo n interno repe o n J, e este com n K sero os ns externos descendentes. O ndice do novo n interno dado pelo 1o bit diferente das 2 chaves em questo, que o bit de ndice 5. Para determinar qual ser o descendente esquerdo e o direito, verique o valor do bit 5 de ambas as chaves.
1 3 6 B C H J 5 K 3 Q
62
Insero da Chave W
A insero da chave W = 110110 ilustra um outro aspecto. Os bits das chaves K e W so comparados a partir do primeiro para determinar em qual ndice eles diferem, sendo, neste caso, os de ndice 2. Portanto: o ponto de insero agora ser no caminho de pesquisa entre os ns internos de ndice 1 e 3. Cria-se a um novo n interno de ndice 2, cujo descendente direito um n externo contendo W e cujo descendente esquerdo a subrvore de raiz de ndice 3.
1 3 6 B C J H 5 K 3 Q 2 W
63
64
Mtodos Auxiliares
/ / Retorna o i-simo bit da chave k a partir da esquerda private int bit ( int i , char k) { i f ( i == 0) return 0; int c = ( int )k; for ( int j = 1; j <= this .nbitsChave i ; j ++) c = c/2; return c % 2; } / / Verica se p n externo private boolean eExterno (PatNo p) { Class classe = p.getClass ( ) ; return classe.getName( ) .equals(PatNoExt. class .getName( ) ) ; }
65
Mtodos Auxiliares
Mtodo para criar n externo:
private PatNo criaNoExt ( char k) { PatNoExt p = new PatNoExt ( ) ; p.chave = k; return p; }
66
67
68
Algoritmo de insero
private PatNo insereEntre ( char k , PatNo t , int i ) { PatNoInt aux = null ; i f ( ! this .eExterno ( t ) ) aux = (PatNoInt) t ; i f ( this .eExterno ( t ) | | ( i < aux. index ) ) { / / Cria um novo n externo PatNo p = this . criaNoExt ( k ) ; i f ( this . bit ( i , k) == 1) return this . criaNoInt ( i , t , p) ; else return this . criaNoInt ( i , p, t ) ; } else { i f ( this . bit (aux. index , k) == 1) aux. dir = this . insereEntre ( k , aux. dir , i ) ; else aux.esq = this . insereEntre ( k , aux.esq, i ) ; return aux; } } private PatNo insere ( char k , PatNo t ) { i f ( t == null ) return this . criaNoExt ( k ) ; else { PatNo p = t ; while ( ! this .eExterno (p) ) { PatNoInt aux = (PatNoInt)p; i f ( this . bit (aux. index , k) == 1) p = aux. dir ; else p = aux.esq; } PatNoExt aux = (PatNoExt)p; int i = 1; / / acha o primeiro bit diferente while ( ( i <= this .nbitsChave)&& ( this . bit ( i , k) == this . bit ( i , aux.chave) ) ) i ++; i f ( i > this .nbitsChave ) { System. out . println ( "Erro : chave ja esta na arvore" ) ; return t ; } else return this . insereEntre ( k , t , i ) ; } }
69
70
71
=
i=1
M i+1 M! = M (M N )!M N
72
Para N pequeno a probabilidade p pode ser 1)) aproximada por p N (N . Por exemplo, 730 para N = 10 ento p 87, 7%.
73
Funes de Transformao
Uma funo de transformao deve mapear chaves em inteiros dentro do intervalo [0..M 1], onde M o tamanho da tabela. A funo de transformao ideal aquela que: 1. Seja simples de ser computada. 2. Para cada chave de entrada, qualquer uma das sadas possveis igualmente provvel de ocorrer. Como as transformaes sobre as chaves so aritmticas, deve-se transformar as chaves no-numricas em nmeros. Em Java, basta realizar uma converso de cada caractere da chave no numrica para um nmero inteiro.
74
75
K=
i=0
n o nmero de caracteres da chave. chave [i] corresponde representao ASCII ou Unicode do i-simo caractere da chave. p[i] um inteiro de um conjunto de pesos gerados randomicamente para 0 i n 1. Vantagem de se usar pesos: Dois conjuntos diferentes de pesos p1 [i] e p2 [i], 0 i n 1, levam a duas funes de transformao h1 (K ) e h2 (K ) diferentes.
76
77
Listas Encadeadas
Uma das formas de resolver as colises simplesmente construir uma lista linear encadeada para cada endereo da tabela. Assim, todas as chaves com mesmo endereo so encadeadas em uma lista linear. Exemplo: Se a i-sima letra do alfabeto representada pelo nmero i e a funo de transformao h(Chave) = Chave mod M utilizada para M = 7, o resultado da insero das chaves P E S Q U I S A na tabela o seguinte: Por exemplo, h(A) = h(1) = 1, h(E ) = h(5) = 5, h(S ) = h(19) = 5, e assim por diante.
T 0 1 2 3 4 5 6
U A P Q
nil
nil
E
nil
- S
nil
78
79
80
81
Anlise
Assumindo que qualquer item do conjunto tem igual probabilidade de ser endereado para qualquer entrada da tabela, ento o comprimento esperado de cada lista encadeada N/M , em que N representa o nmero de registros na tabela e M o tamanho da tabela. Logo: as operaes pesquisa , insere e retira custam O(1 + N/M ) operaes em mdia, sendo que a constante 1 representa o tempo para encontrar a entrada na tabela, e N/M , o tempo para percorrer a lista. Para valores de M prximos de N , o tempo torna-se constante, isto , independente de N .
82
Endereamento Aberto
Quando o nmero de registros a serem armazenados na tabela puder ser previamente estimado, ento no haver necessidade de usar listas encadeadas para armazenar os registros. Existem vrios mtodos para armazenar N registros em uma tabela de tamanho M > N , os quais utilizam os lugares vazios na prpria tabela para resolver as colises. (Knuth, 1973, p.518) No Endereamento aberto todas as chaves so armazenadas na prpria tabela, sem o uso de listas encadeadas em cada entrada dela. Existem vrias propostas para a escolha de localizaes alternativas. A mais simples chamada de hashing linear, onde a posio hj na tabela dada por: hj = (h(x) + j ) mod M, para 1 j M 1.
83
Exemplo
Se a i-sima letra do alfabeto representada pelo nmero i e a funo de transformao h(chave ) = chave mod M utilizada para M = 7,
ento o resultado da insero das chaves L U N E S na tabela, usando hashing linear para resolver colises mostrado abaixo.
Por exemplo, h(L) = h(12) = 5, h(U ) = h(21) = 0, h(N ) = h(14) = 0, h(E ) = h(5) = 5, e h(S ) = h(19) = 5.
T 0 1 2 3 4 5 6 U N S
L E
84
85
86
87
88
Anlise
Seja = N/M o fator de carga da tabela. Conforme demonstrado por Knuth (1973), o custo de uma pesquisa com sucesso 1 C (n) = 2 1 1+ 1
O hashing linear sofre de um mal chamado agrupamento(clustering) (Knuth, 1973, pp.520521). Este fenmeno ocorre na medida em que a tabela comea a car cheia, pois a insero de uma nova chave tende a ocupar uma posio na tabela que esteja contgua a outras posies j ocupadas, o que deteriora o tempo necessrio para novas pesquisas. Entretanto, apesar do hashing linear ser um mtodo relativamente pobre para resolver colises os resultados apresentados so bons. O melhor caso, assim como o caso mdio, O(1).
89
90
Hashing Perfeito
Se h(xi ) = h(xj ) se e somente se i = j , ento no h colises, e a funo de transformao chamada de funo de transformao perfeita ou funo hashing perfeita(hp). Se o nmero de chaves N e o tamanho da tabela M so iguais ( = N/M = 1), ento temos uma funo de transformao perfeita mnima. Se xi xj e hp(xi ) hp(xj ), ento a ordem lexicogrca preservada. Nesse caso, temos uma funo de transformao perfeita mnima com ordem preservada.
91
92
93
94
Exemplo
Chaves: 12 meses do ano abreviados para os trs primeiros caracteres. Objetivo: obter uma funo de transformao perfeita hp de tal forma que o i-simo ms mantido na (i 1)-sima posio da tabela hash:
Chave x jan fev mar abr mai jun jul ago set out nov dez h1 (x) 10 1 8 1 0 10 0 5 4 0 3 4 h2 (x) 11 2 9 3 5 9 3 6 1 1 2 7 hp(x) 0 1 2 3 4 5 6 7 8 9 10 11
95
Os vrtices so rotulados com valores no intervalo 0 . . . M 1 As arestas denidas por (h1 (x), h2 (x)) para cada uma das N chaves x. Cada chave corresponde a uma aresta que rotulada com o valor desejado para a funo hp perfeita. Os valores das duas funes h1 (x) e h2 (x) denem os vrtices sobre os quais a aresta incidente.
96
97
9 6 3 4 8 11 7
1 1 2 10 3
4 5
98
Problema
Quando o grafo contm ciclos: o mapeamento a ser realizado pode rotular de novo um vrtice j processado e que tenha recebido outro rtulo com valor diferente. Por exemplo, se a aresta (5, 6), que a aresta de rtulo 7, tivesse sido sorteada para a aresta (8, 11), o algoritmo tentaria atribuir dois valores distintos para o valor de g [11]. Para enxergar isso, vimos que se g [8] = 0, ento g [11] deveria ser igual a 7, e no igual ao valor 9 obtido acima. Um grafo que permite a atribuio de dois valores de g para um mesmo vrtice, no vlido. Grafos acclicos no possuem este problema. Um caminho seguro para se ter sucesso obter antes um grafo acclico e depois realizar a atribuio de valores para o arranjo g . Czech, Havas e Majewski (1992).
99
return grafoRotulavel ;
100
101
private int maxTamChave, nGrafosGerados, nGrafosConsiderados; private final int Indefinido = 1; / / Entram aqui os mtodos privados das transparncias 76, 103 e 104 public FHPM ( int maxTamChave, int n, float c ) { this .N = n ; this .M = ( int ) (cthis .N) ; this .maxTamChave = maxTamChave; this .g = new int [ this .M] ; } public void obtemHashingPerfeito ( String nomeArqEnt) throws Exception { BufferedReader arqEnt = new BufferedReader ( new FileReader (nomeArqEnt) ) ; String conjChaves[ ] = new String [ this .N] ; this .nGrafosGerados = 0; this .nGrafosConsiderados = 0; / / Continua na prxima transparncia int i = 0;
102
103
104
105
106
107
108
109
110
Anlise
A questo crucial : quantas interaes so necessrias para obter um grafo G = (V, A) que seja rotulvel? Para grafos arbitrrios, difcil achar uma soluo para esse problema, isso se existir tal soluo. Entretanto, para grafos acclicos, a funo g existe sempre e pode ser obtida facilmente. Assim, a resposta a esta questo depende do valor de M que escolhido no primeiro passo do algoritmo. Quanto maior o valor de M , mais esparso o grafo e, conseqentemente, mais provvel que ele seja acclico.
111
Anlise
Segundo Czech, Havas e Majewski (1992), quando M 2N a probabilidade de gerar aleatoriamente um grafo acclico tende para zero quando N cresce. Isto ocorre porque o grafo se torna denso, e o grande nmero de arestas pode levar formao de ciclos. Por outro lado, quando M > 2N , a probabilidade de que um grafo randmico contendo M vrtices e N arestas seja acclico aproximadamente M 2N , M E o nmero esperado de grafos gerados at que o primeiro acclico seja obtido : M M 2N
112
Anlise
Para M = 3N o nmero esperado de iteraes 3, em mdia, aproximadamente 1,7 grafos sero testados antes que aparea um grafo acclico. Logo, a complexidade de tempo para gerar a funo de transformao proporcional ao nmero de chaves a serem inseridas na tabela hash, desde que M > 2N . O grande inconveniente de usar M = 3N o espao necessrio para armazenar o arranjo g. Por outro lado, considerar M < 2N pode implicar na necessidade de gerar muitos grcos randmicos at que um grafo acclico seja encontrado.
113
Outra Alternativa
No utilizar grafos tradicionais, mas sim hipergrafos, ou r-grafos, nos quais cada aresta conecta um nmero qualquer r de vrtices. Para tanto, basta usar uma terceira funo h3 para gerar um trigrafo com arestas conectando trs vrtices, chamado de 3-grafo. Em outras palavras, cada aresta uma tripla do tipo (h1 (x), h2 (x), h3 (x)), e a funo de transformao dada por: h(x) = (g (h1 (x)) + g (h2 (x)) + g (h3 (x))) mod N.
114
Outra Alternativa
Nesse caso, o valor de M pode ser prximo a 1, 23N . Logo, o uso de trigrafos reduz o custo de espao da funo de transformao perfeita, mas aumenta o tempo de acesso ao dicionrio. Alm disso, o processo de rotulao no pode ser feito como descrito. Ciclos devem ser detectados previamente, utilizando a seguinte propriedade de r-grafos: Um r-grafo acclico se e somente se a remoo repetida de arestas contendo apenas vrtices de grau 1 (isto , vrtices sobre os quais incide apenas uma aresta) elimina todas as arestas do grafo.
115
Experimentos
# Chaves 10 20 30 40 50 60 70 80 90 100 # Chamadas geraGrafo 3586 20795 55482 52077 47828 27556 26265 161736 117014 43123 # Chamadas atribuig 1 16 24 33 19 10 17 92 106 26 Tempo (s) 0.130 0.217 0.390 0.432 0.462 0.313 0.351 1.543 1.228 0.559