Advertisement
dmkozyrev

all_subsets

Mar 29th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.52 KB | None | 0 0
  1. function all_subsets(A)
  2. % Функция выводит все подмножества B множества A, кроме пустого
  3. % Здесь используется написанная нами функция all_k_subsets(k, A);
  4.     for i=0:length(A)
  5.         all_k_subsets(i, A);
  6.     end
  7. end
  8.  
  9. % На всякий случай , функция all_k_subsets(k, A) была скопирована ниже
  10.  
  11.  
  12. function all_k_subsets(k, A)
  13. % Функция выводит все подмножества B множества A длины k
  14.  
  15.     n = length(A); % мощность множества A  
  16.     x = first(n, k); % Первая последовательность нулей и единиц.
  17. % x(i) == 0 , если элемент A(i) не входит в данное подмножество B
  18. % x(i) == 1 , если элемент A(i) входит в данное подмножество B
  19.    
  20.     B = get_subset(A, k, x); % Первое подмножество из k элементов
  21.     disp(B);
  22.    
  23.     while ~last(x, n) % Пока не достигнуто последнее подмножество
  24.         x = next(x, n); % Получаем следующую последовательность 0 и 1
  25.         B = get_subset(A, k, x); % Получаем подмножество A
  26.         disp(B);
  27.     end
  28.  
  29. end
  30.  
  31. function B = get_subset(A, k, x)
  32. % Функция выбирает отдельные элементы из множества A в зависимости от их
  33. % включения в подмножество B. Включение задается массивом x.
  34. % k - мощность подмножества B
  35.  
  36.     B = zeros(1, k); % Изначально, B - пустое подмножество
  37.     len_B = 0; % Текущее количество элементов в подмножестве B
  38.    
  39.     for i=1:length(x)
  40.         if ( x(i) == 1 ) % Если элемент включен
  41.             len_B = len_B + 1; % Увеличиваем текущее количество элементов в подмножестве B
  42.             B(len_B) = A(i); % Записываем очередной элемент в подмножество B
  43.         end
  44.     end
  45. end
  46.  
  47.  
  48. function m = first(n, k)
  49. % Функция получает первое подмножество: сначала идут нули, а затем k единиц
  50.     m = ones(1, n);
  51.     for i=1:n-k
  52.         m(i) = 0;
  53.     end
  54. end
  55.  
  56. function result = last(m, n)
  57. % Функция определяет, является ли текущая последовательность последней
  58.  
  59. % Ищем такой ноль, справа от которого находится единица.
  60. % Если он найден, то последовательность не последняя.
  61.     result = true;
  62.     for i=1:n-1
  63.         if ( m(i) == 0 ) && ( m(i+1) == 1 )
  64.             result = false;
  65.             break;
  66.         end
  67.     end
  68. end
  69.  
  70. function m = next(m, n)
  71. % Функция получает следующую последовательность из текущей
  72.  
  73. % Нам нужно оставить неизменным суммарное количество единиц и нулей в последовательности
  74.  
  75. % Ищем ближайший с правого конца ноль, справа от которого находится единица
  76.     for t=n-1:(-1):1
  77.         if ( m(t) == 0 ) && ( m(t+1) == 1 )
  78.             break;
  79.         end
  80.     end            
  81. % m(t) - элемент, который мы должны изменить с 0 на 1
  82.  
  83. % Посчитаем число нулей справа от m(t) включая m(t)
  84.     num_zeros = 0;
  85.     for i = t:n
  86.         if ( m(i) == 0 )
  87.             num_zeros = num_zeros + 1;
  88.         end
  89.     end
  90.  
  91. % Меняем выбранный нами ранее разряд t с нуля на единицу
  92.     m(t) = 1;
  93.    
  94. % Затем справа от m(t) ставим нужное число нулей:
  95. % Сначала ставим все нули, пока не потратим весь запас
  96. % Затем ставим только единицы
  97.    
  98.     for i=t+1:n
  99.         if ( num_zeros > 0 ) % Если есть еще запас нулей
  100.             m(i) = 0; % Ставим ноль
  101.             num_zeros = num_zeros - 1; % Уменьшаем запас нулей
  102.         else % Иначе ставим единицу
  103.             m(i) = 1;
  104.         end
  105.     end
  106. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement