За последние 24 часа нас посетили 51855 программистов и 1454 робота. Сейчас ищут 1145 программистов ...

Как упростить множественные вложенные циклы?

Тема в разделе "PHP для новичков", создана пользователем блудный сын, 6 авг 2008.

  1. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    блудный сын, что-то подобное получалось и у меня. Но "предаваемая дальше строка" и "номер цикла" меня не устраивали... :) показалось, что это кастыли.
    Но если работает, - поздравляю :)
    Можешь замерить что работает быстрее
     
  2. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    [vs], считаю глупо гонять по рекурсиям избыточные данные. :)
    Произведите замер и пусть победит сильнейший :):) я просто кино смотрю :)
     
  3. Anonymous

    Anonymous Guest

    А тут ты нормально по рекурсии и не пройдешь.
     
  4. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    На самом деле мой код не работает :) :( Чего-то ему не хватает. Никак не догадаюсь чего. Вроде бы вот оно, но не то :(
     
  5. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Рекурсией не решить эту задачу? Даже если добавить условие if...else? :(
     
  6. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Покажи?
     
  7. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    блудный сын, думаю можно. Ведь как еще кроме как рекурсией решить такую задачу. А может и нет...
     
  8. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Какая то неопределенность получается
     
  9. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    блудный сын, можно. уверен что можно.. лень только париться :)
    Думаю можно закрывать базар до момента, пока кто-нить не предоставит новое решение.
     
  10. Anonymous

    Anonymous Guest

    Рекурсией решить. Но это будет либо не «чистая» рекурсия, либо ты будешь потом дубликаты вычищать из результатов.
     
  11. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Я часа два мудрил - не получилось :(
     
  12. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Я согласен на нечистую рекурсию.
     
  13. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ы!
    Если не поджимают системные ресурсы (а врядли они так поджимает, что жалко выполнить несколько (десятков, сотен,...) лишних циклов, можно использовать рэндомную генерацию )))
    PHP:
    1. <?php
    2. function getall($data,$diff=100)
    3. {
    4.     $data_len=strlen($data);
    5.     $result=array();
    6.     for ($i;$i<$data_len;$i++)
    7.     {
    8.         $data_array[]=$data[$i];
    9.     }
    10.     while ($test<$diff)
    11.     {
    12.         shuffle($data_array);
    13.         $rnd=implode($data_array);
    14.         if(!in_array($rnd,$result))
    15.         {  
    16.             $result[]=$rnd;
    17.             $test=0;   
    18.         }
    19.         else
    20.         {
    21.             $test++;
    22.         }
    23.     }
    24.     return $result;
    25. }
    26. print_r(getall("100"));
    27. ?>
    +С большой долей вероятности получаем все значения
    +Получаем только уникальные варианты
    -Есть (пусть и крайне малая) вероятность поулчить не все значения
    -Лишняя трата ресурсов

    Чем больше $diff, те меньше вероятность получить не все возможные комбинации :)
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    UPD. Работет почти в 2 раза медленнее чем вариант от ShamahN.
     
  16. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    vs, извини, но этот вариант никак мне не подходит. Мне обязательно нужно, чтобы выводились все слова и не беспорядочным образом, а по порядку, как в варианте ShamahNa
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну из 10.000 циклов - всегда были все варианты :) Вероятность ошибки очень низкая.
    Перед ретуроном - sort($result);

    UPD. Если вводить длинное слово, то $diff=100 явно не достаточно. Надо как минимум - 1000 =)
     
  18. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ошибки недопустимы.
    А циклов у меня будет максимум до 20. Значений (слов) может быть и больше миллиона.
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я имел ввиду что 10.000 раз под ряд скрипт дал все варианты для слова "123" =)
    Для миллиона ставь $diff=1000000 только черт знает сколько времени выполняться он будет :lol:
     
  20. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Отож :( А вложенные циклы за считанные секунды их генерируют.
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    блудный сын
    А если генерировать вложеные циклы? ТЕКСТОМ? А потом выполнять в eval??
     
  22. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Мне уже тоже нечто похожее в голову приходило... Я правда думал положить цикл в файл и вызывать его нужное количество раз... Но тссс! :) Если кто узнает - засмеют! :)
     
  23. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Мой вариант выдает всевозможные уникальные варианты и без возможности потерять необходимый :)
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Неа, сравни у себя и у меня результаты для слова 1000 или аааб =)
     
  25. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    [vs], ааа.. ты про это :) ну эт само собой. каждый символ я рассматриваю как уникальный, что написать ты сам выбираешь. Проверить строчку на повторяющиеся символы думаю ни для кого не проблема :)