Procurar algo em uma lista não classificada é uma tarefa com complexidade de tempo . No entanto, se a lista estiver classificada, a complexidade do tempo será . Isso significa que às vezes vale a pena classificar uma matriz. No entanto, isso é uma troca, pois o algoritmo de classificação possui uma complexidade de tempo de .
Tanto quanto eu sei, você não pode classificar uma matriz em menos de . No entanto, eu estou querendo saber se existe algum algoritmo que pode classificar parcialmente a matriz em menos tempo do que isso? Tenho certeza de que você não pode procurar um valor em uma matriz parcialmente classificada em , mas você pode fazer melhor que ?
Em resumo, é possível processar uma matriz não classificada com um algoritmo mais rápido que modo que um algoritmo de pesquisa possa fazer uma pesquisa mais rápido que , embora não tão rápido quanto ?
fonte
O(nlog(n))
tal, para que um algoritmo de pesquisa possa fazer uma pesquisa mais rapidamente do queO(n)
" Talvez. "A classificação parcial pode ajudar no custo de pesquisa em matrizes?" Absolutamente não (para uma única pesquisa).Respostas:
Se você executar o "Quicksort equilibrado" (usando a mediana exata em cada etapa) até a profundidadek (ao custo de O(nk) ), você obtém uma partição da matriz original em 2k partes classificadas de n/2k elementos não classificados cada. Dado um elemento, podemos localizar a parte correta no tempoO(log(2k))=O(k) usando a pesquisa binária e, em seguida, procure-a usando um O(n/2k) , para uma complexidade total de O(n/2k+k) .
E sek=o(logn) então a classificação parcial leva tempo o(nlogn) . E sek=ω(1) então o algoritmo de pesquisa leva tempo o(n) . Assim, se1≪k≪logn Nós temos o(nlogn) tempo de pré-processamento e o(n) tempo de pesquisa. Por exemplo, sek=loglogn então o pré-processamento leva O(nloglogn) e pesquisa leva O(n/logn) .
fonte
std::partial_sort
é implementado.