Появилась тут задачка сделать кой-чего. После долгих размышлений пришлось признать, что я не знаю как это сделать. Задача Есть массив с N элементами. Нужно вывести всех возможных комбинаций. Решение Для начала нужно вычислить число возможных комбинаций: count ($Array)! Вычесть факториал числа элементов в массиве. А дальше-то как? Куда? Почему-то думается, что решение до убийства простое, но под конец пятничного дня я не могу ничего придумать. Плюс еще проблема в том, что после 17! числа переваливают за 2 млрд - предел для int =) Пример массива: PHP: <?php $Array = array ('1', '2', '3', 'A', 'a', 'B', 'b', 'C', 'c'); ?>
Пришел в голову только очень суровый вариант: PHP: <pre> <?php $Array = array ('1', '2', '3', 'A', 'a', 'B'); function fac($n){ if ($n == 1){ return $n; } else{ return $n * fac($n-1); } } $fac = fac(count($Array)); //Вычисляем факториал $varianty = array(); //Сюда будем записывать все возможные варианты //ну и понеслася перебором: while(count($varianty) != $fac) { shuffle($Array); if(!in_array($Array, $varianty)) $varianty[] = $Array; } print_r($varianty); ?>
Ууу, тогда сложнее все. Есть мысль, но через 5 минут ухожу пиво пить, приду раскрою мысль, если не забуду
// dAllonE хотел объяснить, что для этого нужно просто сделать рекурсивную функцию в который бы просто // перебирался массив, откидывался первый элемент и отправлялся бы снова на вход функции. Но начав писать пример // задумался и "честно" пообещал себе что потом разберется.
алгоритм простой, т.к. 2 сочетания тока... PHP: <?php $Array = array ('1', '2', '3', '4', 'A'); function GetAllVariants($mas) { $res = array(); $count = sizeof($mas); for ($i=0;$i<$count;$i++) { $j = $i-1; while (++$j<$count) { $res[] = $mas[$i] . $mas[$j]; } } return $res; } print_r(GetAllVariants($Array)); ?>
задача с перестановками http://algolist.manual.ru/maths/combinat/sequential.php http://rain.ifmo.ru/cat/view.php/theory ... ions1-2004
Кстати, ты мне дал массив array ('a', 'b', 'c', 'd'); и сказал, что там булет 4! комбинаций, но это не так. Их там должно быть 4^4 вроде бы.
Угу, просто задача поменялась =) array ('a', 'b', 'c', 'd'): a aa aaa aaaa b bb bbb bbbb c cc ccc cccc d dd ddd dddd ab aab aaab bb abb ...
Условие задачи описано слабо. Из него непонятно что все-таки точно нужно. Решая такие задачи действительно можно " вывести всех"
Код (Text): Array ( [0] => a ... [338] => dddc [339] => dddd ) Вариантов на самом деле 4^1 + 4^2 + 4^3 + 4^4
блудный сын Выебнуться я тоже могу =) А смысл? Умные люди поняли задачу, что недопоняли - я пояснил выше, чтобы избежать недомолвок. Не надо в теме моей оффтопить. Задача описана конкретно - вывести все возможные комбинации элементов массива
И сортировка не понадобилась: PHP: <?php $array = Array(); $array[1] = $main_array = array ('a', 'b', 'c', 'd'); $size = sizeof($array[1]); $arr_name = 1; for ($count = 2; $count <= $size; $count++) { $this_size = sizeof($array[$arr_name]); $arr_name++; for ($i = 0; $i < $this_size; $i++) { $gg = $array[($arr_name-1)][$i]; for ($x = 0; $x < $size; $x++) { $array[$arr_name][] = $gg . $array[1][$x]; } } $main_array = array_merge($main_array, $array[$arr_name]); if ($arr_name > 2) unset($array[($arr_name-1)]); } unset($array[$arr_name]); print_r($main_array); ?> Медлительный, правда. При 4х аргументах выдает 2.2 мс, а при 5 уже 50 мс. Пытался получить без доп. массивов, но не получилось. P.S. Код (Text): [239] => tits P.S.S. Если все-таки понадобится сортировка: PHP: <?php function mysort($a, $b) { if (strlen($a) > strlen($b)) return 1; else if (strlen($a) < strlen($b)) return -1; else return ($a > $b) ? 1 : -1; } usort($main_array, "mysort"); ?> P.S.F. Блин, 6 букв и скрипт работат около 10 секунд Код (Text): [36786] => сиськи
Сейчас особо времени нет, но когда будет, прочту и напишу скрипт. Но мне кажется, что доли секунды не будет работать. Это все-таки РНР.
Kreker, ну почему же? Факториал 6 компу посчитать не проблема 1*2*3*4*5*6, а вот перебрать эти варианты - это гораздо дольше...
Одно дело по формуле высчитать число вариантов и совсем другое вывести собственно все эти варианты ИМХО разница примерно такая же как считать сумму части геометрической прогрессии по фор-ле, или же высчитать все элементы и сложить их