2014-03-27 4 views
0

Говорит, что у меня есть массив [0,1,2,3] и параметр 2 в качестве входных данныхПодмножества комбинаций array- AS3

Я хочу выход быть

0 0 
0 1 
0 2 
0 3 
1 0 
1 1 
1 2 
1 3 
2 0 
2 1 
2 2 
2 3 
3 0 
3 1 
3 2 
3 3 

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

Есть ли быстрый способ сделать это.

Спасибо!

ответ

2

О, я не знаю, но во-первых, я создал combinations и permutations, а после некоторого времени я создал утилиту для вашей задачи.

var subsetTest:Array = []; 
subsetFill([0, 1, 2], [], subsetTest, 2); 
prettyPrint(subsetTest); 

private function subsetFill(values:Array, cursor:Array, result:Array, length:uint):void { 
    if (cursor.length > length) { 
     return; 
    } 
    if (cursor.length == length) { 
     result.push(cursor.slice()); 
    } 

    var i:uint, len:uint = values.length; 

    for (i; i < len; ++i) { 
     cursor.push(values[i]); 
     subsetFill(values, cursor.slice(), result, length); 
     cursor.length = cursor.length - 1; 
    } 
} 

//Auxiliary method for tracing 
private function prettyPrint(list:Array):void { 
    var i:uint, len:uint = list.length; 

    for (i; i < len; ++i) { 
     trace(list[i]); 
    } 
} 

И результат:

[trace] 0,0 
[trace] 0,1 
[trace] 0,2 
[trace] 1,0 
[trace] 1,1 
[trace] 1,2 
[trace] 2,0 
[trace] 2,1 
[trace] 2,2 

Если кто-то заинтересован, я мог бы поделиться combinations и permutations функции;)

+0

Спасибо! xactly, что я хотел ... блестящий .. – jamie

+0

Привет, есть ли способ сделать эту реализацию быстрее? Я бы хотел подняться до 10, но в этом случае он слишком вычислительно интенсивен. У меня есть способ сделать более эффективным, когда длина> необходима длина. Ваша помощь очень ценится! – jamie

+0

10? Это много циклов и причин. Это очень интенсивно ... Если ваши данные недостаточно динамичны, вы можете прекомпретировать значение только один раз с предоставленным алгоритмом, или вы можете перенести этот алгоритм на [Рабочий] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/Worker.html) –

0

Три для циклов:

for(var i:int = 0; i < to_do.length; i++) { 
    for (var k:int = 0; k < to_do[i];k++){ 
     new_array.push(new Array()); 
     for (var j:int = 0; j < another_array.length; j++) { 
      new_array[k].push(another_array[j]); 
     } 
    } 
} 

Это должно получить работу.

+0

Спасибо. Но результат не тот, который я ожидаю. Он возвращает массив с 8 массивами, каждый из которых имеет разные комбинации 0 1 2 и 3. – jamie

+0

Тогда я неправильно понял ваш вопрос – Zhafur

+0

Извините, если не ясно. Я хочу найти все комбинации another_array [0,1,2,3], которые ограничены длиной to_do (2). – jamie

Смежные вопросы