É um problema em aberto se você pode fazer a seleção com tempo e células de memória extras sem alterar a entrada (veja aqui ). Mas você pode chegar bem perto disso.O(n)O(1)
Munro e Raman propuseram um algoritmo para seleção que é executado no tempo enquanto usa apenas armazenamento extra (células). Este algoritmo deixa a entrada inalterada. Você pode escolher qualquer pequeno .O(n1+ε)O(1/ε)ε>0
Em sua essência, o algoritmo de Munro e Raman funciona como o algoritmo clássico : mantém um limite esquerdo e direito (chamado filtro ), que são dois elementos com classificação conhecida. O elemento solicitado está contido entre os dois filtros (classificação). Escolhendo um bom elemento pivô , podemos verificar todos os números nos filtros . Isso torna possível atualizar os filtros e diminui o número de elementos restantes para verificação (classificação). Repetimos até encontrar o elemento de solicitação.O(n)pp
O que é diferente do algoritmo clássico é a escolha de . Seja o algoritmo que resolve a seleção para . O algoritmo divide a matriz em blocos de tamanho igual e identifica um bloco em que existem muitos elementos, cujas fileiras estão entre os filtros (existência pelo princípio do buraco de pombo). Este bloco será verificado em busca de um bom elemento pivô com a ajuda do algoritmo . A âncora de recursão é o algoritmo trivial . O tamanho certo do bloco (e fazendo as contas) fornece os requisitos de tempo e espaço de execução, conforme indicado acima.pA(k)ε=1/kA(k)A(k−1)A(1)
Btw, os algoritmos que você está procurando, foram nomeados recentemente como algoritmos de espaço de trabalho constante .
Não conheço nenhum limite inferior.