|
|
|
| Добрый день, друзья. Подскажите, у меня есть одномерный массив, как узнать все возможные комбинации элементов друг с другом ?
например массив такой:
$array = (1, 2, 3, 4, 5); | |
|
|
|
|
|
|
|
для: mabelrod
(19.02.2013 в 10:44)
| | Если правильно понял вопрос, то могу предложить как-то так:
1 вариант: комбинации всех со всеми
<?php
$arr = array(1,2,3,4,5);
$count = count($arr) - 1;
for($i = 0; $i <= $count; $i++) {
for ($j = 0; $j <= $count; $j++)
echo $arr[$i]," - ",$arr[$j],"<br>";
}
?>
|
2 вариант: комбинации только с "чужими"
<?php
$arr = array(1,2,3,4,5);
$count = count($arr) - 1;
for($i = 0; $i <= $count; $i++) {
for ($j = 0; $j <= $count; $j++) {
if($arr[$i] != $arr[$j])
echo $arr[$i]," - ",$arr[$j],"<br>";
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Северьян
(20.02.2013 в 23:48)
| | Если правильно понял вопрос
Скорее всего нет | |
|
|
|
|
|
|
|
для: mabelrod
(19.02.2013 в 10:44)
| | Если речь про перестановки, то можно так:
<?php
function swap(&$arr, $i, $j) {
$c = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $c;
}
$array = array(1, 2, 3, 4);
$arrCount = count($array);
function generate($k) {
global $arrCount, $array;
if ($k == $arrCount - 1) {
foreach ($array as $value) {
print $value.' ';
}
print "<br>";
} else {
for ($j = $k + 1; $j < $arrCount; $j++) {
swap($array, $k + 1, $j);
generate($k + 1);
swap($array, $k + 1, $j);
}
}
}
generate(-1);
|
алгоритм: http://algolist.manual.ru/maths/combinat/permutations.php | |
|
|
|
|
|
|
|
для: Igorek
(21.02.2013 в 08:06)
| | понравился последний пример, но он выдает не все комбинации, в идеале мне надо что бы из массива а,б,в было
а
б
в
аб
ав
бв
абв
авб
бав
ваб | |
|
|
|
|
|
|
|
для: mabelrod
(22.02.2013 в 15:58)
| | ну так вопрос задавайте так что бы его все поняли, по вашим входным данным,теоретически, из этих символов можно составить бесконечное множество сочетаний ;) | |
|
|
|
|
|
|
|
для: mabelrod
(22.02.2013 в 15:58)
| | вас не поймешь - говорите, что нужны все комбинации, а в примере приводите не все...
в общем немного подшаманив (пользуясь алгоритмом генерации подмножеств множества http://wincode.org/acm-icpc/subsets-generation )
<?php
function swap(&$arr, $i, $j) {
$c = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $c;
}
function generate($k) {
global $arr_count, $array, $result;
if ($k == $arr_count - 1) {
$result[] = implode('',$array);
} else {
for ($j = $k + 1; $j < $arr_count; $j++) {
swap($array, $k + 1, $j);
generate($k + 1);
swap($array, $k + 1, $j);
}
}
}
$input_array = array('а', 'б', 'в'); // исходное множество
$result = array();
$input_array_count = count($input_array); // кол-во элементов множества
$n = pow(2, $input_array_count); // кол-во подмножеств
for ( $i = 1; $i < $n; $i++ ) // перебор битовых маск
{
$array = array();
// формируем подмножество
for ( $j = 0; $j < $input_array_count; $j++ ) { // перебор битов в маске
if ( $i & (1 << $j) ) {// если j-й бит установлен
$array[] = $input_array[$j];
}
}
$arr_count = count($array);
generate(-1);
}
print "<pre>";
print_r($result);
print "</pre>";
|
результат:
Array
(
[0] => а
[1] => б
[2] => аб
[3] => ба
[4] => в
[5] => ав
[6] => ва
[7] => бв
[8] => вб
[9] => абв
[10] => авб
[11] => бав
[12] => бва
[13] => вба
[14] => ваб
)
|
| |
|
|
|
|
|
|
|
для: Igorek
(22.02.2013 в 17:58)
| | Спасибо, пример очень классный, игрался с ним пару дней. Но такая вещь - генерит только варианты с размерностью массива до 7 элементов, вы не могли бы как то оптимизировать скрипт, может высвобождение переменных что бы он смог сгенерировать большее количество вариантов? | |
|
|
|
|
|
|
|
для: mabelrod
(24.02.2013 в 18:22)
| | Видимо для $result'a не хватает памяти... Для восьми элементов массива 128Мб памяти уже не хватило. Можно сразу на вывод или в файл писать | |
|
|
|