Atualização: veja abaixo uma atualização sobre a incorreta desta operação de associação
Aqui está um esboço muito aproximado de uma possível solução:
Acho que posso ter uma solução para esse problema usando um tipo de árvore B + aleatoriamente balanceada. Como trufas, essas árvores têm uma representação única. Ao contrário de treaps, eles armazenam algumas chaves várias vezes. Talvez seja possível corrigir isso usando um truque das "Árvores de pesquisa enviesada" de Bent et al, de armazenar cada chave apenas no nível mais alto (ou seja, mais próximo da raiz) em que ela aparece)
Uma árvore para um conjunto ordenado de valores exclusivos é criada associando-se primeiro a cada valor a um fluxo de bits, semelhante à maneira como cada valor em um treap é associado a uma prioridade. Cada nó na árvore contém um fluxo de chave e de bit. Os nós que não são folhas contêm, além disso, um número natural que indica a altura da árvore enraizada nesse nó. Nós internos podem ter qualquer número diferente de zero de filhos. Como as árvores B +, todos os caminhos que não se interceptam da raiz até uma folha têm o mesmo comprimento.
Todo nó interno contém (como nas árvores B +) a maior chave k de suas folhas descendentes. Cada um também contém um número natural i, indicando a altura da árvore enraizada em ve fluxo de bits associado a k, a partir do i + 1 º bit em diante. Se toda chave na árvore enraizada em v tem o mesmo primeiro bit em seu fluxo de bits, todo filho de v é uma folha e i é 1 . Caso contrário, os filhos de v são nós internos todos os que têm o mesmo i th bit no fluxo de bits associados com sua chave.vkivki+1vvi1vi
Para criar uma árvore a partir de uma lista classificada de chaves com fluxos de bits associados, primeiro colete as chaves em grupos contíguos com base no primeiro bit em seus fluxos. Para cada um desses grupos, crie um pai com a chave e o fluxo de bits da maior chave do grupo, mas excluindo o primeiro bit do fluxo. Agora, faça o mesmo procedimento de agrupamento nos novos pais para criar avós. Continue até que apenas um nó permaneça; essa é a raiz da árvore.
A seguinte lista de chaves e (início de) fluxos de bits é representada pela árvore abaixo dela. Nos prefixos de fluxo de bits, um '.' significa qualquer coisa. Ou seja, qualquer fluxo de bits para a chave A com 0 em primeiro lugar produz a mesma árvore que qualquer outra, assumindo que o fluxo de bits de nenhuma outra chave seja diferente.
A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001
____H____
/ \
E H
| / \
__E__ G H
/ | \ | |
B C E G H
/ \ | / \ / \ |
A B C D E F G H
Todo filho de um nó interno específico tem o mesmo bit em primeiro lugar do seu fluxo de bits. Isso é chamado de "cor" do pai - 0 é vermelho, 1 é verde. A criança tem um "sabor", dependendo do primeiro bit do seu fluxo de bits - 0 é cereja, 1 é hortelã. As folhas têm sabores, mas não cor. Por definição, um nó cereja não pode ter um pai verde e um nó hortelã não pode ter um pai vermelho.
n21−n (n−1i−1)(n+1)/2n≥2≤34nO(lgn)
Para unir duas árvores de altura igual, verifique primeiro se as raízes são da mesma cor. Nesse caso, corte da raiz esquerda seu filho mais à direita e da raiz direita seu filho mais à esquerda, e junte recursivamente essas duas árvores. O resultado será uma árvore da mesma altura ou uma mais alta, pois as árvores têm o mesmo sabor (veja abaixo). Se o resultado da junção recursiva das duas árvores tiver a mesma altura dos dois filhos cortados, torne-o filho do meio de uma raiz com os filhos restantes da raiz esquerda antes dela e os filhos restantes da raiz direita depois dela. Se for 1 mais alto, faça de seus filhos os filhos do meio de uma raiz, com os filhos restantes da raiz esquerda antes dela e os filhos restantes da raiz direita depois dela. Se as raízes tiverem cores diferentes, verifique se elas têm o mesmo sabor. Se eles fizerem, forneça a eles um novo pai com o fluxo de chaves e bits da raiz direita, eliminando o primeiro bit. Caso contrário, atribua a cada raiz um novo pai com a chave e o fluxo de bits da raiz antiga (excluindo cada primeiro bit) e junte recursivamente essas árvores.
1/21/2O(1)1/4, e as chamadas recursivas subseqüentes sempre estão em árvores com cores diferentes; portanto, a mesma análise se aplica.
1/2O(1)
O(1)
a 01110
b 110..
c 10...
d 00000
A árvore feita por [a,b]
tem altura 2, a árvore feita por [c,d]
tem altura 2 e a árvore feita por joinEqual (tree [a,b]) (tree [c,d])
tem altura 3. No entanto, a árvore feita por [a,b,c,d]
tem altura 5.
Aqui está o código que eu usei para encontrar esse erro .