如何用 0 和 1 的所有可能组合填充数组?

2024-01-06

我有一个算法,0和1的可能组合数量可以达到2^39。假设我有 n=2 种情况,或者 n1=2^2=4 0 和 1 的组合:00,01,10,11。从中我可以创建一个数组 a=zeros(n,n1) 并填充列可能的组合?这意味着第一列有 00,第二列 01,第三列 10,最后 11。我希望这是动态的,这意味着 n 可以是 1,2,3...,39,显示数组将是 a=zeros(n, 2^n)。感谢您的回复!


只是为了一般性理解:为什么你认为你需要一个由 0 到 2³⁹ 的所有整数的所有组合组成的数组?该阵列将消耗 39×2³⁹/1000⁴ ≈ 21TB 的 RAM...上次我检查时,只有世界上最先进的超级计算机才有这样的资源,并且大多数使用这些机器的人认为生成这样的阵列非常浪费...

无论如何,为了完整性,对于任何N,这是最简单的解决方案:

P = dec2bin(0:(2^N)-1)-'0'

但是,有一点建议:dec2bin输出字符数组。如果你想数值数组,你可以减去这个字符'0',但是,这给了你一个数组doubles根据MATLAB的规则:

>> P = dec2bin(0:(2^3)-1)-'0';
>> whos P
  Name      Size            Bytes  Class     Attributes

  P         8x3               192  double                      

如果您想最大限度地减少内存消耗,请生成一个逻辑数组:

>> P = dec2bin(0:(2^3)-1)=='1';
>> whos P
  Name      Size            Bytes  Class      Attributes

  P         8x3                24  logical     

如果你还想加快执行速度,可以直接使用标准算法:

%// if you like cryptic one-liners
B1 = rem(floor((0:pow2(N)-1).' * pow2(1-N:0)), 2) == 1;

%// If you like readability
B = false(N,pow2(N));
V = 0:pow2(N)-1;
for ii = 1:N
    B(ii,:) = rem(V,2)==1;
    V = (V-B(ii,:))/2;
end

最后一个(循环)是所有解决方案中最快的N(至少在 R2010b 和 R2013a 上),并且它具有最小的峰值内存(仅为神秘单行的 1/N)。

所以我会选择那个:) 但是,那只是我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 0 和 1 的所有可能组合填充数组? 的相关文章

随机推荐