【发布时间】:2015-11-28 08:08:34
【问题描述】:
假设给定数组A 和B 的正整数。 A 和 B 包含相同的整数(相同的次数),所以它们的长度自然相同。
如果U[i] != V[i] 对应i = 0, 1, ..., len(U) - 1,则考虑两个数组U 和V 的排列有效。
我们想为A 和B 找到一对有效的排列。但是,我们希望我们的算法能够使所有有效排列对都同样可能被返回。
我今天一直在解决这个问题,但似乎无法提出一个巧妙的解决方案。这是迄今为止我最好的解决方案:
import random
def random_valid_permutation(values):
A = values[:]
B = values[:]
while not is_valid_permutation(A, B):
random.shuffle(A)
random.shuffle(B)
return A, B
def is_valid_permutation(A, B):
return all([A[i] != B[i] for i in range(len(A))])
不幸的是,由于这种方法涉及每个数组的随机洗牌,理论上它可能需要无限的时间才能产生有效的输出。我已经提出了几个确实在有限(且合理)时间内运行的替代方案,但它们的实施时间要长得多。
有人知道解决这个问题的巧妙方法吗?
【问题讨论】:
-
这些被称为 [derangements],这实际上是 Stack Overflow 上的 asked before。 This particular answer 可能是你最“时尚”的答案。
标签: python arrays algorithm permutation