[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Размещение с повторениями
Reflex
Нужна функция, принимающая на входе массив символов и число, а возвращающая массив всех возможных размещений с повторениями.

Например:
print_r( permutations_with_repetition(3, array('a', 'b')) );


Результат:
Array
(
[0] => aaa
[1] => aab
[2] => aba
[3] => abb
[4] => baa
[5] => bab
[6] => bba
[7] => bbb
)


Последовательность, в которой выводится результат, не играет роли.
Роль играет быстродействие.

PS: видел такую функцию на php для перестановок, а вот для размещений не нашёл.



Спустя 34 минуты, 59 секунд (21.07.2010 - 00:03) KaFe написал(а):
	function pwr($a,$b)
{
$amount = pow(count($b),$a);
$array = array();
while ($amount<>count($array))
{
for ($x=0;$x<$a;$x++) $text.=$b[array_rand($b)];
if (!in_array($text,$array))
{
$array[] = $text;
$i++;
}
unset($text);
}
return $array;
}

для таких значений print_r(pwr(10, array('a', 'b'))); выполняется 0.526 сек.

Спустя 1 час, 40 минут, 59 секунд (21.07.2010 - 01:44) Reflex написал(а):
KaFe, количество размещение с повторениями из 10 элементов по 6 равно одному миллиону. Представьте что делает предложенный вами вариант кода, когда остаётся заполнить один последний, миллионный элемент. Возможно моя вина, дал слишком простой пример, но ведь написал про быстродействие.

Спустя 1 час, 10 минут, 45 секунд (21.07.2010 - 02:55) dr_Lev написал(а):
Может так?:

fucntion tratata($count, $chars){
if ($count > 1){
$arr = tratata($count-1, $chars);
$result = array();
foreach ($chars as $char){
foreach ($arr as $item){
$result[] = $char.$item;
}
}

return $result;
}
return $chars;
}

print_r tratata(3, array('a','b'));

Прошу прощения за возможные ошибки писал на колене

Спустя 7 часов, 42 минуты, 53 секунды (21.07.2010 - 10:38) KaFe написал(а):
Ну тогда вот так wink.gif
function pwr($a,$b)
{
$count = count($b);
$amount = pow($count,$a);
$array = array();
for ($x=0;$x<$a;$x++)
{
$i = -1;
while (count($array[$x])<>$amount)
{
for ($y=0;$y<$count;$y++)
{
for($r=0;$r<(pow($count,$x));$r++)
{
$i++;
$array[$x][$i]=$b[$y];
}
}
}
}


for ($k=0;$k<$amount;$k++)
{
$u++;
for ($x=0;$x<$a;$x++)
{
$arr[$u].=$array[$x][$k];
}
}

return $arr;
}

Это выражение print_r(pwr(10, array('a', 'b'))); выполняет за 0.034 сек
Цитата

KaFe, количество размещение с повторениями из 10 элементов по 6 равно одному миллиону

Проверил на том коде, пишет мало времени, проверил на этом коде пишет мало оперативы laugh.gif laugh.gif laugh.gif

Спустя 26 минут, 35 секунд (21.07.2010 - 11:05) sergeiss написал(а):
Цитата (Reflex @ 21.07.2010 - 00:28)
Нужна функция, принимающая на входе массив символов и число, а возвращающая массив всех возможных размещений с повторениями......

Возьми функции из Википедии, по твоей же ссылке, и перепиши их под ПХП. В чем проблемы?

Особенно джавовская функция хорошА. Прямо под ПХП заточена smile.gif С точностью до обозначений.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.