有效地逆转Java中数组的排列

时间:2010-05-04 19:05:52

标签: java algorithm arrays map

好的,这是我的问题:

我在Java中实现一个算法,其中一部分将遵循: 问题是如何以有效的方式做我现在要解释的事情。

下式给出: 数组长度为n 整数数组perm,它是[1..n]

的排列

现在我想使用由数组perm确定的顺序来置换数组a,

即。 a = [a,b,c,d],perm = [2,3,4,1] ------>置换A [b,c,d,a],

我发现我可以通过以下方式迭代数组:permutedA [i] = a [perm [i] -1],( - 1因为perm中的排列索引从1开始而不是0)

现在我想对permutedA做一些操作......

现在我想反过来进行置换操作。 这是我不知道该怎么做的地方。 注意,a可以多次保持一个项目,即a = [a,a,a,a]

现在我认为使用Hashmap而不是perm数组会有所帮助。但我不确定这是否是最佳方式。

4 个答案:

答案 0 :(得分:5)

认为你的意思

ShuffledA[i] = a[perm[i]-1]

当你洗牌的时候,你可以建立反向洗牌:

 inverseperm[perm[i]-1] = i + 1

哪个版本

 inversePerm[4 1 2 3]

然后您将现有算法应用于[b c d a],产生您的原始[a b c d]

答案 1 :(得分:2)

为什么要置换它?为什么不使用perm值访问项目。

for (int i=0; i<a.length; i++) {
  String val = a[perm[i]-1];
}

答案 2 :(得分:1)

Python中的快速而肮脏的例子:

def permute(a, perm):
    result = []
    for x in perm:
        result.append(a[x - 1])
    return result

def invPermute(a, perm):
    result = [None] * len(perm) # Build a result list of correct length
    for i, x in enumerate(a):
        result[perm[i] - 1] = x
    return result

经过测试:

>>> perm = [2,3,4,1]
>>> invPermute(permute("ABCD", perm), perm)
['A', 'B', 'C', 'D']

答案 3 :(得分:-1)

出了什么问题:

Collections.shuffle(Arrays.asList(theArray));