Aqui está uma idéia para resolver o problema, com dois conjuntos:
Você pode segurar "conjuntos" por uma árvore vermelha e preta. Além disso, para cada nó da árvore, associamos um bit para determinar se sua subárvore contém um elemento nos dois conjuntos. Para fins de apresentação, é chamado de bit de inserção . Presumo que a árvore preta e vermelha classifique os elementos da esquerda para a direita.
Ao inserir um elemento na árvore, o algoritmo verifica se o elemento existe na árvore (ou seja, no outro conjunto). Caso contrário, inserimos o elemento como de costume. Caso contrário, viajando da raiz para a folha que contém o elemento, o algoritmo ativa o bit de inserção dos nós correspondentes. Na pior das hipóteses, é necessário .O(logn)
Ao excluir um elemento, o algoritmo verifica se o elemento existe na árvore e se o bit de inserção está ativado. Se o elemento não existir na árvore, retornamos um erro. Se o elemento existir e o bit de inserção estiver desativado, excluiremos o elemento como no algoritmo da árvore Red Black. Caso contrário, viajando da raiz para a folha que contém o elemento, o algoritmo desativa o bit de inserção dos nós correspondentes. A exclusão leva .O(logn)
Finalmente, o algoritmo para encontrar o elemento mínimo compartilhado pelos dois conjuntos começa com a raiz. Se o bit de inserção da raiz for desativado - os conjuntos serão desarticulados, o algoritmo retornará um erro. Caso contrário, o algoritmo viaja recursivamente para o filho esquerdo se seu bit de inserção estiver ativado e, caso contrário, ele viaja para o filho certo. O algoritmo para no elemento com o valor mínimo. O algoritmo é executado em .O(logn)
Estou tentando pensar em como generalizar o para um número maior de conjuntos ...