Nous recevons un flux de nombres différents par paire de l'ensemble .
Comment puis-je déterminer le nombre manquant avec un algorithme qui lit le flux une fois et utilise une mémoire de seulement bits?
Nous recevons un flux de nombres différents par paire de l'ensemble .
Comment puis-je déterminer le nombre manquant avec un algorithme qui lit le flux une fois et utilise une mémoire de seulement bits?
Vous savez , et parce queS=n(n+1) pourraient être codés enO(log(n))bits cela peut être fait dans lamémoireO(logn)et dans un chemin (il suffit de trouverS-currentSum, c'est le nombre manquant).
Mais ce problème pourrait être résolu dans le cas général (pour constant ): nous avons k nombres manquants, découvrez-les tous. Dans ce cas, au lieu de calculer simplement la somme de y i , calculez la somme de la puissance j'st de x i pour tous les 1 ≤ j ≤ k (j'ai supposé que x i est des nombres manquants et y i est des nombres en entrée):
Rappelez -vous que vous pouvez calculer simplement, car S 1 = S - ∑ y i , S 2 = ∑ i 2 - ∑ y 2 i , ...
Maintenant, pour trouver les nombres manquants, vous devez résoudre pour trouver tous les x i .
Vous pouvez calculer:
, P 2 = ∑ x i ⋅ x j , ..., P k = ∏ x i ( 2 ) .
Pour cela rappelez-vous que , P 2 = S 2 1 - S 2 , ...
Mais est des coefficients de P = ( x - x 1 ) ⋅ ( x - x 2 ) ⋯ ( x - x k ) mais P pourrait être factorisé de manière unique, de sorte que vous pouvez trouver les nombres manquants.
Ce ne sont pas mes pensées; lisez ceci .
Du commentaire ci-dessus:
Avant de traiter le flux, bits, dans lequel vous écrivez x : = ⨁ n i = 1 b i n ( i ) ( b i n ( i ) est la représentation binaire de i et ⊕ est point par point exclusif- ou). Naïvement, cela prend du temps O ( n ) .⌈log2n⌉ x:=⨁ni=1bin(i) bin(i) i ⊕ O(n)
Hence, we usedO(logn) space, and have an overall runtime of O(n) .
la source
La solution de HdM fonctionne. Je l'ai codé en C ++ pour le tester. Je ne peux pas limiter leO ( log2n ) bits, mais je suis sûr que vous pouvez facilement montrer comment seul ce nombre de bits est réellement défini.
value
àPour ceux qui veulent du pseudo code, en utilisant un simpleplier fonctionnement exclusif ou (⊕ ):
Preuve ondulée à la main: 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.
la source