回答:
あなたが知っている、及びためで符号化することができるビットこれはメモリと1つのパスで実行できます(見つけてください。これは数値がありません)。 S=n(n+1) O(log(n))O(logn)S−currentSum
しかし、この問題は、(一定のための一般的なケースで解決することができ):我々は不足している番号を、それらのすべてを見つけます。この場合、合計を計算する代わりに、すべてのののj'st乗の合計を計算します(は欠損数で、は入力数であると仮定します):、K 、Y 、I X 、I 1 ≤ J ≤ kはX I 、Y I
あなたが計算できることを覚えておいてくださいするので、単に、、...
欠落している数字を見つけるには、すべてのx_iを見つけるためにを解く必要があります。
以下を計算できます:
、、...、(2 ) 。
このため、 、、...
しかし、は係数ですが、一意に因数分解できるため、欠落している数値を見つけることができます。 P =P
これらは私の考えではありません。これを読んでください。
上記のコメントから:
ストリームを処理する前に、ビットを割り当てます(はおよびバイナリ表現は、点ごとに排他的です(または)。単純に、これには時間かかります。X := ⨁ N iは= 1 bのI N(I )B I N(I )I ⊕ O(N )
ストリームの処理時に、数値読み取るたびに、計算します。ましょうから単一の数でストリームに含まれません。ストリーム全体を読み取った後、 目的の結果が得られます。X := X ⊕ B I N(J )K { 1 、。。。N } 、X = (N ⨁ iが= 1 bのI N(I )) ⊕ (⨁ I ≠ K B 、I N(I )) = B I N(K )⊕ ⨁ I ≠ K
したがって、スペースを使用し、全体的なランタイムは。
HdMのソリューションは機能します。それをテストするためにC ++でコーディングしました。私は制限することはできませんvalue
にビットを、私はあなたが簡単にビット数が実際に設定されていることをどのようにのみ表示することができますよ。
擬似コードが必要な場合は、排他的()を指定した単純な操作を使用し。
手振りの証明:は入力よりも多くのビットを必要としないため、上記の中間結果は入力の最大ビットビット)を超える必要はありません。は可換であり、。したがって、上記を展開し、ストリームに存在するすべてのデータをペアにすると、一致しない単一の値、欠落している数値のみが残ります。
#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;
void find_missing( int const * stream, int len );
int main( int argc, char ** argv )
{
if( argc < 2 )
{
cerr << "Syntax: " << argv[0] << " N" << endl;
return 1;
}
int n = atoi( argv[1] );
//construct sequence
vector<int> seq;
for( int i=1; i <= n; ++i )
seq.push_back( i );
//remove a number and remember it
srand( unsigned(time(0)) );
int remove = (rand() % n) + 1;
seq.erase( seq.begin() + (remove - 1) );
cout << "Removed: " << remove << endl;
//give the stream a random order
std::random_shuffle( seq.begin(), seq.end() );
find_missing( &seq[0], int(seq.size()) );
}
//HdM's solution
void find_missing( int const * stream, int len )
{
//create initial value of n sequence xor'ed (n == len+1)
int value = 0;
for( int i=0; i < (len+1); ++i )
value = value ^ (i+1);
//xor all items in stream
for( int i=0; i < len; ++i, ++stream )
value = value ^ *stream;
//what's left is the missing number
cout << "Found: " << value << endl;
}