Transformação de have
•
Cara terísti as dos métodos arbores entes: ordem sobre as haves eo lugar de um item depende da posição da have em relação às haves dos outros itens.
•
Cara terísti as dos métodos de transformação de have:o lugar de um item é al ulado uni amente a partir de sua have.
Esse ál ulo é feito por uma função hamada de transformação de have, que transforma diretamente a have em um endereço em uma zona de memória ontígua ou no índi e de um vetor.
•
Esses métodos têm a parti ularidade de que as operações de pesquisa, inserção e supressão são, em número de omparações, em média onstantes, ou seja, não dependem do no
Prin ípios
•
Exemplo: SejaC
o onjunto de palavras a seguir:C = {sérgio, os ar, lú io, ana, anna, joão, júlia, bos o, paula, mar elo, elisa, soa}
•
Consideramos aqui, omo antes, que o item é sua própria have.•
Um método de transformação de have onsiste em asso iar a ada elementoe
deC
um númeroh(e)
, entre 0 e 12, omo se segue:1. Atribuir às letras a, b, ,
. . .
, z os valores 1, 2, 3,. . .
, 26.2. Adi ionar os valores das letras de
e
.3. Adi ionar ao número obtido o número de letras de
e
.4. Cal ular o módulo 13 desse número, para obter o valor pro urado
h(e)
.•
Utilizando esse pro edimento de ál ulo, obtemos:h(
sérgio) = (73 + 6) mod 13 = 1 h(
júlia) = 6h(
os ar) = (56 + 5) mod 13 = 9 h(
elisa) = 12h(
lú io) = (60 + 5) mod 13 = 0 h(
soa) = 10h(
anna) = 30 + 4) mod 13 = 8
h(
bos o) = 7h(
ana) = (16 + 3) mod 13 = 6
h(
paula) = 5h(
mar elo) = 9h(
joão) = 6•
Utilizam-se esses valores para indexar um vetor que ontenha os nomes:0 lú io 1 sérgio 2 3 4 5 paula 6 ana 7 bos o 8 anna 9 os ar 10 soa 11 12 elisa
•
Para determinar se um item qualquerx
perten e aC
, basta al ularv = h(x)
.•
Seh(x) = 2
ouh(x) = 11
, entãox
não perten e aC
.•
É pre iso re onhe er se um lugar está vazio: ou ini iando o vetor om um valor espe ial,que não pode ser um item,
ou asso iando a ada posição do vetor um ampo indi ando se o lugar está vazio ou não.
•
Senão, ompara-sex
om o iteme
deC
, tal queh(e) = v
:Se
x = e
, entãox ∈ C
. Sex 6= e
, entãox 6∈ C
.Colisão Primária
•
Colisão primária a onte e quando uma posição do vetor já está o upada por um iteme 6= x
e que se quer inserirx
emC
.•
Não é possível evitar olisões.•
Neste aso, a função de transformação de have não dá a esso a um úni o item, mas a umpequeno sub onjunto de itens, no qual é pre iso fazer uma pesquisa.
•
Dizemos que fez-se um pi adinho (hash, ha hâge) do onjuntoC
em sub onjuntos.Prin ípio geral
•
Utilizamos os métodos de pi adinhos nos seguintes asos:É pre iso geren iar uma oleção
C
, ujas haves perten em a um universoU
muito grande.O tamanho provável de
C
é onhe ido e relativamente pequeno em relação ao no de itens de
U
.•
Exemplo:C
é um onjunto de 1000 palavras de 10 letras eU
é o onjunto de todas as palavras possíveis de 10 letras.•
O n o de elementos deU
é, então,26
10
≃ 10
13
.•
Como o tamanho deU
proíbe, na práti a, representar as oleções de elementos deU
reservando um lugar em memória para ada have possível, utiliza-se uma função de
transformação de have
h
que asso ia a ada have um inteiro entre 1 em
onde
m
é um inteiro es olhido em função do tamanho previsto da oleçãoC
.•
Para toda havex, h(x)
é hamado de valor de transformação primária e dá o índi e daposição de
x
em um vetorV
dem
itens.•
Esse índi e serve para veri ar sex
perten e aV
, a inserí-lo, ou suprimí-lo.•
A es olha da função de transformação éfundamental, pois é pre iso apli ar
U
da maneira mais uniforme possível a[1, m]
para tender àrepartição ideal:
| h
−1
(i)
|=
| U |
m
•
Isso, em termos de probabilidade, é∀ x ∈ U
e∀ i ∈ [1, m],
Prob(h(x) = i) =
1
m
•
Dizemos, então, queh
é uniforme.•
O ál ulo da função de transformação de have deve ser rápida para não prejudi ar o desempenho do método.•
Por isso, a onstrução da função de transformação de have (f.t. .) é deli ada.•
Mas mesmo om um boa f.t. . é impossível, em geral, evitar olisões primárias, omo mostra o seguinte argumento.•
Dado um onjuntoC
den
elementos distintos e uma funçãoh
om valores em[1, m]
, na hipótese de queh
é uniforme, a probabilidade para queh
seja injetora éP =
1
m
n
.m.(m − 1) . . . (m − n + 1)
.•
O valor deP
é pequeno quandom
não é muito grande em relação an
.•
Exemplo: Sem = 365
en = 23
, entãoP
é inferior a 1/2.•
Uma interpretação usual para o exemplo a ima é: se reúnem-se mais de 23 pessoas, há mais de uma han e em 2 que 2 dentre elas façam aniversário no mesmo dia!•
No nosso aso, isto quer dizer que, para manter, om probabilidade superior a 1/2, um onjunto de 23 elementos sem olisão, é pre iso um vetor de dimensão superior a 365.•
Como é pre iso geren iar olisões, apresentaremos dois métodos de transformação de have quediferem pela maneira omo são resolvidas as olisões:
1. Os métodos de resolução de olisões por en adeamento: os itens uja have tem o mesmo valor pela função
h
são en adeados entre eles, no interior ou exterior ao vetor. São os métodos de transformaçãoindireta.
2. Os métodos de resolução de olisões por ál ulo: quando há uma olisão, al ula-se uma nova posição no vetor a partir da have do item onsiderado (para pesquisar, inserir ou suprimir). São os métodos de
transformação direta.
•
Prin ípio de pesquisa om transformação de have:Determinar o 1 o
lugar possível para o item pro urado, pela f.t. .
Se o lugar estiver vazio, parar a pesquisa. Senão, omparar o onteúdo do lugar om o
item pro urado.
Se o item foi en ontrado, parar a pesquisa. Senão, passar a um outro lugar possível, por
en adeamento ou por ál ulo. No 2
o
aso, re omeçar o tratamento para o novo lugar.
•
Prin ípio da inserção om transformação de have:Determinar o 1 o
lugar possível para o elemento pro urado.
Se o lugar estiver vazio, olo a-se aí o item e pára.
Se o item foi en ontrado, pára.
Senão, passa-se a um outro lugar possível por en adeamento ou por ál ulo.
No 2 o
aso, re omeça-se o pro edimento.
•
Com todos esses métodos, a pesquisa ne essita, em média, entre 1 a 5 a essos, independentemente do tamanho do vetor.•
O resultado é devido ao fato de que há muitopou as olisões primárias e que a resolução dessas olisão não leva a muitas outras.
Funções de pi adinho
•
Uma função de transformação de have (f.t. .), omo nome indi a, transforma a have de um item a ser guardado em um vetor em um índi e desse vetor.•
A função distribue as haves de maneira aleatória, mas ela deve ser determinísti a, evidentemente.•
Além disso, espera-se qua a função seja uniforme, para evitar olisões.•
Finalmente, a função deve ser fa ilmenteal ulada, para que, que o método onserve o desempenho em tempo.
•
Supomos que as haves são palavras,representadas em memória por uma seqüên ia de bits, que podem ser interpretadas omo um
inteiro.
•
Isto é importante, pois permite de passar aos inteiros sem ál ulos.•
O problema seguinte é o de al ular, a partir desses inteiros, um inteiro no intervalo[1, m]
.•
Para simpli ar os ál ulos, onsideraremos uma representação ordinal dos ara teres odi ada em 5 bits, no que se segue.•
Uma palavra é representada pela on atenação das representações de seus ara teres.•
Temos as seguintes orrespondên ias:A = 00001, B = 00010, C = 00011,
. . .
. ASA = 000011001100001.•
Construiremos uma funçãoh
de seqüên ia de bits em um intervalo dem
inteirosh : {0, 1}
∗
→ [0, m − 1]
Extração
•
Extraem-se ertos bits, ou zonas de bits, da representação binária.•
Se extraem-sep
bits, tem-se o intervalo[0, 2
p
− 1]
on atenando-os e onsiderando-se o inteiro representado.
•
Exemplo: extração da subpalavra formada pelos bits numerados 1, 2, 7 e 8, ontando da direita eompletando à esquerda om zeros: OU = 0111110101 = 1101 =
(13)
10
AS = 0000101011 = 0011 =(3)
10
PA = 0100000001 = 0001 =(1)
10
•
No aso em quem = 2
p
, uma subpalavra formada de
p
bits dá diretamente um índi e no vetor.•
A função só é bem adaptada para ertos asos parti ulares, em que se onhe e os dados de antemão, ou quando se sabe que ertos bits não são signi ativos.•
Em geral, ela não dá bons resultados, pois o valor da transformação não depdende da have toda.•
Uma boa função de transformação deve levar em onta todos os bits da representação.Compressão
•
Utilizam-se, aqui, todos os bits da have para obter um índi e do vetor, ortando as seqüên ias de bits em pedaços de tamanhos iguais ebinária, para não ter que lidar om o vai-um da adição.
•
A vantagem do ou ex lusivo é que a operação não retorna sitemati amente um número menor ( aso do e) ou maior ( aso do ou), evitando, assim, a úmulos no iní io ou no m do vetor.•
Exemplo: h(LE) = 01100⊕
00101 = 01001 =(9)
10
h(OU) = 01111⊕
10101 = 11010 =(26)
10
h(AS) = 00001⊕
10011 = 10010 =(18)
10
h(SEM) = 10011⊕
00101⊕
01101 = 11011 = =(27)
10
•
O problema desse método é de trasformar do mesmo modo todas as permutações de uma mesma palavra.•
Com a função a ima, h(SEM) = h(MES)!•
Isto vem do fato de que, no ál ulo deh
, ortaram-se os strings no limite das•
Uma boa f.t. . deve quebrar as subseqüên ias de bits.•
O problema pode ser resolvido om deslo amentos.•
Exemplo: Pode-se deslo ar ir ularmente para a direita a 1 a subseqüên ia de 1 bit, a 2 a subseqüên ia de 2 bits, a 3 a subseqüên ia de 3 bits, et : h(SEM) = 11001⊕
01001⊕
10101 = 00101 =(5)
10
h(MES) = 10110⊕
01001⊕
01110 = 10001 =(17)
10
•
Este tipo de té ni a serve para reduzir o tamanho das haves ao tamanho de uma palavra dememória.
•
Pode-se, em seguida, apli ar outros métodos de ál ulo omo os seguintes.Divisão
•
Cal ula-se simplesmente o resto da divisão porm
(m
é o tamanho do vetor de transformação de haves) do valor da have:•
Essa função é fá il e rápida de al ular, mas ela depende do valor dem
.•
Sem
é par, todas as haves pares vão para os índi es pares da tabela e todas as haves ímpares para os índi es ímpares, o que não dá umadistribuição uniforme e deve ser evitado.
•
O mesmo a onte e sem
tiver outros divisores pequenos.•
Logo,m
deve ser um n oprimo, mas, mesmo assim, pode haver efeito de a umulações.
•
Exemplo:m = 37
OU = 0111110101 =
(501)
10
⇒
⇒ h(OU) = 501 mod 37 = 20
Multipli ação
•
Da do um realθ
tal que0 < θ < 1
onstrói-se uma f.t. . da seguinte maneirah(e) = ⌊((e × θ) mod 1) × m⌋
•
Exemplo:θ = 0, 6125423371
em = 30
h(OU ) = ⌊((501 × θ) mod 1) × m⌋ =
=
⌊(306, 8837108 mod 1) × 30⌋ =
=
⌊0, 8837108 × 30⌋ = 26
•
Com este método, o tamanho do vetor não tem importân ia.•
Por outro lado, o valor deθ
deve ser es olhido om uidado:θ
não deve estar muito próximo nem de 0 nem de 1, para evitar a úmulos nas extremidades do vetor.•
Estudos teóri os mostram que os valores deθ
que repartem as haves mais uniformemente são:θ =
√
5
− 1
2
≃ 0, 6180339887
eθ = 1 −
√
5
− 1
2
≃ 0, 3819660113
Resolução de olisões por en adeamento: métodos indiretos
•
Veremos dois métodos:1. O en adeamento é feito em uma zona de transbordamento externa à tabela de pi adinho: método de pi adinho om en ademaento separado
2. ou internamente à tabela: método de pi adinho oales ente.
Pi adinho om en adeamento separado
•
Neste método, a tabela só ontém as abeças dasm
listas en adeadas exteriormente a ela.•
As listas representam onjuntos de elementos om o mesmo valor da função de pi adinho.•
A inserção é pre edida por um teste paradeterminar se o item perten e ou não à lista, para mantê-las o mais urtas possíveis.
•
Convenção: a inserção é sempre feita no m da lista, pois é aí que se termina o teste para•
Notação:L
i
é a lista uja abeça éT [i]
.•
Para pro urar, suprimir e inserir o itemx
, trabalha-se om a listaL
h(x)
.•
Exemplo: Sejam os itens abaixo, om seus respe tivos valores de pi adinho, inseridos su essivamente na tabela a seguir:e
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
e
9
e
10
e
11
e
12
e
13
3 1 4 1 4 1 5 9 2
6
5
3
5
e2
e4
e6
e9
3
e1
4
e5
5
e7
6
8
e8
7
2
e3
9
1
e12
e11
e13
e10
T
•
Os itens em olisão poderiam ser representados de outras formas (listas en adeadas ordenadas,árvores binárias de pesquisa, árvores equilibradas).
•
No entanto, essas representações têm pou o interesse, porque se a função de pi adinho for bem es olhida, há muito pou a probabilidade de ter mais de 5 itens em olisão.Análise de omplexidade do pi adinho om en adeamento separado
•
O usto de uma pesquisa negativa é o mesmo da inserção d eum novo item.•
Como a funçãoh
é uniforme, há a mesma probabilidade de1/m
de fazer a pesquisa em ada uma dasm
listas.•
Sejaλ
i
o tamanho da listaL
i
.•
O usto médio de uma pesquisa negativa em uma tabelaT
é Pesq−
(T ) =
1
m
X
1≤i≤m
λ
i
•
Como hán
itens no total, temosX
1≤i≤m
λ
i
= n
e Pesq−
(T ) =
n
m
= α
•
Consideremos, agora, o usto médio de umapesquisa negativa quando se tem
n
itens em uma tabelaT
qualquer dem
listas.•
Asm
n
tabelas possíveis são eqüiprováveis, pois a função de pi adinho
h
é uniforme.•
O usto médio é Medpesq
−
(m, n) =
1
m
n
X
T
Pesq−
(T )
onde a soma é feita sobre todas tabelas
T
possíveis.•
Deduz-se que Medpesq
−
(m, n)
≈ 1 +
a
2
2
,
segundo Knuth 1 .Complexidade média de uma pesquisa positiva
•
Como a tabelaT
é obtida por inserções no m da lista, a posição de um item em relação à abeça da lista não muda nun a.1
TheArt ofComputer Programming, SortingandSear hing,vol. 3,pp. 525,2 a
•
Por isso, o usto de uma pesquisa positiva é igual, em no
de omparações entre itens, ao usto de inserção deste item quando ela a onte eu, mais 1.
•
De fato, fazem-se omparações om os itens da lista situados antes dos item pro urado, mais uma omparação om o item em si, o que pára apesquisa.
•
Se o item pro urado foi o(i + 1)
-ésimo, sua inserção teve o mesmo usto que uma pesquisa negativa dentre osi
itens, ou seja, em média:Med
pesq
−
(m, i) =
i
m
•
Como onsidera-se que osn
itens têm a mesma probabilidade de serem pro urados, deduz-seMed
pesq
+
(m, n) =
i
n
X
0≤i≤n−1
Pesq−
(m, i) + 1.
•
Logo, Medpesq
+
(m, n) =
i
n
n−1
X
i=0
(
i
m
+ 1)
=
n(n − 1)
2nm
+ 1
=
α
2
−
1
2m
+ 1
Pi adinho oales ente
•
O método de pi adinho om en adeamento separado é fá il de se programar, quando é possível alo ar memória durante a exe ução.•
Mas quando isso não é possível, é pre iso reservar, a priori, uma zona ontígua de memória parageren iar as olisões nesta zona de tamanho xo.
•
Consideraremos que a tabela de tamanhom
será dividida em 2 zonas:1. uma zona de endereços primários de apa idade
p
e2. uma reserva para geren iamento das olisões, de apa idade
r
, tal quep + r = m
.•
os inteirosp
er
são xos a priori e a função de pi adinho varia no intervalo[1, p]
.•
O n ode itens presentes,
n
, é inferior ou igual am
.•
Exemplo: A tabela abaixo tem dimensãom = 9
, ujas 3 últimas posições forma a reserva:p = 6
e•
Foram inseridos os seguintes itens, om seus respe tivos valores de pi adinho:e
1
e
2
e
3
e
4
e
5
e
6
e
7
1 4 1 4 2 1 3
e1
e5
e7
e2
e6
e4
e3
1
3
2
4
6
5
7
8
9
T
•
Se utiliza-se toda a tabela, sem distinção de zonas de endereços primários e a reserva, pode-seesperar um melhor preen himento desta.
•
Esta té ni a tem um in oveniente, no entanto, pois ria olisões se undárias, i. é, olisões que não são devidas à onin idên ia de valores dafunção de pi adinho.
•
Exemplo: A tabela abaixo mostra a situação quandom = 11
e em que se inseriu os itense
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
e
9
e
10
1 5 2 5 1 8 11 9 5 10
e1
e3
e2
e9
e8
e6
e7
e5
e4
1
3
2
4
6
5
7
8
9
T
10
11
e10 0
0
0
6
0
7
9
4
11
10
Coalescencia
das listas de valores
primarios 5 e 11
^
’
•
Na gura a ima, vemos que as listas dos itens de valores de pi adinho primário 5 e 11 foramfundidas.
•
Este fenmeno é que dá o nome ao método: pi adinho om oales ên ia de listas, ou pi adinho oales ente.•
As olisões se undárias, devidas à oales ên ia das listas, fazem om que o tempo de pesquisa seja mais longo que no aso de en adeamento externo à tabela.•
Mas o desempenho do método, ainda assim, é bom.•
O algoritmo de inserção, no aso de pi adinho oales ente, é dado abaixo.•
A tabela é onstituída dem
registros, om 2 ampos: val ontendo o item e prox, para o en adeamento.•
Supõe-se dada a funçãoh
om valores em1..m
.•
Utiliza-se o seguinte tipo Pas al:type tab = array [1..m℄ of re ord: val: Item; prox: 0..m; end;
•
Utiliza-se, também uma função vazia que testa se uma posição está o upada ou não:fun tion vazia(T: tab; i: 1..m): boolean;
•
vazio(T) é um pro edimento que implementa a operação do TAD pi adinho oales ente quepro edure inserir_PCo(x: Item; var T: tabela; var heio: boolean);
{ Pro ura o item
x
na tabelaT
e, no aso da pesquisa ser negativa, inserex
emT
; heio é uma variável lógi a de alarme: toma o valor true se a inserção não pde ser feita se a tabela estiver heia }var R:
0..m
; i:1..m
;{R serve para pesquisar a posição livre que possa resolver uma olisão}
begin
{
h
é uma função de pi adinho de larada alhures} i := h(x); R := m; heio := false;if vazio(T)
then begin {insere o item}
T[i℄.val := x; T[i℄.prox := 0;
{eventualmente mar ar a posição i omo o upada} end
else begin
while (T[i℄.val
<>
x) and (T[i℄.prox<>
0) do i:= T[i℄.prox;if T[i℄.val
<>
x then begin {pro ura onde inserir item}while (R
>
0) and (not vazia(T,R)) do R := R - 1; if R>
0 then begin T[i℄.prox := R; T[R℄.val := x; T[R℄.prox := 0 endelse heio := true {a tabela está heia} end
•
R é uma variável lo al ini iada omm
no iní io do pro edimento, mas seria melhor manter a 1a
posição livre a partir do m do vetor no próprio vetor.
•
Isso evitaria de ter de per orrer o vetor a partir do m para en ontrar a 1a
posição livre que possa resolver uma olisão.
Análise da omplexidade do pi adinho oales ente
•
A avaliação de desempenho do pi adinho oales ente é bem ompli ada.•
Mostra-se que o n omédio de exames de posição, quando a função de pi adinho é uniforme, para um onjunto de
n
elementos distintos, em uma tabela dem
lugares, vale, assintoti amente, param
en
grandes, om a razãon
m
= α
xa e inferior a 1, por onstrução da tabela:no aso da pesquisa positiva: Med
pesq
+
(m, n)
∼
1
8α
(e
2α
− 1) +
α
4
+
3
4
no aso da pesquisa negativa: Med
pesq
−
(m, n)
∼
1
4
e
2α
−
α
2
+
3
4
•
Deduz-se das fórmulas a ima que uma pesquisa negativa (resp. positiva) em uma tabela heia (α = 1
) só usta, em média, er a de 2,1 (resp. 1,7) exames de posições.Resolução de olisões por ál ulo:
Métodos diretos Prin ípio geral
•
Nos métodos anteriores, há um gasto de memória omos apontadores que poderia ser usado para guardar itens e, assim, evitar olisões.•
Para isto, são ne essários métodos de resolução de olisões por ál ulo no interior da tabela.•
Por exemplo, no aso do pi adinho oales ente, sem
ó tamanho da tabela en
o n ode itens, tem-se ne essariamente
n ≤ m
.•
Os métodos diretos são baseados na onstrução de uma função de pi adinho hamada de função de tentativas su essivas:tentativa
: U
→ {1, 2, . . . , m}
m
que asso ia a ada elemento do universo
U
uma permutação de{1, 2, . . . , m}
:tentativa(
x
) = (tentativa1
(x)
, tentativa2
(x), . . . ,
tentativam
(x)
) om tentativai
(x)
∈ {1, . . . , m}
para todoi
e, sei 6= j
, então tentativai
(x)
6=
tentativaj
(x)
.•
Quando se pro urax
na tabelaT [1..m]
,explora-se su essivamente os lugares tentativa
1
(x)
(valor do pi adinho primário), depoistentativa
2
(x)
, tentativa3
(x)
, et .•
Ou se a ha ox
, ou se en ontra um lugar vazio, ou hega-se até o m dasm
tentativas, quando se pode on luir quex
não está na tabela.•
Para fazer uma inserção, o pro edimento é o mesmo: sex
é en ontrado, pára; senão,x
éinserido no lugar vazio; se as
m
tentativas foram feitas, é porque a tabela está heia e a inserção é impossível.•
Os pro edimentos de pesquisa e de inserção são dados para o aso que não se fazem supressões.•
Supõe-se dada uma função tentativa que al ula os valores de tentativai
(x)
:fun tion tentativa(i:1..m; x:Item):1..m; {tentativa(i,x) = tentativa
i
(x)
}•
De laração da tabela de pi adinho: type tabela = array[1..m℄ of Item;•
Como no aso do pi adinho oales ente,onsidera-se dada uma função que permite testar se um lugar da tabela está vazio:
fun tion pesquisar_PD1(x:Item; T:tabela): integer;
{esta função retorna o índi e de x em T, se x está presente em T e 0 senão; não é feita supressão em T}
var i,v: integer; sai: boolean; begin
i:=1; sai:=false;
while(i
≤
m) and (not sai) do beginv := tentativa(i,x);
if (vazia(T,v)) or (T[v℄=x) then sai := true
else i := i+1; end;
if T[v℄ = x
then {x presente} pesquisar_PD1:=v else {x ausente} pesquisar_PD1 := 0; end; {pesquisar_PD1}
pro edure inserir_PD1(x:Item; var T:tabela; var heio:boolean);
{se x não está presente em T, este pro edimento insere-o em T, no 1
o
lugar livre en ontrado nas tentativas; se x está em T, o pro edimento faz nada; se a tabela está heia, x não pode ser
inserido e heio é true, senão falso; não é feita supressão em T}
var i,v:integer; sai:boolean; begin
i:=1; heio:=false; sai:=false; while (i
≤
m) and (not sai) do beginv:= tentativa(i,x);
if (vazio(T,v)) or (T[v℄=x) then sai:=true else i:=i+1
end;
if T[v℄
6=
x then {x não está presente} if vazio(T,V)then {insere x na tabela} T[v℄ := x else heio:=true
•
Pode ser usado um ontador asso iado à tabela para veri ar se a tabela está heia antes de hamar o pro edimento, o que o simpli a bem.•
A pesquisa também pode ser feita om a ajuda de uma função que indi a, no aso de falha, o índi e do último lugar examinado.•
Neste aso, a inserção pode ser feita, no aso da pesquisa ser negativa, inserindo o item no lugar obtido omo resultado.•
Os diferentes métodos de pi adinho direto ara terizam-se pela es olha da função de tentativas su essivas.•
No aso do pi adinho linear abaixo, a seqüên ia de lugares possíveis para um item dependeuni amente do valor de pi adinho primário deste.
•
Isto dá apenasm
seqüên ias diferentes na tabela, em vez dem!
.Pi adinho linear
•
Neste método, quando há uma olisão em umlugar de índi e
v
, tenta-se o índi ev + 1
da tabela.•
Se o m da tabela foi atingido, re omeça-se pelo iní io.•
Notação: sejaa ⊕ b
a operação que dá esta progessão ir ular:a ⊕ b
é denida em[1, m]
× [1, m]
:
sea + b ≤ m, a ⊕ b = a + b
senão,a ⊕ b = a + b − m
•
Dada uma função de pi adinho uniformeh : U → [1, m]
onstrói-se a seguinte seqüên ia de tentativas : tentativa1
(x) = h(x);
tentativa2
(x) = h(x)
⊕ 1;
. . . tentativai
(x) = h(x)
⊕ i − 1;
. . . tentativam
(x) = h(x)
⊕ m − 1;
•
Exemplo: A inserção su essiva dos itens abaixo, om seus respe tivos valores de pi adinhoprimário
e
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
e
9
6 4 7 4 8 2 5 9 8
em uma tabela de 10 itens dá a seguinte repartição:
1 e
9
2 e
6
3
4 e
2
5 e
4
6 e
1
7 e
3
8 e
5
9 e
7
10 e
8
•
Este exemplo olo a em evidên ia 2 fenmenos ara terísti os do pi adinho linear:1. Todos os itens om o mesmo endereço de pi adinho primário também têm a mesma seqüên ia de tentativas su essivas: não há dispersão alguma após o 1
o
2. Além disso, há agrupamento na tabela:
quanto maior forem os agrupamentos de itens onse utivos, maior a tendên ia a
aumentarem ( aso dos itens inseridos aós
e
5
).•
Este método tem a vantagem de só pre isar de uma função de pi adinho e as tentativas são muito simples de al ular.•
Basta modi ar, no algoritmo anterior, ainstrução v:=tentativa(i,x) por v:=v
⊕
1, a ini ialização e a terminação do laço ligeiramente. Análise de omplexidade do pi adinho linear•
Para uma função de pi adinho uniforme, o n o médio de exames de lugares, quandon
em
tendem para innito, om a razãon
m
= α
xa,vale assintoti amente:
Para uma pesquisa positiva: Med
pesq
+
(m, n)
∼
1
2
(1 +
1
1
− α
)
no aso da pesquisa negativa: Med
pesq
−
(m, n)
∼
1
2
(1 +
1
(1
− α)
2
)
•
Por exemplo,α = 0, 5
dá 1,5 exames de lugares, em média, para uma pesquisa positiva e 2,5 para uma pesquisa negativa.•
Paraα = 0, 8
, tem-se 3 exames de lugar para uma pesquisa positiva e 13 para uma pesquisanegativa, por ausa dos agrupamentos. Pi adinho duplo
•
Para evitar a formação de agrupamentos de itens ontíguos, é pre iso dispersá-los mais, quando há olisões.•
Tome-se omo seqüên ia de tentativas: tentativai
(x) = h(x)
⊕ k.(i − 1)
ondek
é um no
xo.
•
Sek
em
são primos entre si, então a seqüên ia dem
tentativas al ança todos os lugares da tabela.•
No entanto, o mesmo fenmeno de agrupamento a onte e, mesmo se é dek
emk
.•
Para evitar isso, é pre iso que o in rementok
dependa do item.•
É pre iso utilizar uma 2 afunção de pi adinho, o que justi a o nome dado ao método.
•
A seqüên ia de tentativas é, então, a seguinte: tentativai
(x) = h(x)
⊕ d(x).(i − 1)
•
A funçãod
deve ser tal que, para todo elementox
deU
, a seqüên ia dasm
tentativas leve em onta todos os lugares da tabela.•
Isto é verdade sed(x)
é primo omm
para todox
.•
Esta propriedade é satisfeita se es olhemos:seja
m
primo e, neste aso, basta qued
tome valores em[1, m
− 1]
;seja
m = 2
p
e basta que
d(x)
seja ímpar para todox
, o que pode ser onseguido tomandod(x) = 2d
′
(x) + 1
, onded
′
é uma função om valores em
[0, 2
p−1
− 1]
.
Análise da omplexidade do pi adinho duplo
•
O n omédio de exames de lugares para uma
ontendo
n
itens, param
en
grandes eα = n/m
vale, assintoti amente,1
1
− α
e para a pesquisa positiva, vale
1
α
ln
1
1
− α
.
Comparação entre os métodos de pi adinho
1
2
3
4
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Med pesq−(m,n)
Taxa de ocupação da tabela (n/m)
Média da pesquisa negativa em tabelas de picadinho
Linear
Duplo
Coalescente
Separado
1
2
3
4
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Med pesq+(m,n)
Taxa de ocupação da tabela (n/m)
Média da pesquisa positiva em tabelas de picadinho
Linear
Duplo
Coalescente
•
Das guras anteriores, tiramos as seguintes on lusões:1. Para uma taxa de preen himento baixa, todos os métodos são aproximadamente
equivalentes.
2. O método mais e az é o de pi adinho om en adeamento separado. Esse método, tem também duas outras vantagens sobre os outros métodos: a supressão de um item é uma operação simples e a taxa de
preen himento pode ultrapassar 1. Mas
ne essita de alo ação dinâmi a de memória. 3. Quando a memória reservada ao pi adinho
deve ser reservada a priori, o método
oales ente é o mais e az. No entanto, esse método ne essita de endereçamento indireto, que utiliza memória. Se o tamanho dos itens são grandes em relação ao tamanho de um apontador, isto não tem importân ia, mas, no aso ontrário, é melhor utilizar os métodos diretos.
4. O pi adinho linear é o mais lento, mas tem a vantagem de ser simples de ser implementado e seus desempenhos são bem a eitáveis
quando a taxa de preen himento é baixa.
•
Todos os métodos de pi adinho são muito bons para gestão de dados estáti os.•
Se se onhe e o n ode itens, es olhe-se o tamanho