好的,这是我的问题:
我在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数组会有所帮助。但我不确定这是否是最佳方式。
答案 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));