На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
  
> Вариант генерации подмножеств , [Pascal] для "Комбинаторики"
    Автор: mikv

    Вариант генерации подмножеств

    Используем двоичное представление. Для перебора всех подмножеств нам необходимо перебрать все числа от 0 до 2n-1.
    Как переходить от текущего двоичного числа к следующему? Можно каждый раз осуществлять перевод из 10-ной системы в 2-чную.
    Но там используются крайне медленные операции деления. А почему бы не просто складывать "в лоб" двоичные числа? То есть точно также, как мы делаем на бумажке, складывая обычные числа.
    Складываются так:
    ExpandedWrap disabled
      1+1=0. То есть 0 пишем в текущий разряд, а единичка переносится в следующий.
      1+0=1
      0+1=1
      0+0=0

    Если внимательно взглянуть на эту табличку - можно понять, что на самом деле перед нами таблица значений функции XOR.
    поэтому мой вариант генерации множеств:
    ExpandedWrap disabled
      procedure NextSubset;
      var
       
          i : Integer;
      begin      
          i := n + 1;
          repeat
              dec(i);
              B[i] := B[i] xor 1;
          until B[i]=1;
      end;


    n - количество элементов в исходном множестве.

    Однако, здесь следует четко отслеживать, чтобы для варианта, когда массив B содержит n единиц не была вызвана еще раз процедура NextSubset.

    предлагаю использовать примерно так:
    ExpandedWrap disabled
      maxk := 1 shl n;
      FillChar (B,SizeOf(B),0);
      for k := 1 to maxk do
      begin
          NextSubset;
          {Некоторые действия}
      end;
    Сообщение отредактировано: Jin X -
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0175 ]   [ 16 queries used ]   [ Generated: 25.04.24, 11:24 GMT ]