Troca de tempo e espaço por problema de elemento ausente


14

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.A[1n]

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 + 1O(n)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)O(nk)kO(kn)

Minha pergunta é:

Essa é a troca ideal, ou seja, ? Em geral, como alguém prova esse tipo de limites?timespace=Ω(n2)

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 ).


2
Não, você pode classificar sua matriz em O(nlogn) e encontrar o número ausente (o primeiro número deve ser 1, o segundo deve ser 2, ... caso contrário, você o encontrará) em O (n), essa classificação pode ser feita com mergesort no local, significa O(1) espaço extra; portanto, o tempo espaço pertence a O(nlogn) . Não sei se entendi exatamente o seu problema (por isso não respondi, também não sei se há um limite melhor).

Presumo que a entrada seja somente leitura. (Caso contrário, o problema pode ser resolvido de maneira ideal no espaço / O ( 1 ) : multiplique a entrada por 2 e use a paridade para simular o algoritmo O ( n ) / O ( n ) )O(n)O(1)O(n)/O(n)
sdcvvc

Qual é o algoritmo de espaço constante? Parece que você precisaria espaço para o n 2 versão que é "óbvio" para mimlognn2
Xodarap

Nesse modelo, números inteiros em tamanho de palavra recebem ; se for mais conveniente, você pode responder a qualquer variante da pergunta com tempo espaço = Ω ( n 2O(1)para alguma constantek. timespace=Ω(n2logkn)k
Sdcvvc

@sdcvvc, não consigo entender o seu algoritmo , você o descreveria um pouco mais? (observe que a leitura em bits leva O ( log n ) ). O(n)/O(1)O(logn)

Respostas:


2

Isso pode ser feito nas operações de palavras O(nlogn) e O(1) palavras de memória (respectivamente tempo O(nlog2n) 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 existem n0 mesmo e n1 números ímpares na gama [1,n+1] (de modo n0n1 e n0+n1=n+1 ). Então há b{0,1} tal forma que existem no máximo nb1 valores com paridade b na entrada. De fato, caso contrário, existem pelo menos n0pares e pelo menos n1 valores ímpares na entrada, o que significa que há pelo menos n0+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:

  1. Suponha que já agora existam apenas valores de x 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 ).

  2. Digamos que existam valores x0 na entrada com o restante do módulo r2b+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 .

  3. Encontramos o número ausente quando 2bn+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 etapas O(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.


Estou feliz em ver a pergunta respondida após esse tempo :)
sdcvvc

1

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:

Suponha que alguma linguagem seja decidida no tempo (usando uma certa quantidade de espaço) e no espaço s (usando uma certa quantidade de tempo). Podemos encontrar f , g tal que L é decidível por M , que é executado em f ( t , s ) tempo e g ( t , s ) espaço?tsf,gLMf(t,s)g(t,s)

é 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 ).nn+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 nnkn/kk=n/stempo. 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


3
A pergunta que você vinculou assume que cada número aparece no máximo uma vez. Como não faço essa suposição, a solução não se aplica. Obrigado pelo segundo link.
Sdcvvc

@sdcvvc: Meu erro, eu assumi que você estava usando a versão que eu estou familiarizado. Não tenho uma resposta completa, mas é muito longo para um comentário - espero que minha edição seja útil.
Xodarap

5
Não comprei seu argumento depois de "EDIT". Mesmo que você possa coletar bits em uma única passagem, isso é suficiente em princípio para distinguir 2 k saídas possíveis. Portanto, esse argumento pode implicar apenas um limite inferior de n / 2 k passes, não n / k . k 2kn/2kn/k
Jeffe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.