Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перебор массива
 
 автор: mabelrod   (19.02.2013 в 10:44)   письмо автору
 
 

Добрый день, друзья. Подскажите, у меня есть одномерный массив, как узнать все возможные комбинации элементов друг с другом ?

например массив такой:

$array = (1, 2, 3, 4, 5);

  Ответить  
 
 автор: Северьян   (20.02.2013 в 23:48)   письмо автору
 
   для: 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>";
      }     
   }   
?>

  Ответить  
 
 автор: Valick   (20.02.2013 в 23:59)   письмо автору
 
   для: Северьян   (20.02.2013 в 23:48)
 

Если правильно понял вопрос
Скорее всего нет

  Ответить  
 
 автор: Igorek   (21.02.2013 в 08:06)   письмо автору
 
   для: mabelrod   (19.02.2013 в 10:44)
 

Если речь про перестановки, то можно так:

<?php
function swap(&$arr$i$j) {
    
$c $arr[$i];
    
$arr[$i] = $arr[$j];
    
$arr[$j] = $c;
  }

$array = array(1234);
$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

  Ответить  
 
 автор: mabelrod   (22.02.2013 в 15:58)   письмо автору
 
   для: Igorek   (21.02.2013 в 08:06)
 

понравился последний пример, но он выдает не все комбинации, в идеале мне надо что бы из массива а,б,в было

а
б
в
аб
ав
бв
абв
авб
бав
ваб

  Ответить  
 
 автор: Lotanaen   (22.02.2013 в 16:25)   письмо автору
 
   для: mabelrod   (22.02.2013 в 15:58)
 

ну так вопрос задавайте так что бы его все поняли, по вашим входным данным,теоретически, из этих символов можно составить бесконечное множество сочетаний ;)

  Ответить  
 
 автор: Igorek   (22.02.2013 в 17: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 & (<< $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] => ваб
)

  Ответить  
 
 автор: mabelrod   (24.02.2013 в 18:22)   письмо автору
 
   для: Igorek   (22.02.2013 в 17:58)
 

Спасибо, пример очень классный, игрался с ним пару дней. Но такая вещь - генерит только варианты с размерностью массива до 7 элементов, вы не могли бы как то оптимизировать скрипт, может высвобождение переменных что бы он смог сгенерировать большее количество вариантов?

  Ответить  
 
 автор: Igorek   (26.02.2013 в 11:43)   письмо автору
 
   для: mabelrod   (24.02.2013 в 18:22)
 

Видимо для $result'a не хватает памяти... Для восьми элементов массива 128Мб памяти уже не хватило. Можно сразу на вывод или в файл писать

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования