A classificação parcial pode ajudar no custo de pesquisa em matrizes?

7

Procurar algo em uma lista não classificada é uma tarefa com complexidade de tempo O(n). 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 .O(log(n))O(nlog(n))

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 ?O(nlog(n))O(log(n))O(n)

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 ?O(nlog(n))O(n)O(log(n))

SE - pare de despedir os mocinhos
fonte
Estou ciente de que pode haver um erro ou equívoco muito básico em algum lugar. Não sou e nunca estudei ciência da computação e não me sinto à vontade com o Onotação.
SE - pare de disparar os mocinhos
2
Você pode classificar uma lista em O(nlogn)Tempo.
21716 Rick Decker às
11
Não está claro o que exatamente você está procurando, mas adote uma versão dinâmica de mediana rápida (garantida para funcionar em nlogn em troca de sobrecarga mediana. Agora, metade das etapas. O que isso lhe dá? Os dados são particionados e em os cada elementos de partição são não muito longe do índice ordenado mas durante lookup você tem que atravessar uma partição.
Mal
2
Por favor, defina o que exatamente você quer dizer com "parcialmente classificado". Existem muitas noções concorrentes de classificação na literatura.
Raphael
11
"É possível processar uma matriz não classificada com um algoritmo mais rápido do que O(nlog(n))tal, para que um algoritmo de pesquisa possa fazer uma pesquisa mais rapidamente do que O(n)" Talvez. "A classificação parcial pode ajudar no custo de pesquisa em matrizes?" Absolutamente não (para uma única pesquisa).
Mooing Duck

Respostas:

12

Se você executar o "Quicksort equilibrado" (usando a mediana exata em cada etapa) até a profundidade k (ao custo de O(nk)), você obtém uma partição da matriz original em 2k partes classificadas de n/2kelementos 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 se k=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, se1klogn 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).

Yuval Filmus
fonte
2
Se o quicksort equilibrado conhece o valor-alvo e só se repete do lado com o valor-alvo, então o tempo é de ~ 4n para atingir a profundidade total. É assim que o C ++ std::partial_sorté implementado.
Mooing Duck
Uma alternativa é a classificação incompleta do radical. O tempo de pré-processamento pode ser mais rápido, mas há menos controle sobre os tamanhos da caçamba. Um comentário semelhante pode ser feito sobre o prefixo hash perfeito.
Eric Towers