Aqui está um problema conhecido.
Dada uma matriz de números inteiros positivos, produz o menor número inteiro positivo que não está na matriz.
O problema pode ser resolvido no espaço e no tempo : leia a matriz, acompanhe no espaço se ocorreu, procure o menor elemento.O ( n ) 1 , 2 , … , n + 1
Notei que você pode trocar espaço por tempo. Se você tiver apenas memória , poderá fazê-lo em rodadas e obter tempo . Em um caso especial, obviamente existe um algoritmo de tempo quadrático no espaço constante.kO(kn)
Minha pergunta é:
Essa é a troca ideal, ou seja, ? Em geral, como alguém prova esse tipo de limites?
Assuma o modelo de RAM, com acesso aritmético e aleatório limitado a matrizes em O (1).
Inspiração para este problema: troca de espaço-tempo para palíndromos no modelo de uma fita (veja, por exemplo, aqui ).
Respostas:
Isso pode ser feito nas operações de palavrasO( n logn ) e O( 1 ) palavras de memória (respectivamente tempo O (n log2n ) e memória O( logn ) no modelo de RAM no nível de bit). De fato, a solução será baseada na seguinte observação.
Digamos existemn0 0 mesmo e n1 números ímpares na gama [ 1 , n + 1 ] (de modo n0 0≈ n1 e n0 0+ n1= n + 1 ). Então há b ∈ { 0 , 1 } tal forma que existem no máximo nb- 1 valores com paridade b na entrada. De fato, caso contrário, existem pelo menos n0 0 pares e pelo menos n1 valores ímpares na entrada, o que significa que há pelo menos n0 0+n1= n + 1 valores na entrada, contradição (existem apenas n deles). Isso significa que podemos continuar pesquisando o número ausente apenas entre os números ímpares ou pares. O mesmo algoritmo também pode ser aplicado a bits mais altos de notação binária.
Portanto, nosso algoritmo ficará assim:
Suponha que já agora existam apenas valores dex na entrada, com o restante do módulo 2b igual a r ∈ [ 0 , 2b) mas há pelo menos x + 1 números no intervalo [ 1 , n + 1 ] que possuem restante r módulo 2b (no início sabemos com certeza para b = 0 , r = 0 ).
Digamos que existam valoresx0 na entrada com o restante do módulo r 2b+1 e valores x1 na entrada com o restante r+2b módulo 2b+1 (podemos encontrar esses números em uma única passagem pela entrada). Claramente, x0+x1=x . Além disso, como existem pelo menos x+1 números na entrada com o restante r módulo 2b , pelo menos um dos pares(r,b+1),(r+2b,b+1) satisfaz os requisitos da etapa1 .
Encontramos o número ausente quando2b⩾n+1 : existe apenas um número no intervalo [1,n+1] que pode ter o restante r módulo 2b ( r si, se estiver no intervalo), então existem no mais zero valores na entrada que possuem esse restante. Então r realmente está faltando.
Claramente, o algoritmo pára nas etapasO(logn) , cada uma delas precisa de tempo O(n) (passagem única sobre a matriz de entrada). Além disso, são necessárias apenas O(1) palavras de memória.
fonte
Se eu entendo suas definições, isso pode ser feito em tempo linear com espaço constante. Este é obviamente o limite mais baixo, porque precisamos pelo menos ler toda a entrada.
A resposta dada nesta pergunta é satisfatória.
É impossível executar isso com menos tempo ou espaço, e adicionar tempo ou espaço extra é inútil, portanto, não há troca de espaço-tempo aqui. (Observe que , para que o tradeoff que você observou não seja assintoticamente, em nenhum caso).n=O(n/k)
Em termos de sua pergunta geral, não conheço nenhum bom teorema de improviso que o ajude a provar trocas no espaço-tempo. Esta pergunta parece indicar que não há uma resposta fácil (conhecida). Basicamente:
é desconhecido, e uma resposta forte resolveria muitos problemas em aberto (principalmente sobre SC), o que implica que não existe uma solução fácil.
EDIT: Ok, com repetição (mas ainda estou assumindo que, com uma entrada de tamanho o número máximo possível é n + 1 ).n n+1
Observe que nosso algoritmo precisa ser capaz de diferenciar entre pelo menos respostas possíveis. Suponha que, a cada passagem dos dados, possamos obter no máximo k partes de dados. Em seguida, precisaremos de n / k passes para diferenciar todas as respostas. Supondo que k = n / s então corremos em nn k n/k k=n/s tempo. Então eu acho que isso prova o que você quer.nn/sn=sn
A dificuldade está em mostrar que, a cada vez, obtemos apenas bits. Se você assumir que nossa única operação legal é =, então estamos bem. No entanto, se você permitir operações mais complexas, poderá obter mais informações.k
fonte