| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Полный перебор |
| Автор: Веталька 30.1.2010, 17:28 |
| появилась потребность перебрать массив из 7 элементов (1,2,3,4,5,6,7), нужно получить все варианты, но в количестве 1 штука, то есть 1 2 3 4 5 6 7 12 13 14 15 16 17 21 22 23 24 25 26 27 31.....1234567.....7777777, и замечание элемент 12 = 21, 13=31....2 = 22, 2=222, элементы после запуска цикла будут один на второго накладываться, поэтому те которые повторяются можно вычеркнуть (разумеется один все таки нужно оставить) пробовал сделать цикл в цикле(и так семь штук), но столкнулся с проблемой, количество переборов равно 7^7, а это очень не выгодно, так как комбинаций без повтора всего 7^2 = 128, что можете посоветовать? |
| Автор: mes 30.1.2010, 17:51 | ||
может 2^7 ? очередность вывода имеет значение ? Добавлено через 6 минут и 38 секунд вообщем ловите и допиливайте напильником под свои нужды :
|
| Автор: Веталька 30.1.2010, 21:52 |
| mes, спасибо, то что искал |
| Автор: Веталька 30.1.2010, 23:06 |
| может ктото чтото попроще предложет, этот способ слишком заумный для меня |
| Автор: Dov 30.1.2010, 23:51 | ||
| Рекурсия подойдёт? Коряво, правда, написал. Но, вроде, работает. Если что, сам подправишь, где нужно..
|
| Автор: Веталька 31.1.2010, 00:19 |
| mes, Dov, спасибо за помощь, вопрос решен |
| Автор: artsb 31.1.2010, 00:24 | ||
А если "расшифровать" его?
|
| Автор: mes 31.1.2010, 11:28 |
| В общем происходит так - Просто перебираются все значения от нуля до 1<<arr_len (аналогично 2^arr_len, т.е 2^7 для нашего случая) потом из битового представления значения итерации строится число, заменяя единичные биты на соответствующий ему элемент массива.. для десятичного сдвига используются *10 и сдвиг происходит только при установленном бите, чтоб не было позиций с нулем в результативном числе. . например 11 итерация 7,6,5,4,3,2,1 // наш массив справа налево, т.е индекс 0 справа 0 0 0 1 0 1 1 // 11 в битовом представлении 0 0 0 3 0 2 1 // позиция в результативном числе (слева направа), итого ((1*10)+2*10)*4 = 124 // еще есть 0*10, но это издержка, которая ни на что не влияет. |
| Автор: zim22 31.1.2010, 11:43 |
std::next_permutation? |
| Автор: mes 31.1.2010, 11:57 | ||
не подходит, так как
|
| Автор: zim22 31.1.2010, 12:44 | ||
| Веталька, то, что ты хотел найти - называется сочетания без повторений. их количество вычисляется по формуле n! / (n - k)! * k! n - размер множества, k - размер выборки тогда подойдёт алгоритм http://photon.poly.edu/~hbr/boost/combinations.html#next_combin_desc, который является кандидатом на включение в буст
|
| Автор: artsb 31.1.2010, 15:42 |
Ага. Так действительно лучше, проще и без вызова функции. Я просто даже не жумал о том как можно оптимизировать, просто переписал в более "понятный" вид, так сказать. |
| Автор: Лешкин 31.1.2010, 21:47 |
| А если мне нужно сделать перебор только по три элемента с этого же множества? Добавлено через 2 минуты и 11 секунд З.Ы. С последующей передачей этих переборов в другую функцию... |
| Автор: Веталька 31.1.2010, 23:56 | ||
тебе любые 3 нужно??? или именно для 3х элементов? http://cplusplus.com/reference/algorithm/prev_permutation/ подойдет??? |
| Автор: Лешкин 1.2.2010, 23:08 | ||
Нет! Мне нужно сделать перебор (допустим) из семи элементов в одном случае по два элемента, в другом по три и т.п. и передавать результат перебора на каждой итерации в функцию... |
| Автор: zim22 2.2.2010, 12:17 |
| Лешкин, для начала сформулируй что именно тебе нужно. http://ru.wikipedia.org/wiki/Размещение или http://ru.wikipedia.org/wiki/Сочетание |