gpt4 book ai didi

c++ - C++中许多for循环的紧凑形式

转载 作者:行者123 更新时间:2023-12-04 01:08:02 26 4
gpt4 key购买 nike

我有一段代码如下,for 循环次数由编译时已知的n 决定。每个 for 循环迭代值 0 和 1。目前,我的代码看起来像这样

for(int in=0;in<2;in++){
for(int in_1=0;in_1<2;in_1++){
for(int in_2=0;in_2<2;in_2++){
// ... n times
for(int i2=0;i2<2;i2++){
for(int i1=0;i1<2;i1++){
d[in][in_1][in_2]...[i2][i1] =updown(in)+updown(in_1)+...+updown(i1);
}
}
// ...
}
}
}

现在我的问题是是否可以将它写成更紧凑的形式。

最佳答案

nin_k可以解释为小于2^n的一个整数的表示。

这允许轻松处理一维数组( vector )d[.]

在实践中,一个整数j对应于

j = in[0] + 2*in[1] + ... + 2^n-1*in[n-1]

此外,直接实现是 O(NlogN)。 (N = 2^n)

递归解决方案是可能的,例如使用

f(val, n) = updown(val%2) + f(val/2, n-1) and f(val, 0) = 0.

这将对应于 O(N) 复杂度,在引入内存的条件下,此处未实现。

结果:

0 : 0
1 : 1
2 : 1
3 : 2
4 : 1
5 : 2
6 : 2
7 : 3
8 : 1
9 : 2
10 : 2
11 : 3
12 : 2
13 : 3
14 : 3
15 : 4

#include <iostream>
#include <vector>

int up_down (int b) {
if (b) return 1;
return 0;
}

int f(int val, int n) {
if (n < 0) return 0;
return up_down (val%2) + f(val/2, n-1);
}

int main() {
const int n = 4;
int size = 1;
for (int i = 0; i < n; ++i) size *= 2;
std::vector<int> d(size, 0);

for (int i = 0; i < size; ++i) {
d[i] = f(i, n);
}
for (int i = 0; i < size; ++i) {
std::cout << i << " : " << d[i] << '\n';
}
return 0;
}

如上所述,在实现记忆化的条件下,递归方法允许复杂度为 O(N)。

另一种可能性是使用简单的迭代方法,以获得 O(N) 的复杂度。
(这里N代表数据总数)

#include <iostream>
#include <vector>

int up_down (int b) {
if (b) return 1;
return 0;
}
int main() {
const int n = 4;
int size = 1;
for (int i = 0; i < n; ++i) size *= 2;
std::vector<int> d(size, 0);

int size_block = 1;
for (int i = 0; i < n; ++i) {
for (int j = size_block-1; j >= 0; --j) {
d[2*j+1] = d[j] + up_down(1);
d[2*j] = d[j] + up_down(0);
}
size_block *= 2;
}
for (int i = 0; i < size; ++i) {
std::cout << i << " : " << d[i] << '\n';
}
return 0;
}

关于c++ - C++中许多for循环的紧凑形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65684630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com