[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Алгоритм перебора
emaeglin
Здравствуйте,
Нужно перебрать все возможные комбинации элементов масива без повторений.

Например, на входе масив:
$a = array (1,2,3);
на выходе нужно получить масив:
$b = array (
'1',
'2',
'3',
'1,2',
'1,3',
'2,3',
'1,2,3'
);

Нужен алгоритм.
Буду благодарен за любую инфу.



Спустя 4 минуты, 29 секунд (19.10.2011 - 14:14) Игорь_Vasinsky написал(а):
Ооо... а если там даже 10 элементов - этож скока комбинаций?

Спустя 3 минуты, 41 секунда (19.10.2011 - 14:17) emaeglin написал(а):
"2^n - 1" - если не ошибаюсь. где n - число элементов.

Спустя 37 секунд (19.10.2011 - 14:18) Игорь_Vasinsky написал(а):
речь идёт именно об индексном массиве?

Спустя 1 минута, 40 секунд (19.10.2011 - 14:20) emaeglin написал(а):
Элементом масива может быть любое число.

Спустя 1 минута, 58 секунд (19.10.2011 - 14:22) bulgakov написал(а):
Вы случаем не брутфорс пишите? А значения массива будут цифры или еще и буквы?

Спустя 1 минута, 17 секунд (19.10.2011 - 14:23) Игорь_Vasinsky написал(а):
Цитата
"2^n - 1" - если не ошибаюсь. где n - число комбинаций.

без -1, значит произведение все чисел мне кажется с такой же лёгкостью можно запустить безконечный цикл.

Цитата
Элементом масива может быть любое число.

и ключи? только числа?

у 10ки - "3628800" комбинаций

Спустя 2 минуты, 5 секунд (19.10.2011 - 14:25) Игорь_Vasinsky написал(а):
а чё массив? откуда такая потребность?

может просто сформировать словарь

for($i=0; $i < 9999999999999999999999999; $i++)
{
echo $i . '</br>';
}

Спустя 2 минуты, 1 секунда (19.10.2011 - 14:27) emaeglin написал(а):
Цитата (Игорь_Vasinsky @ 19.10.2011 - 11:23)
Цитата
Элементом масива может быть любое число.

и ключи? только числа?

у 10ки - "3628800" комбинаций

элементы только числа.

"3628800" комбинаций - это все комбенации, но если откинуть одинаковые ('1,2' = '2,1' и т.д.) - останется 1024.

Спустя 2 минуты, 16 секунд (19.10.2011 - 14:29) Игорь_Vasinsky написал(а):
останется может и стока, но скока операций выполнит алгоритм то ? в -n раз больше

Спустя 1 час, 2 минуты, 18 секунд (19.10.2011 - 15:31) emaeglin написал(а):
Цитата (Игорь_Vasinsky @ 19.10.2011 - 11:29)
останется может и стока, но скока операций выполнит алгоритм то ? в -n раз больше

в этом и дело. нужен какой-то алгоритм, который не будет создавать все возможные комбинации, а потом отбрасывать одинаковые.

Спустя 3 минуты, 1 секунда (19.10.2011 - 15:34) Игорь_Vasinsky написал(а):
я тебе говорю о том что ещё не понятно что будет вешать сервер

алгоритм перебора уникальных значений или алгоритм который будет делать это потом.

Во всяком случае - идей нет.

Спустя 4 минуты, 49 секунд (19.10.2011 - 15:39) Winston написал(а):
ТЫЦ.
Нечто похожее на твое задание. Можно под себя подстроить.

Спустя 40 минут, 17 секунд (19.10.2011 - 16:20) emaeglin написал(а):
Всем спасибо за помощь. Задачу решил.

Спустя 2 минуты, 51 секунда (19.10.2011 - 16:22) Winston написал(а):
Цитата (emaeglin @ 19.10.2011 - 16:20)
Всем спасибо за помощь. Задачу решил.

Каким образом? Покажи решение.

Спустя 6 минут, 16 секунд (19.10.2011 - 16:29) emaeglin написал(а):
Цитата (Winston @ 19.10.2011 - 13:22)
Цитата (emaeglin @ 19.10.2011 - 16:20)
Всем спасибо за помощь. Задачу решил.

Каким образом? Покажи решение.


<?php
$arr = array ('a','b','c','d','e','f');
$n = count ($arr);
$res = array ();
$tmp = array ();

for ($i = 0; $i<$n; $i++)
{
$res[$i] = $arr[$i];
$tmp[$i] = $i + 1;
}

$k=0;
$l=$n-1;
$m=$n;

for ($a = 1; $a<$n; $a++)
{
for ($i=$k;$i<$l;$i++)
for ($j=$tmp[$i]; $j<$n; $j++)
{
$res[$m] = $res[$i] . "," . $arr[$j];
$tmp[$m] = $j + 1;
$m++;
}
$k = $l + 1;
$l = $m - 1;
}

foreach ($res as $k=>$v)
{
echo $v . "\n";
}

Спустя 16 часов, 50 минут, 8 секунд (20.10.2011 - 09:19) SlavaFr написал(а):

/**
* get all value variants of array
*
@autor Slava
*
@param array $array
*
@return array
*/

function getAllVariants($array){
$variantcount=pow(2,count($array))-1;
$return_array=array();
while($variantcount>0){
$temp=$variantcount;
$k=0;
$line_array=array();
while(($temp>>$k)>0){
$x=(1<<$k);
if(($x&$temp) == $x)$line_array[]=$array[$k];
$k++;
}
$return_array[]=$line_array;
$variantcount--;
}
return $return_array;
}

//Test
print_r(getAllVariants(array('a','b','c','d')));

Спустя 11 месяцев, 14 дней, 6 часов, 50 минут, 32 секунды (4.10.2012 - 16:09) Доброжелатель написал(а):
Решение на javascript:

<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Перебор</title>
<script type="text/javascript">
function calc() {
var words = document.getElementById('words').value.split(' ');

var r = [];
function go(t, index) {
for(var i=index; i<words.length; i++) {
var tmp = t + words[i];
r.push(tmp);
go(tmp, i + 1);
}
}
go('', 0);
document.getElementById('result').value=r.join('\n');
}
</script>
</head>

<body>
Слова<br>
<input id="words" type="text" size="80"></input><br>
Результат<br>
<textarea id="result" rows="20" cols="80"></textarea><br>
<button onclick="calc()">Рассчитать</button>
</body>
</html>
Быстрый ответ:

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