我在MATLAB中使用以下函数以log(2 ^ n)步长升序计算长度为n的所有二进制向量。(长度为n的所有二进制数)。
A = compV([0;1],n);
function [O] = compV(O,n)
j = length(O);
if n > 1
O1 = [zeros(j,1) O];
O2 = [ones(j,1) O];
O = [O1;O2];
O = compV(O,n-1);
end
end
我想找一个算法来计算递归相同的向量,但按重量排序。所有这些都是相对较低的复杂性。
例如:000 001 010 011 100 101 110 111 - > 000 001 010 100 011 101 110 111
我已经没有想法,我不确定是否可以这样做。
谢谢!
答案 0 :(得分:0)
我对这个问题的解释是:你想要来自0:2^n-1
的数字的二进制表示。你试图递归地做,因为有些人喜欢递归。我知道我的解决方案不是递归的,但考虑到问题的指数性,这似乎是一个坏主意。
试试dec2bin(0:2^n-1)-'0'
。 dec2bin
将数字转换为二进制字符串表示形式。减去'0'
将二进制字符串转换为双数组(代码生成的格式)。
注意:我不确定log(2^n)
步骤的含义。不知道你的意思是按重量排序 - 通过增加价值?
修改强>
已经澄清的是,您希望整数按汉明重量的最低到最高排序。 This answer解释了如何找到具有给定汉明重量的下一个数字。你可以通过汉明重量i=0:n
来计算给定重量的所有数字。从给定权重的最小数字开始:n-i
0s后跟i
1s。使用链接算法,您可以找到具有相同汉明权重的下一个数字,直到所需的位数大于n
。