扫描长度为n的二进制序列,其中k 1和n-k为0

时间:2013-09-24 06:11:19

标签: algorithm matlab combinations permutation bits

我想编写一个循环,用k 1和n-k 0扫描长度为n的所有二进制序列。

实际上,在每次迭代中,对序列执行一个动作,如果满足一个标准,则循环将中断,否则它将进入下一个序列。 (我不是在寻找nchoosekperms,因为对于大的n值,需要花费很多时间来提供输出。

您建议使用哪种MATLAB代码?

1 个答案:

答案 0 :(得分:2)

您可以实施类似iterator / generator模式的内容:

classdef Iterator < handle
    properties (SetAccess = private)
        n              % sequence length
        counter        % keeps track of current iteration
    end

    methods
        function obj = Iterator(n)
            % constructor
            obj.n = n;
            obj.counter = 0;
        end

        function seq = next(obj)
            % get next bit sequence
            if (obj.counter > 2^(obj.n) - 1)
                error('Iterator:StopIteration', 'Stop iteration')
            end
            seq = dec2bin(obj.counter, obj.n) - '0';
            obj.counter = obj.counter + 1;
        end

        function tf = hasNext(obj)
            % check if sequence still not ended
            tf = (obj.counter <= 2^(obj.n) - 1);
        end

        function reset(obj)
            % reset the iterator
            obj.counter = 0;
        end
    end
end

现在您可以将其用作:

k = 2;
iter = Iterator(4);
while iter.hasNext()
    seq = iter.next();
    if sum(seq)~=k, continue, end
    disp(seq)
end

在上面的例子中,这将遍历所有长度为4的0/1序列,其中k = 2个:

 0     0     1     1
 0     1     0     1
 0     1     1     0
 1     0     0     1
 1     0     1     0
 1     1     0     0