【问题标题】:Reversing permutation of an array in Java efficiently在Java中有效地反转数组的排列
【发布时间】:2010-05-04 19:05:52
【问题描述】:

好的,这是我的问题:

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

给定: 长度为 n 的数组 a 整数数组perm,是[1..n]的一个排列

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

即 a=[a,b,c,d], perm=[2,3,4,1] ------> permutedA[b,c,d,a],

我发现我可以通过遍历数组来做到这一点: permutedA[i]=a[perm[i]-1], (-1 因为 perm 中的排列索引以 1 而不是 0 开头)

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

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

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

【问题讨论】:

  • 反转排列操作是什么意思?

标签: java algorithm arrays map


【解决方案1】:

你的意思是

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]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它可能无法满足 OP 的需求,这取决于他为什么要置换、操作然后去置换,但对我来说听起来确实很整洁。
    【解决方案3】:

    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']
    

    【讨论】:

      【解决方案4】:

      有什么问题:

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

      【讨论】:

      • 它是一个随机 shuffle 我想要一个由 perm 数组确定的特定排列,也许我把这个方法命名为恼人的,它应该是 permute() 而不是 shuffle()
      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多