如何在 Actionscript 3.0 中获取数组的所有排列?

Posted

技术标签:

【中文标题】如何在 Actionscript 3.0 中获取数组的所有排列?【英文标题】:How to get an array all permutation in Actionscript 3.0? 【发布时间】:2019-09-10 06:34:33 【问题描述】:

假设我有一个数组 A = [0,1,2]。如何获得二维数组 perm_A = [[0,1,2],[0,2,1][1,0,2][1,2,0][2,1,0],[2 ,0,1]? perm_A 中排列应用程序的顺序无关紧要。

我使用了Heap's Algoritm 中的代码。

function generatePermute(k:int, arr:Array)
        if (k == 1)
        perm_list.push(arr);
    
    else 
        generatePermute(k-1,arr);
    
    for (var i = 0; i < k-1; i++)
        if (k % 2 == 0)
            swap_arr(arr, i, k-1);
        
        else
            swap_arr(arr, 0, k-1);
        
        generatePermute(k-1,arr);
    


function swap_arr(input, index_A, index_B) 
    var temp = input[index_A];
 
    input[index_A] = input[index_B];
    input[index_B] = temp;


var arr:Array = [0,1,2, 3]
var perm_list:Array = new Array();
generatePermute(4,arr);
for (var i = 0; i<perm_list.length;i++)
    trace(perm_list[i])

结果是:

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

这显然是错误的。

更新

如果我改变 perm_list.push(arr);追踪(arr),我确实得到了正确的结果。但是,这只会输出控制台中的所有排列。我想将所有这些排列收集到一个二维数组中。

function generatePermute(k:int, arr:Array)
    if (k == 1)
        trace(arr)
    
    else 
        generatePermute(k-1,arr);
    
    for (var i = 0; i < k-1; i++)
        if (k % 2 == 0)
            swap_arr(arr, i, k-1);
        
        else
            swap_arr(arr, 0, k-1);
        
        generatePermute(k-1,arr);
    


function swap_arr(input, index_A, index_B) 
    var temp = input[index_A];
 
    input[index_A] = input[index_B];
    input[index_B] = temp;


var arr:Array = [0,1,2, 3]
var perm_list:Array = new Array();
generatePermute(4,arr);

哪个输出

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

我的猜测是 perm_list.push(arr) 似乎有问题

【问题讨论】:

可能 if (k % 2 == 0) 应该是 if (i % 2 == 0) 另外,您是否尝试过寻找现成的解决方案?我搜索了 as3 permutations,第一个结果是 github.com/NicolasSiver/as3-nslibrary/blob/master/src/im/siver/… @Organis 我已经用可能的解决方案更新了这个问题。请看... 我建议将函数参数 arr 与外部 arr 变量命名不同。这样,您至少可以确定您正在处理正确的数据。 【参考方案1】:

我想我已经找到了您的实际错误。你用对 arr 的引用填充结果 Array,所以最终结果看起来像 [arr, arr, arr, arr, arr ... arr ]。您不会将当前副本放在那里,而是引用您正在处理的实际对象,然后更改相同的对象。关键是将 arr 的当前状态复制到单独的对象中。

var A:Array = new Array;

permutations([1, 2, 3, 0], 0, A);

trace(A.join("\n"));

function permutations(values:Array, index:uint, result:Array):void

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

    if (index == len)
    
        // Look at the ".slice()" here, it is why
        // this one is working as expected.
        result.push(values.slice());
        return;
    

    for (i = index; i < len; i++)
    
        swap(values, index, i);
        permutations(values, index + 1, result);
        swap(values, index, i);
    


function swap(list:Array, from:uint, to:uint):void

    var temp:* = list[from];
    list[from] = list[to];
    list[to] = temp;

【讨论】:

非常感谢。 permutations() 中的 index 参数是什么意思?为什么你在排列中为它传递 0([1, 2, 3, 0], 0, A); ? 和你的k一样,唯一的区别是你从4倒数到1,而这个从0倒数到3。

以上是关于如何在 Actionscript 3.0 中获取数组的所有排列?的主要内容,如果未能解决你的问题,请参考以下文章

[ActionScript 3.0] AS3.0根据当天日期获取明天,后天...日期

ActionScript 3.0 - 获取数组中相同值的计数

ActionScript 3.0 + 计算两个日期之间的时间跨度?

[ActionScript 3.0] 获取随机颜色

如何在 actionscript 3.0 中使用掩码?

如何在 Actionscript 3.0 中使用补间形状?