Полный перебор векторов длины n

273
05 ноября 2017, 16:03

Необходимо организовать полный перебор векторов длины n. Для того, чтобы на выходе было:

000
001
010
011
100
101
110
111

И так для любой длины. Чтобы были упорядочены лексикографически не обязательно. Просто чтобы был полный перебор всех вариантов.

И собственно, необходимо построить решение таким образом, чтобы это работало не только для двоичных векторов, но и для n-ичных. То есть так, чтобы на одном месте могло находиться любое число из {0,1,2,3,...,n}. Есть идеи?

Answer 1

Спустя два дня я нашёл ответ и быть может Вам это когда-нибудь пригодится, держите:

Покажу на примере троичных векторов (т.е. 0,1,2). Вся идея алгоритма держится на том, что мы идём итератором с правого края числа и пока нам на встретилась двойка (максимальное возможное число) инкрементируем крайнее число не равное 2. Как только крайнее число стало 2, то мы запускаем цикл, проезжаем через череду двоек и как только находим не 2, то инкрементируем это число. Разумеется, когда мы каждый раз что-то инкрементируем, то всё, что было до этого числа обнуляется.

    boolean rided = false;    //становится true если проехали через двойки
    int j = sent.size()-1;    //начинаем с последней цифры
                              //sent это ArrrayList <Integer>, в нём хранится изначально нулевой вектор нужной нам длины
    while (j >= 0) {
        sent.set(j,sent.get(j)+1);     //увеличиваем крайнюю ячейку на один
        while (j >= 0 && sent.get(j) == 2) { //поехали через череду двоек искать не двойку
            sent.set(j, 0);                  //по пути всё зануляем
            j-=1;                            //с шагом в одну цифру  
            rided = true;                    //обозначим, что мы проехали
        }
        if (rided  && j >= 0) {
            sent.set(j, sent.get(j)+1);  //и вот это первое не двоечное значение инкрементируем
              j=sent.size()-1;           //отступаем к последней цифре и поехали по новой
              rided = false;             //сбрасываем rided в false
         }
        }
READ ALSO
H2 in memory , как инициализировать данные?

H2 in memory , как инициализировать данные?

Использую H2 in memory + hibernate , нужно при загрузке и выключении загружать и сохранять данные в sql скрипт, как это реализовать ?

172
java.lang.NullPointerException TableView

java.lang.NullPointerException TableView

Если убрать комментарии, то вылазит ошибка

236
Android. Иногда SoundPool не воспроизводит мелодию

Android. Иногда SoundPool не воспроизводит мелодию

Проблема заключается в том, что бывает, при первом за день запуске приложения, SoundPool не воспроизводит мелодиюActivity запускается, а мелодии нет

169