Otrzymujemy strumień par różnych liczb ze zbioru .
Jak mogę ustalić brakującą liczbę za pomocą algorytmu, który odczytuje strumień raz i wykorzystuje pamięć tylko bitów?
źródło
Otrzymujemy strumień par różnych liczb ze zbioru .
Jak mogę ustalić brakującą liczbę za pomocą algorytmu, który odczytuje strumień raz i wykorzystuje pamięć tylko bitów?
Wiesz , a ponieważ można zakodować wbitachO(log(n)),można to zrobić wpamięciO(logn)i na jednej ścieżce (po prostu znajdźS-cur to brakuje liczba).
Ale problem ten można rozwiązać w ogólnym przypadku (dla stałej ): mamy k brakujących liczb, znajdź je wszystkie. W tym przypadku zamiast obliczania tylko suma rw I , suma oblicz z j'st potęgi x i dla wszystkich 1 ≤ j ≤ k (Przypuszczałem X i jest brakujące numery i y i to numery wejściowe):
Pamiętaj, że możesz obliczyć po prostu dlatego, S 1 = S - Ď y I , Ś 2 = Σ i 2 - Σ Y 2 i ...
Teraz, aby znaleźć brakujące liczby, powinieneś rozwiązać aby znaleźć wszystkie x i .
Możesz obliczyć:
, P 2 = ∑ x i ⋅ x j , ..., P k = ∏ x i .
W tym celu należy pamiętać, że , P 2 = S 2 1 - S 2 , ...
Ale to współczynniki P = ( x - x 1 ) ⋅ ( x - x 2 ) ⋯ ( x - x k ), ale P można by rozłożyć na czynniki specjalne, dzięki czemu można znaleźć brakujące liczby.
To nie są moje myśli; przeczytaj to .
Z powyższego komentarza:
Before processing the stream, allocate⌈log2n⌉ bits, in which you write x:=⨁ni=1bin(i) (bin(i) is the binary representation of i and ⊕ is pointwise exclusive-or). Naively, this takes O(n) time.
Upon processing the stream, whenever one reads a numberj , compute x:=x⊕bin(j) . Let k be the single number from {1,...n} that is not included in the stream. After having read the whole stream, we have
Hence, we usedO(logn) space, and have an overall runtime of O(n) .
źródło
HdM's solution works. I coded it in C++ to test it. I can't limit theO(log2n) bits, but I'm sure you can easily show how only that number of bits is actually set.
value
toFor those that want pseudo code, using a simplefold operation with exclusive or (⊕ ):
Hand-wavey proof: A⊕ never requires more bits than its input, so it follows that no intermediate result in the above requires more than the maximum bits of the input (so O(log2n) bits). ⊕ is commutative, and x⊕x=0 , thus if you expand the above and pair off all data present in the stream you'll be left only with a single un-matched value, the missing number.
źródło