| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Быстрый перебор без повторений с ограничениями |
| Автор: tt0100 18.7.2012, 22:01 |
| Нужен быстрый алгоритм поиска всех возможных вариантов значений нескольких переменных без повторений. Есть m переменных. Каждая из которых может принимать некоторые значения из диапазона 1..n. Например: v1 {4,5,6,7} v2 {1,2,3,4,7} v3 {1,2,3,4,5,6,7} v4 {1} v5 {1,2,3,4,5,6,7} v6 {1,7} нужен алгоритм который переберет все варианты так что варианты одинаковы если отличаются только порядком переменных. стандартно если ограничений нет то можно через вложенные циклы for(i1=1;i1<=(7-(колво переменных-1));i1++){ for(i2=i1+1;i2<=(7-(колво переменных-1)+1);i2++){ и тд. но когда есть ограничения это не работает. а делать полный перебор это n^m это слишком много лишних операций. хотелось бы что-нибудь попроще если есть спс |
| Автор: Silent 19.7.2012, 13:33 | ||||||
| Мне сейчас лень расписывать, что и как делать, проще код написать: входной файл input.txt
первое число - количество множеств _count, далее в _count строках первое число - количество чисел в i-ом множестве и сами числа алгоритм
в итоге для данных множеств ответ
|
| Автор: tt0100 19.7.2012, 14:17 |
| ну вроде как очевидно что неправильно. т.к. из v4 и v6 следует что в результате всегда должно быть 1 и 7. но спасибо за оперативность. неожидал |
| Автор: Silent 20.7.2012, 12:34 | ||
не совсем понял, что вы имели ввиду... результат неправильный или отсечение мало? |
| Автор: tt0100 20.7.2012, 18:18 |
ну там первого и последнего результата не должно быть. я еще несовсем понял как количество операций здесь подсчитать. разберусь посчитаю. хотелосьбы чтобы оно было меньше чем цэ из n по m ну или немного больше. |
| Автор: tt0100 21.7.2012, 11:47 |
| Silent все вродебы понятно как решать. там у тебя в v нужно хранить именно матрицу 0/1 есть значение в ограничении или нет. ( sort(&v[0], &v[n], &cmp1) исключает выпадающие значения но у меня их не будет). и исходя из этой матрицы выбирать значение которое исключаем первым - то которое реже всего встречается из оставшихся. и проверять исключение значения приводит к исключению переменной или нет. по идее это значит что на каждом шагу надо производить поиск минимального элемента. не знаю на сколько это быстро. ну в смысле понятно что за линейное время но вопрос в накладных расходах на каждый шаг операции |
| Автор: Silent 23.7.2012, 09:37 | ||
а чем они плохи, почему их не должно быть? вполне себе обычные варианты Количество операций меньше C(n,m), поскольку алгоритм пытается собрать возрастающую последовательность v - это линейный список с элементами множеств, никаких "0/1 матриц значений ограничений" там нет. Попробуйте еще раз разобраться с кодом. |