Все варианты логического массива.

 

Здравствуйте математики и программисты.

Вопрос конечно детский, но что-то не хочется голову ломать лишний раз. Тем более, наверняка уже есть проверенное, академическое решение...

Требуется перебрать циклом все варианты "переключателей" логического массива.

Скажем есть массив

bool Array[3];

вариантов включения\выключения его элементов 8, если не ошибаюсь.

вот они:

000

100

010

001

110

101

011

111

у массива Array[4] их уже 16, и т.д...

Так вот нужна функция нахождения всех вариантов массива произвольного размера.

Известна вам такая?

Спасибо.

 

Денис, чет не нашел исходника на С, давно это делал, попробую изложить идею.

Пусть задано N.

В цикле от к = 1 до к < N делаем маску m = (2**к - 1)

Во вложенном цикле j = 0 до (N-к) маску шифтуем влево на j битов и складываем в текущий элемент массива.

Т.е. сначала 1 прогоняем по всем позициям, затем 3 (11), затем 7(111) и т.д.

Точно не помню, по-моему 0 и последнее число из N битов отдельно заполнял.

Примерно так.

 
denis_orlov >>:

Здравствуйте математики и программисты.

Вопрос конечно детский, но что-то не хочется голову ломать лишний раз. Тем более, наверняка уже есть проверенное, академическое решение...

Требуется перебрать циклом все варианты "переключателей" логического массива.

Скажем есть массив

bool Array[3];

вариантов включения\выключения его элементов 8, если не ошибаюсь.

вот они:

000

100

010

001

110

101

011

111

у массива Array[4] их уже 16, и т.д...

Так вот нужна функция нахождения всех вариантов массива произвольного размера.

Известна вам такая?

Спасибо.

:) Мне всегда нравились абстракции - произвольног это какого? 10 в 100-ой?

 
Ничего сложного в этом нет, единственное подскажу кое-что, тогда Вы и сами поймёте как это легко сделать...

Во-первых у Вас не корректная немного таблица возможных значений, составлять её нужно так:

значений в столбце(кол-во строк) равно 2^n где n - это количество значений в комбинации, рамерность массива в Вашем случае

есть период, который немного завуалирован, при движении по столбцам период домножается на 2, изначально период равен 1

int period_=1,count;
   bool comb=false;
   bool array[5][32];
   string comm="";
   for(i=0;i<5;i++)
   {
      for(int j=0;j<MathPow(2,5);j++)
      {
         array[i][j] = comb;
         count++;
         if(count+1>period_){comb=!comb;count=0;}
      }
      period_*=2;
      comb=false;
      count=0;
   }
   for(j=0;j<MathPow(2,5);j++)
   {
      for(i=0;i<5;i++)
         comm=comm+array[i][j]+" ";
      Print(comm);
      comm="";
   }

не успел немного... но всёравно уже выложу...

вобщем на 3 столбцах получается так:

000

100

010

110

001

101

011

111

 
Интересно, а если N = 2000 ? :)
 
SProgrammer >>:
Интересно, а если N = 2000 ? :)

2^2000 Удачи ;)

 
TheXpert писал(а) >>

2^2000 Удачи ;)

да, здесь полезно вспомнить "одно маленькое исследование"... https://www.mql5.com/ru/forum/121742

 
Да тут и исследовать ничего не надо, так понятно ))) Дело даже не в MathPow.
 
TheXpert >>:

2^2000 Удачи ;)

1.14813*10^602

 
Urain >>:

1.14813*10^602


ну да совсем чуть-чуть за границы double вышли ))))
 
OneDepo писал(а) >>

Денис, чет не нашел исходника на С, давно это делал, попробую изложить идею.

Пусть задано N.

В цикле от к = 1 до к < N делаем маску m = (2**к - 1)

Во вложенном цикле j = 0 до (N-к) маску шифтуем влево на j битов и складываем в текущий элемент массива.

Т.е. сначала 1 прогоняем по всем позициям, затем 3 (11), затем 7(111) и т.д.

Точно не помню, по-моему 0 и последнее число из N битов отдельно заполнял.

Примерно так.

StatBars писал(а) >>
Ничего сложного в этом нет, единственное подскажу кое-что, тогда Вы и сами поймёте как это легко сделать...

Во-первых у Вас не корректная немного таблица возможных значений, составлять её нужно так:

значений в столбце(кол-во строк) равно 2^n где n - это количество значений в комбинации, рамерность массива в Вашем случае

есть период, который немного завуалирован, при движении по столбцам период домножается на 2, изначально период равен 1

не успел немного... но всёравно уже выложу...

вобщем на 3 столбцах получается так:

000

100

010

110

001

101

011

111

Спасибо! Идея с двоичными значениями понятна.

А вот если развить тему, это домножение периода на 2 годится, видимо, именно для бинаров.

А если речь пойдет о большем количестве значений в каждой ячейке, то понадобится более многомерные массивы или как?...

Причина обращения: