如何在 O(n) 中将二进制和转换为二进制

How to convert binary sum to binary in O(n)

本文关键字:二进制 转换      更新时间:2023-10-16

我正在尝试找到将 img 二进制文件转换为二进制文件的最佳解决方案。我使用 2 的幂将大量数字保存在数组中并保持总和。例如,我将数字 $2^{3} + 4x2^{2} + 5x2^{1}$ = 29 保留在 4 的数组中,如 {0,5,4,1},其中数组的每个位置都有每个 2 的幂出现的时间。 程序完成后,我想将这个数组转换为一个数组,该数组产生相同的总和,但数组中只有一个或零。用她的话来说,我想将这个总和转换为二进制。所以我的例子会给出数组 {1,0,1,1,1} = 29

我如何在 O(n( 中的 c++ 中进行此转换

我当前的解决方案是 O($n^{2}$(,如下所示:

bool bl = true;
while (bl) {
for (int i = 0; i < M; i++) {
if (num[i] != 0 && num[i] != 1) {
vector<long int> p = block(num[i]);
num[i] = 0;
for (auto j = 0; j < p.size(); ++j) {
if (p[j]!=0)
num[j + i] += 1;
}
}
}

bl = false;
for (int i = 0; i < M; i++) {
if (num[i] == 0 || num[i] == 1) {
bl = false;
continue;
}
else {
bl = true;
break;
}
}
}
for (int i = 0; i <= M; i++)
{
cout << i << ':' << num[i] << 'n';
}

你知道(2k+j)*2^N === j*2^N + k*2^(N+1),所以你可以向前"滚动"值>= 2:

for (int i = 0; i < num.size(); i++) {
if (num[i] < 2)
continue;
if (i+1 == num.size()) {
if (num.size() == num.capacity())
num.reserve(num.size() + 5);
num.push_back(0);
}
num[i+1] += num[i] / 2;
num[i] %= 2;
}

请注意,这会在溢出时每转一圈将存储增加 5 个元素。如果您期望巨大的数字,则可能需要调整此值以减少矢量复制的数量。