【问题标题】:Subset of combinations of an array- AS3数组组合的子集 - AS3
【发布时间】:2014-03-27 18:40:49
【问题描述】:

假设我有一个数组 [0,1,2,3] 和一个参数 2 作为输入

我希望输出是

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

参数的长度决定了每个元组中组合的数量,而数组用于生成数字。

有没有快速的方法来做到这一点。

谢谢!

【问题讨论】:

    标签: java arrays actionscript-3 subset


    【解决方案1】:

    哦,我不知道,但首先,我创建了 combinationspermutations,过了一段时间,我为您的任务创建了实用方法。

    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
    

    如果有人感兴趣,我也可以分享combinationspermutations 函数;)

    【讨论】:

    • 嗨,有什么方法可以让这个实现更快?我想达到 10 的长度,但在这种情况下,它的计算量太大。当长度>需要长度时,我有一些方法可以使转义更有效。非常感谢您的帮助!
    • 10?哦,这是很多周期,而且非常密集......如果您的数据不够动态,您可以使用提供的算法只预先计算一次值,或者您可以将此算法移至Worker
    • 谢谢!工人的想法看起来很有趣..会尝试的!谢谢。
    • 只是想听听您对此的看法。您是否认为尝试使用 4 个嵌套循环来生成类似列表会比建议的解决方案更快。
    • 也许,迭代比递归更好更快,但递归提供了可读和紧凑的解决方案。您应该进行小型基准测试并分享您的结果。就在计算存储时间之前并在运算之后减去结果:var time: int = getTimer(); //do computation; trace("Time: " + (getTimer() - time));
    【解决方案2】:

    三个循环:

    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]);
            }
        }
    }
    

    这应该可以完成工作。

    【讨论】:

    • 谢谢。但输出不是我所期望的。它返回一个包含 8 个数组的数组,每个数组都有 0 1 2 和 3 的不同组合。
    • 那我误解了你的问题
    • 如果不清楚,抱歉。我想要的是找到 another_array [0,1,2,3] 的所有组合,这些组合受 to_do (2) 的长度限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多