ФорумПрограммированиеPHP для идиотов → алгоритм для всех возможных комбинаций

алгоритм для всех возможных комбинаций

  • vanderson

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 6:55 п.п.

    нужен алгоритм чтобы разделить массив на все возможные комбинации из 6 элементов … на алгоритм который я юзаю не хватает  памяти.. да и потом код надо подчищать от повторных значений… вот код:  

    <?
    ini_set('memory_limit', '1000M');
    $y=0;
    $group=array(49,21,32,31,45,22,34,23,43,20,24,25); //массив из 12ти элементов
    foreach($group as $k =>$v1){
    foreach($group as $k => $v2){
    foreach($group as $k => $v3){
    foreach($group as $k => $v4){
    foreach($group as $k => $v5){
    foreach($group as $k => $v6) {

    $combo[$y][0]=$v1;
    $combo[$y][1]=$v2;
    $combo[$y][2]=$v3;
    $combo[$y][3]=$v4;
    $combo[$y][4]=$v5;
    $combo[$y][5]=$v6;
    $y++;
    }
    }
    }
    }
    }
    } ?>
     подскажите лучший алгорим .. .. должен же быть.. спасибо заранее
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 6:57 п.п., спустя 1 минуту 15 секунд

    нужен алгоритм чтобы разделить массив

    По какому принципу разделить?
  • vanderson

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 6:59 п.п., спустя 2 минуты

    дописал.. все возможные комбинации из 6 элементов
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 7:01 п.п., спустя 2 минуты 3 секунды

    То есть нужно из одного массива (12 элементов) получить кучу массивов, которые будут всеми возможными комбинациями из любых 6 элементов первого массива? Я правильно понял?
  • vanderson

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 7:02 п.п., спустя 1 минуту 40 секунд

    да…
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 7:17 п.п., спустя 14 минут 36 секунд

    Не удивительно, что падает, 2985984 массива (если я правильно посчитал). Думаю, такие задачи нужно не на PHP решать.
  • vanderson

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 7:19 п.п., спустя 1 минуту 32 секунды

    чтож делать?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 26, 2008, 9:54 п.п., спустя 2 часа 35 минут 57 секунд

    <?
    ini_set('memory_limit', '1000M');
    $y=0;
    $group=array(49,21,32,31,45,22,34,23,43,20,24,25); //массив из 12ти элементов
    foreach($group as $k =>$v1){
    foreach($group as $k => $v2){
    foreach($group as $k => $v3){
    foreach($group as $k => $v4){
    foreach($group as $k => $v5){
    foreach($group as $k => $v6) {
    $combo[]=$v1."|".$v2."|".$v3."|".$v4."|".$v5."|".$v6;
    }
    }
    }
    }
    }
    } ?>


    этот вариант хорош если тебе не сильно важно что ты имеешь в конце :) массив или строку, но памяти должно сожрать меньше я думаю

    в минимальном случае это займет 4230144 байт, реально думаю метров 50-100, сразу говорю я хз как сохраняет массивы в память пхп.

    а вообще если объяснишь исходную задачу, то мб тебе можно будет помочь лучше :)
    Сапожник без сапог
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz Дек. 26, 2008, 10:06 п.п., спустя 11 минут 12 секунд

    реально думаю метров 50-100

    Реально думаю ты на нолик ошибся.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 26, 2008, 10:09 п.п., спустя 3 минуты 42 секунды


    реально думаю метров 50-100

    Реально думаю ты на нолик ошибся.
    повторюсь. я хз как пхп хранит строки. насколько будет разница между строками и массивами. думаю что разница колосальна
    Сапожник без сапог
  • vanderson

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz Дек. 27, 2008, 2:40 д.п., спустя 4 часа 30 минут 9 секунд

    да думаю сохранять в строке немного памяти сохранило но все равно больше 1000 метров.. так что наверно я остановлюсь с 10 элементами :) .. полюбе спасибо за помощь.. я где-то видел код на джаве который делает то что мне надо, но как его на пхп переписать это вопрос
    p.s. вот тут он кстати http://www.merriampark.com/comb.htm
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 27, 2008, 11:06 д.п., спустя 8 часов 26 минут 46 секунд

    <?
    ini_set('memory_limit', '1000M');
    $y=0;
    $g=array(49,21,32,31,45,22,34,23,43,20,24,25); //массив из 12ти элементов
    $count = sizeof($g);
    $combo = "&";
    for($i1=0;$i1<$count;$i1++)
    {
    for($i2=0;$i2<$count;$i2++)
    {
    for($i3=0;$i3<$count;$i3++)
    {
    for($i4=0;$i4<$count;$i4++)
    {
    for($i5=0;$i5<$count;$i5++)
    {
    for($i6=0;$i6<$count;$i6++)
    {
    $combo .= "&".$g[$i1]."|".$g[$i2]."|".$g[$i3]."|".$g[$i4]."|".$g[$i5]."|".$g[$i6];
    }
    }
    }
    }
    }
    }
    echo number_format(memory_get_usage());


    я непонимаю накой хер тебе вообще это надо! ))

    но смотри

    этот алгоритм у меня занял всего 50 метров :)
    твой же, даже со строкой занял 800 с чем то метров.

    эта реализация дает возможность доступа к его "эелементу", но хранит их в строке. доступ производится простым strpos + substr :)

    группы разбиты &. члены группы |.
    Сапожник без сапог
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 27, 2008, 12:15 п.п., спустя 1 час 8 минут 20 секунд

    vanderson, сосредоточься на ответе на этот вопрос:

    а вообще если объяснишь исходную задачу, то мб тебе можно будет помочь лучше :)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!