Jump to content
  • 0

Hапечатать все перестановки чисел 1..N


ProGGGer
 Share

Question

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

как пример дано 12 результат : 12 , 21

дано 123 результат : 123 , 132, 213 , 231, 312, 321

В общем и так далее...

я составил алгоритм перестановки символов, но работает не совсем правильно.

<?php
$flag =0;

function chek($str,$numSymbol)
{
global $flag;
global $lengtchString;

while ($flag != $numSymbol )
{
for ($i=0;$i<$lengtchString-1;$i++)
{
$temp = $str[$i];
$str[$i] = $str[$i+1];
$str[$i+1] = $temp;
echo $str."
";
$xx++;
}
$flag++;
}
echo "
Всего строк $xx";
}

$str = "1234";
$lengtchString = strlen($str);
echo "длина строки $lengtchString

";
chek($str,$lengtchString);
?>

Для 3 дначений работает нормально. но для 4 выдает 12 комбинаций, хотя правильные 24 комбинации.

нашел в интернете пример реализиции, но непонимаю работу алгоритма.

пример реализации http://algolist.manual.ru/maths/combinat/permutations.php

Если кто делал на php отпишите какие мысли.

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

как-то делал я в институте перестановку 12 чисел - это ЖЕСТЬ, если вы хотите перебрать все варианты. Надо было найти оптимальную расстановку инструментов в барабане станка для уменьшения времени обработки. При 10 инстументах алгоритм работал 10 минут, при 12 стека не хватало пока... Пока я не переш?л на эвристические алгоритмы... И вам советую. Время поиска оптимальной комбинации из 12 инструментов стало занимать около 2 секунд...

Link to comment
Share on other sites

  • 0

<?php
function chek($str)
{
$num = strlen($str);
$mass = Array();
for($i = 0; $i < $num; $i++ )
{
for($k = 0; $k < $num; $k++ )
{
$mass[$i+$k] = substr($str, $i, 1) . substr($str, $rk, 1);

}
}

}

$str = "1234";
echo("<pre>");
print_r($mass);
echo("</pre>");
?>

не проверял, но должно работать:)

Link to comment
Share on other sites

  • 0

мда... тогда надо думать.... впринципе для 10 символов 3 628 800 возможных вариантов...

с простым алгоритмом... машина долго думать будет... (

немного дополнил операторы

<?php
function chek($str)
{
$num = strlen($str);
$mass = Array();
for($i = 0; $i < $num; $i++ )
{
for($k = 0; $k < $num; $k++ )
{
$mass[$i+$k] = substr($str, $i, 1) . substr($str, $rk, 1);

}
}
return $mass;
}

$str = "1234";
$mass = chek($str);
echo("<pre>");
print_r($mass);
echo("</pre>");
?>

на выходе получем :

Array

(

[0] => 11

[1] => 21

[2] => 31

[3] => 41

[4] => 41

[5] => 41

[6] => 41

)

несовсем то....

Link to comment
Share on other sites

  • 0

Если надо беребрать именно все возможные варианты, то времени уйд?т по-любому туча... Если это нужно для поиска какого-то варианта (одного - оптимального), то надо использовать эвристические алгоритмы...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy