长度为n的所有二进制向量的低复杂度计算,按权重排序

时间:2015-11-16 20:00:07

标签: algorithm matlab sorting vector

我在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

我已经没有想法,我不确定是否可以这样做。

谢谢!

1 个答案:

答案 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