I was wondering if there is any O(n^2) complexity algorithm for generating all sub-sequences of an array. I know an algorithm but it takes O((2^n)*n) time.
int main() {
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; ++i)
cin >> a[i];
int64_t opsize = pow(2,n);
for (int counter = 1; counter < opsize; counter++) {
for (int j = 0; j < n; j++) {
if (counter & (1 << j))
cout << a[j] << " ";
}
cout << endl;
}
}
No
There cannot be any algorithm of less than O(2^n)
complexity simply because there are O(2^n)
sub-sequences. You need to print each of them hence the time complexity has to be greater than or equal to O(2^n)
.
You can't improve algorithm complexity, but you can improve how stream is used.
As other answer points out o(n * 2^n)
is best you can have.
When you use std::endl
you are flushing buffers of streams. To achieve best performance buffers should flush them selves when they are full.
Since each subsequence have to be quite short (at maximum 64 elements), it means that you are flushing stream quite often and have serious performance hit.
So replacing std::endl
with '\n'
will provide significant performance improvement.
Other tricks which can help improve stream performance:
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
cin >> n;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With