Recebemos um fluxo de pares diferentes de números do conjunto { 1 , … , n } .
Como posso determinar o número ausente com um algoritmo que lê o fluxo uma vez e usa uma memória de apenas bits?
Recebemos um fluxo de pares diferentes de números do conjunto { 1 , … , n } .
Como posso determinar o número ausente com um algoritmo que lê o fluxo uma vez e usa uma memória de apenas bits?
Você sabe e porqueS=n(n+1) pode ser codificado embitsO(log(n)),isso pode ser feito namemóriaO(logn)e em um caminho (basta encontrarS-currentSum, esse número está faltando).
Mas esse problema pode ser resolvido no caso geral (para a constante ): temos k números ausentes, descubra todos eles. Nesse caso, em vez de calcular apenas a soma de y i , calcule a soma da j'st de x i para todos os 1 ≤ j ≤ k (assumi que x i está faltando números e y i é um número de entrada):
Lembre-se que você pode calcular simplesmente, porque S 1 = S - Σ y i , S 2 = Σ i 2 - Σ Y 2 i , ...
Agora, para encontrar números ausentes, você deve resolver para encontrar todos os x i .
Você pode calcular:
, P 2 = ∑ x i ⋅ x j , ..., P k = ∏ x i ( 2 ) .
Para isso, lembre-se de que , P 2 = S 2 1 - S 2 ...
Mas é coeficiente de P = ( x - x 1 ) ⋅ ( x - x 2 ) ⋯ ( x - x k ), mas P pode ser fatorado exclusivamente, para que você possa encontrar números ausentes.
Estes não são meus pensamentos; leia isso .
Do comentário acima:
Antes de processamento da corrente, alocar bits, onde escrever x : = ⨁ n i = 1 b i n ( i ) ( b i n ( i ) é a representação binária de i e ⊕ é pontual exclusive- ou). Ingenuamente, isso leva tempo O ( n ) .⌈ log2n ⌉ x : = ⨁ni = 1b i n (i) b i n (i) Eu ⊕ O (n)
Ao processar o fluxo, sempre que alguém ler um número , calcule x : = x ⊕ b i n ( j ) . Vamos k ser o número único de { 1 , . . . n } que não está incluído no fluxo. Depois de ler todo o fluxo, temos x = ( n ⨁ i = 1 b i n ( i ) ) ⊕ ( ⨁ i ≠ k bj x : = x ⊕ b i n ( j ) k { 1 , . . . n }
obtendo-se o resultado desejado.
Portanto, usamos espaço e temos um tempo de execução geral de O ( n ) .O ( logn ) O (n)
fonte
value
fonte