Eu estou procurando por uma estrutura de dados para armazenar um conjunto que, considerando duas instâncias do tamanho que são conhecidas por terem interseção não vazia, o elemento mínimo da interseção possa ser encontrado em . Isso é possível de alcançar, para o pior caso ou para a complexidade amortizada? Outros requisitos para a estrutura de dados: deleção, a inicialização.
Aqui está um exemplo de aplicação dessa estrutura de dados, para esclarecer os requisitos. A entrada consiste em n subconjuntos de todos contendo o número n. A saída é uma matriz n por n cuja entrada é o elemento mínimo na interseção dos conjuntos iej. Com uma abordagem básica, pode-se resolver esse problema em . Com uma estrutura de dados que satisfaça as condições acima, pode-se resolvê-la em .
fonte
Respostas:
Você não pode. Não existe essa estrutura de dados. Supondo que você tenha uma instância separada por conjunto e cada instância seja inicializada separadamente (usando apenas informações sobre o conjunto que representa e não informações sobre nenhum dos outros conjuntos), esses tempos de execução não são alcançáveis.
Em particular, quando você tem dois conjuntos, encontrar o elemento comum mínimo leva . De fato, testar a disjunção requer tempo , conforme explicado aqui . Agora, imagine começar com dois conjuntos sobre o universo . Deixe e . Agora são garantidos para ter um elemento comum. Portanto, se você tiver uma boa estrutura de dados para o seu problema, armazene em uma instância da estrutura de dados e em outra. Então, se tivéssemos uma maneira de encontrar o elemento mínimo de emΩ(n) Ω(n) S1,S2 {1,2,…,n−1} T1=S1∪{n} T2=S2∪{n} T1,T2 T1 T2 T1∩T2 o(n) tempo, isso nos daria uma maneira de testar a de em tempo (apenas teste se o elemento mínimo é menor que ) - mas já sabemos que o último não é possível. Daqui resulta que o primeiro também não é possível, ou seja, qualquer estrutura de dados para o seu problema deve levar para encontrar o elemento comum mínimo de dois conjuntos.S1,S2 o(n) n Ω(n)
Isso não significa que seu aplicativo não possa ser resolvido com eficiência. Ainda pode haver uma maneira de resolver seu aplicativo em ; esse resultado não descarta isso.O(n2logn)
fonte
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 ...
fonte
Inicialize:
1) crie uma árvore vermelho-preta contendo todos os elementos da lista 1 - O (n log n) para toda a lista.
2) repita todos os elementos da lista nº 2 e verifique se ela existe na árvore vermelha e preta - O (n log n) para toda a lista
3) se ela existe na árvore vermelha e preta, insira esse elemento da lista # 2 na sua pilha mínima favorita - O (n log n) para toda a lista
Para pesquisar, encontre o elemento mínimo de interseção, basta olhar para o topo da pilha, então é O (1).
fonte