Li uma pergunta e estou procurando informações sobre como resolvê-la:
Os números são gerados aleatoriamente e armazenados em uma matriz (em expansão). Como você acompanharia a mediana?
Existem duas estruturas de dados que podem resolver o problema. Uma é a árvore binária balanceada, a outra são duas pilhas que rastreiam a metade maior e a menor metade dos elementos. Acho que essas duas soluções têm o mesmo tempo de execução O(n lg n)
, mas não tenho certeza do meu julgamento.
Qual é a melhor maneira de acompanhar a mediana?
Minha tentativa:
Nesta questão, acho que um monte é a melhor maneira de acompanhar a mediana. Existem dois montões, o grande e o pequeno, que não precisam ser seqüenciais. Primeiro, calculamos o valor médio dos elementos na matriz. Se o elemento for menor que o valor médio, colocaremos o num no pequeno heap. Pelo contrário, colocamos o num no monte grande. Se o número da pilha grande for igual ao número da pilha pequena, o maior na pilha pequena e o menor na pilha grande será a mediana. Se os dois heaps tiverem tamanho diferente, basta colocar o elemento raiz do heap com tamanho maior e empurrá-lo para a raiz do heap de tamanho menor. Para heap grande, o elemento raiz é o menor e, para heap pequeno, o elemento raiz é o maior. Dessa forma, se os dois montões tiverem o mesmo tamanho ou uma diferença digital,
Penso que esta solução tem o tempo de execução como O (m * n), m significa os tempos em que ajustamos os montes de desequilíbrio.
Essa é a melhor maneira de acompanhar a mediana?
std::nth_element
alguém?