Wir erhalten einen Strom von paarweise unterschiedlichen Zahlen aus der Menge .
Wie kann ich die fehlende Zahl mit einem Algorithmus ermitteln, der den Stream einmal liest und nur einen Speicher von Bits verwendet?
quelle
Wir erhalten einen Strom von paarweise unterschiedlichen Zahlen aus der Menge .
Wie kann ich die fehlende Zahl mit einem Algorithmus ermitteln, der den Stream einmal liest und nur einen Speicher von Bits verwendet?
Sie wissen , dass und weil konnte in codierter werdenBits dies getan werden kannSpeicher und in einem Weg (nur finden, dies fehlt Zahl).
Aber dieses Problem könnte im allgemeinen Fall (für die Konstante ) gelöst werden : Wir haben k fehlende Zahlen, finden Sie alle heraus. In diesem Fall, anstatt nur die Summe von y i zu berechnen, berechnen Sie die Summe der j'sten Potenz von x i für alle 1 ≤ j ≤ k (ich nahm an, dass x i fehlende Zahlen und y i eingegebene Zahlen sind):
Denken Sie daran , dass Sie berechnen können , einfach, weil S 1 = S - ∑ y i , S 2 = ∑ i 2 - ∑ y 2 i , ...
Um nun fehlende Zahlen zu finden, müssen Sie lösen , um alle x i zu finden .
Sie können berechnen:
, P 2 = ≤ x i ≤ x j , ..., P k = ≤ x i ( 2 ) .
Beachten Sie dazu , dass , P 2 = S 2 1 - S 2 , ...
Aber ist Koeffizienten von P = ( x - x 1 ) ⋅ ( x - x 2 ) ⋯ ( x - x k ) aber P berücksichtigt werden kann eindeutig, so dass Sie fehlende Zahlen finden.
Das sind nicht meine Gedanken; lies das .
Aus dem obigen Kommentar:
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.
Berechnen Sie nach der Verarbeitung des Streams immer dann, wenn man eine Zahl liest , x : = x ⊕ b i n ( j ) . Lassen Sie k die Zahlen von seinem { 1 , . . . n } , das nicht im Stream enthalten ist. Nachdem wir den gesamten Strom gelesen haben, haben wir x = ( n ⨁ i = 1 b i n ( i ) ) ⊕ ( ⨁ i ≠ k bj x:=x⊕bin(j) k {1,...n}
das gewünschte Ergebnis ergibt.
Daher haben wir verwendet und haben eine Gesamtlaufzeit von O ( n ) .O(logn) O(n)
quelle
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.
quelle