Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите с перестановкой букв

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
_Virus_
Отправлено: 19 Декабря, 2012 - 22:08:29
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Сделал скрипт, который из набора букв выводит все возможные варианты их перестановки.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $nabor = "0123456";
  4. for($i=0;$i<strlen($nabor);$i++) $stroka[$i] = $nabor[$i];
  5. $num = count($stroka); $end = false; $invalid = 0; $arrglobal = array();
  6. $start = microtime(1);
  7. for($i=0;$i<$num;$i++) $ex[$i] = 0;
  8. while(1){
  9.         $ex[0]++;
  10.         for($n=0;$n<$num;$n++){
  11.                 if($ex[$n] == $num){
  12.                         if(($n+1) == $num) $end = true;
  13.                         else $ex[$n] = 0; $ex[$n+1]++;
  14.                 }
  15.         }
  16.         if($end) break;
  17.         elseif(count(array_unique($ex)) == $num) array_push($arrglobal, strtr(implode("", $ex), $stroka));
  18.         else $invalid++;
  19. }
  20. $stop = microtime(1);
  21. echo "Кол-во символов: <b>".$num."</b><br>\n";
  22. echo "Вариантов: <b>".count($arrglobal)."</b><br>\n";
  23. echo "Отсеил: <b>".$invalid."</b><br>\n";
  24. echo "Время генерации: <b>".round($stop - $start, 2)."</b> сек<br>\n";
  25. echo implode(" ", $arrglobal);
  26. ?>
  27.  

Результат:
Цитата:

Кол-во символов: 7
Вариантов: 5040
Отсеил: 818502
Время генерации: 17.68 сек

Как сделать так, чтобы число отсеивания прировнялось к 0 и время генерации сократилось?

(Отредактировано автором: 19 Декабря, 2012 - 22:10:36)

 
 Top
vlados
Отправлено: 19 Декабря, 2012 - 22:56:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 391
Дата рег-ции: Май 2011  


Помог: 1 раз(а)

[+][+][+]


Как вариант, не генерировать все значения и не считать их Улыбка А сделать по-нормальному, по математически, при помощи формулы.

(Отредактировано автором: 19 Декабря, 2012 - 22:56:48)

 
 Top
Toxa
Отправлено: 19 Декабря, 2012 - 23:01:14
Post Id



Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008  


Помог: 8 раз(а)

[+]


ох, чувак, почти полтора часа убил я на твою задачу. С тебя пиво, не иначе
PHP:
скопировать код в буфер обмена
  1. function convert_to_base($alphabet, $number)
  2.         {
  3.                 $base = strlen($alphabet);
  4.                 $balances = array();
  5.                 do
  6.                 {
  7.                         $balances[] = $number % $base;
  8.                         $number = floor($number/$base);
  9.                 }
  10.                 while($number > $base);
  11.                 $balances[] = $number % $base;
  12.                 $balances = array_reverse($balances);
  13.                 $result = '';
  14.                 foreach($balances as $key)
  15.                         $result .= $alphabet[$key];
  16.                
  17.                 return $result;
  18.         }
  19.        
  20.         $str = 'ABCD';
  21.        
  22.         for($i=0;$i<1000;$i++)
  23.                 echo convert_to_base($str, $i).'<br/>';

"Результат работы скрипта" (Отобразить)


-----
Удобный сервис для хранения файлов
 
 Top
Okula
Отправлено: 19 Декабря, 2012 - 23:12:31
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




_Virus_, всевозможное количество вариантов - это факториал данного числа.
Факториал расчитывается так:
PHP:
скопировать код в буфер обмена
  1. function fac($int) {
  2.     for($f=1,$i=1; $i<=$int; $i++) $f *= $i;
  3.     return $f;
  4. }

Теперь считаем кол-во всевозможных вариантов:
PHP:
скопировать код в буфер обмена
  1. $str = '0123456';
  2. $f = fac(mb_strlen($str, 'utf-8'));

Время затраченное на расчёт ничтожно мало. Если тебе нужно только расчитать значение - это лучший вариант.

(Отредактировано автором: 19 Декабря, 2012 - 23:15:52)

 
 Top
Ваныч
Отправлено: 19 Декабря, 2012 - 23:16:23
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 1 раз(а)




