Para encontrar a mediana de uma matriz não classificada, podemos fazer um min-heap em para n elementos e, em seguida, podemos extrair um por um n / 2 elementos para obter a mediana. Mas essa abordagem levaria tempo O ( n log n ) .
Podemos fazer o mesmo por algum método em time? Se pudermos, então como?
Respostas:
Este é um caso especial de um algoritmo de seleção que pode encontrar o menor elemento de uma matriz com k é a metade do tamanho da matriz. Existe uma implementação que é linear no pior dos casos.k k
Algoritmo de seleção genérico
Primeiro vamos ver um algoritmok
find-kth
que encontra o menor elemento de uma matriz:A função
split(A, pivot)
retorna deL,R
forma que todos os elementos emR
sejam maiores quepivot
eL
todos os outros (menos uma ocorrência depivot
). Então tudo é feito recursivamente.Pior caso linear: o algoritmo de mediana de medianas
Um pivô melhor é a mediana de todas as medianas de sub-matrizes
A
de tamanho 5, usando a chamada do procedimento na matriz dessas medianas.Observe que na maioria das vezes o uso de um pivô aleatório é mais rápido.
fonte
5
padrão? E se o tamanho de A for menor que 5?return A[k]
está incorreto (a menos queA
seja classificado, o que tornaria o algoritmo discutível). Sesplit
aconteceu de se dividir deA
tal forma quek = |L| + 1
você ainda não sabe onde está ok
elemento th. Seu caso base é quando|A| = 1
mais você ainda precisa fazer uma das duas chamadas recursivas.A idéia principal do algoritmo é usar amostragem. Temos que encontrar dois elementos que estão próximos na ordem classificada da matriz e que possuem a mediana entre eles. Veja a referência [MU2017] para uma discussão completa.
[MU2017] Michael Mitzenmacher e Eli Upfal. "Probabilidade e computação: aleatorização e técnicas probabilísticas em algoritmos e análise de dados", capítulo 3, páginas 57-62. Cambridge University Press, segunda edição, 2017.
fonte