Esta é uma pergunta interessante que encontrei na web. Dado um array contendo n números (sem informações sobre eles), devemos pré-processar o array em tempo linear, para que possamos retornar os k menores elementos em O (k), quando recebermos um número 1 <= k <= n
Estive discutindo esse problema com alguns amigos, mas ninguém conseguiu encontrar uma solução; Qualquer ajuda seria apreciada!
notas rápidas: -a ordem dos k menores elementos não é importante -os elementos da matriz são número, podem ser números inteiros e podem não ser (portanto, nenhuma classificação de raiz) -o número k não é conhecido no estágio de pré-processamento. o pré-processamento é O (n) time. a função (encontre k elementos menores) no tempo O (k).
Respostas:
Pré-processe a matriz de valores no tempo O ( n ) :n O ( n )
O tempo total é precomputation dentroS ( 1 + 2 + 4 + . . . + N ) ⊆ S ( n )
Responda a uma consulta dos menores elementos em A no tempo O ( k ) :k UMA O ( k )
contém os k menores elementos.A[1..k] k
Referências:
fonte
Suponha por simplicidade quen=2m . Use o algoritmo de seleção de tempo linear para encontrar os elementos nas posições ; isso leva tempo linear. Dado k , encontre t tal que 2 t - 1 ≤ k ≤ 2 t ; note que 2 t ≤ 2 k . Filtrar todos os elementos da classificação no máximo 2 t2m−1,2m−2,2m−3,…,1 k t 2t−1≤k≤2t 2t≤2k 2t e agora use o algoritmo de seleção de tempo linear para encontrar o elemento na posição no tempo O ( 2 t ) = O ( k ) .k O(2t)=O(k)
Esclarecimento: Pode parecer que o pré-processamento leva tempo , e que é realmente o caso, se você não tiver cuidado. Aqui está como fazer o pré-processamento em tempo linear:Θ(nlogn)
fonte
Frederickson, Greg N. , Um algoritmo ideal para seleção em um min-heap , Inf. Comput. 104, No. 2, 197-214 (1993). ZBL0818.68065 ..
fonte
fonte