Нужно перебрать все возможные комбинации элементов масива без повторений.
Например, на входе масив:
$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) | ||
Каким образом? Покажи решение. |
<?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>
<!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>