जवाबों:
तुम्हें पता है , और क्योंकि कोबिट्समें कोडितकिया जा सकता है यहमेमोरी में और एक पथ मेंकिया जा सकता है(बस, यह अनुपलब्ध संख्या है)।
लेकिन इस समस्या को सामान्य स्थिति में हल किया जा सकता है (निरंतर ): हमारे पास k लापता संख्याएं हैं, उन सभी का पता लगाएं। बजाय सिर्फ का योग की गणना के इस मामले में y मैं , की j'st सत्ता के calculate राशि एक्स मैं सभी के लिए 1 ≤ जे ≤ कश्मीर (मैं मान लिया एक्स मैं नंबर याद आ रही है और y मैं इनपुट संख्या है):
याद रखें कि आप गणना कर सकते हैं बस, क्योंकि एस 1 = एस - Σ y मैं , एस 2 = Σ मैं 2 - Σ y 2 मैं , ...
अब लापता संख्याओं को खोजने के लिए आपको सभी x i को खोजने के लिए हल करना चाहिए ।
आप गणना कर सकते हैं:
, पी 2 = Σ एक्स मैं ⋅ एक्स जे , ..., पी कश्मीर = Π x मैं ( 2 ) ।
इसके लिए याद रखें कि , पी 2 = एस 2 1 - एस 2 , ...
लेकिन के गुणांकों है पी = ( एक्स - एक्स 1 ) ⋅ ( एक्स - एक्स 2 ) ⋯ ( एक्स - एक्स कश्मीर ) लेकिन पी कारक हो सकता है , विशिष्ट इसलिए गुम संख्या पा सकते हैं।
ये मेरे विचार नहीं हैं; पढ़ा यह ।
From the comment above:
Before processing the stream, allocate bits, in which you write ( is the binary representation of and is pointwise exclusive-or). Naively, this takes time.
Upon processing the stream, whenever one reads a number , compute . Let be the single number from that is not included in the stream. After having read the whole stream, we have
Hence, we used space, and have an overall runtime of .
HdM's solution works. I coded it in C++ to test it. I can't limit the value
to bits, but I'm sure you can easily show how only that number of bits is actually set.
For those that want pseudo code, using a simple 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 bits). is commutative, and , 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.
#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;
}