2013-09-24 2 views
-2

Я хочу написать цикл, который сканирует все двоичные последовательности длины n с k 1 и n-k 0.сканирование двоичных последовательностей длины n с k 1 и n-k 0's

Фактически, на каждой итерации выполняется действие над последовательностью, и если выполняется критерий, цикл прерывается, в противном случае он переходит к следующей последовательности. (Я не ищу nchoosek или perms, так как для больших значений n требуется столько времени, чтобы дать результат).

Какой код MATLAB вы предлагаете?

+3

Не был ли этот же вопрос [вчера] (htt р: //stackoverflow.com/questions/18965045/all-binary-sequences-of-length-n-with-k-1s-and-n-k-0s)? Кажется, теперь его удаляют, я считаю, что там были хотя бы некоторые полезные комментарии. –

+0

так что все нули следуют за всеми (вице-наоборот)? –

+0

@BasSwinckels Все комментарии/ответы использовались 'C++', но мне нужен код/​​алгоритм MATLAB. –

ответ

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 

В приведенном выше примере, это будет перебирать все 0/1 последовательностей длины 4 с точно 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 
+0

Большое спасибо. Кажется красивым. Для случая, с которым я столкнулся, я должен пропустить случаи, когда число 1 не является желаемым k? Или есть лучшее решение? –

+0

вы можете добавить тест в цикл: 'if sum (seq) ~ = k, continue, end' – Amro

+0

Спасибо! Хороший ответ. –

Смежные вопросы