пример из 4-х символов:
QWER
QWRE
QEWR
QERW
QRWE
QREW
WQER
WQRE
WEQR
WERQ
WRQE
WREQ
EQWR
EQRW
EWQR
EWRQ
ERQW
ERWQ
RQWE
RQEW
RWQE
RWEQ
REQW
REWQ
Как перемешать индексы в этих символах без повторений и без затрат на "опускание левых" результатов?
 
 Top
Okula
Отправлено: 20 Декабря, 2012 - 00:17:04
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Ваныч, вот написал функцию
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Генерация всех возможных перестановок
  3.  *
  4.  * @param array $newarr заполняемый массив
  5.  * @param string $string исходная строка
  6.  * @param string $prefix перфикс
  7.  */
  8. function variant(array &$newarr, $string, $prefix='') {
  9.     if(empty($string)) {
  10.         $newarr[] = $prefix;
  11.         return;
  12.     }
  13.    
  14.     $len = mb_strlen($string, 'utf-8');
  15.     for($i=0; $i<$len; $i++) {
  16.         $string_array = str_split($string);
  17.         if(isset($string_array[$i])) unset($string_array[$i]);        
  18.         variant($newarr, implode('', $string_array), $prefix.$string{$i});
  19.     }
  20. }
  21.  
  22. #-------------------------#
  23.  
  24. $string = 'abcdef';
  25. $arr = array();
  26.  
  27. variant($arr, $string);
  28. var_dump($arr);

Из 6-ти уникальных символов генерирует все возможные варианты.
Время генерации 0.013сек.

Результат работы скрипта:
Спойлер (Отобразить)
 
 Top
_Virus_
Отправлено: 20 Декабря, 2012 - 02:15:49
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Okula Toxa Спасибо парни, без вас бы я наверное и не сделал Улыбка Выручили!
 
 Top
_Virus_
Отправлено: 10 Января, 2013 - 16:33:50
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Блин надо какнить через цикл сделать.
Тут при 8 символах count(array_unique($arr)) выдает 20160, а должно быть 40320. Ровно в 2 раза меньше положенного.
 
 Top
EuGen Администратор
Отправлено: 10 Января, 2013 - 17:50:19
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. function permutation($sData)
  2. {
  3.         if(strlen($sData)==1)
  4.         {
  5.                 return array($sData);
  6.         }
  7.         $rgResult       = array();
  8.         array_walk(permutation(substr($sData,1)), function($sCombination) use (&$rgResult, $sData)
  9.         {
  10.                 for($i=0;$i<strlen($sData);$i++)
  11.                 {
  12.                         $rgResult[]=substr($sCombination, 0, $i).$sData[0].substr($sCombination, $i, strlen($sData)-$i-1);
  13.                 }
  14.         });
  15.         return $rgResult;
  16. }
  17. //var_dump(count(permutation('12345678')), count(array_unique(permutation('12345678'))));

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
_Virus_
Отправлено: 10 Января, 2013 - 18:48:41
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




EuGen пишет:
PHP:
скопировать код в буфер обмена
  1. function permutation($sData)
  2. {
  3.         if(strlen($sData)==1)
  4.         {
  5.                 return array($sData);
  6.         }
  7.         $rgResult       = array();
  8.         array_walk(permutation(substr($sData,1)), function($sCombination) use (&$rgResult, $sData)
  9.         {
  10.                 for($i=0;$i<strlen($sData);$i++)
  11.                 {
  12.                         $rgResult[]=substr($sCombination, 0, $i).$sData[0].substr($sCombination, $i, strlen($sData)-$i-1);
  13.                 }
  14.         });
  15.         return $rgResult;
  16. }
  17. //var_dump(count(permutation('12345678')), count(array_unique(permutation('12345678'))));

?


Parse error: syntax error, unexpected T_FUNCTION in file.php on line 9
тут 8 строка
 
 Top
esterio
Отправлено: 10 Января, 2013 - 18:57:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




У вас какая версия ПХП, наверно у Вас нету замиканий
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Января, 2013 - 18:58:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




esterio пишет:
У вас какая версия ПХП

< 5.3

(Отредактировано автором: 10 Января, 2013 - 18:59:11)

 
 Top
esterio
Отправлено: 10 Января, 2013 - 19:00:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




armancho7777777 Да я также думаю. Но все может быть
 
 Top
_Virus_
Отправлено: 11 Января, 2013 - 14:03:36
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




PHP Version 5.2.6
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB