繁体   English   中英

如何找到一组唯一的数组对?

[英]How do I find a set of unique pairs of an array?

假设我有以下数组:

array = [0, 1, 2, ... , n]

如何找到一个集合,使得集合中的对都是唯一且非重复的元素?

这意味着:

•(x,y)=(y,x)所以如果(x,y)在集合中,则(y,x)不会是&反之亦然

•如果元素已被使用,则不能再次使用。

例如:如果(1,2)在集合中,则集合中不能有一对具有1或2的对。

上下文:我正在创建一个记忆游戏,将硬币放置在2n个元素的板上。 我希望游戏的每次迭代都将元素放置在板上的随机空间中。

例如:

Suppose I have: [A, B, C, D, E, F]
Since [A, B, C, D, E, F] is length 6, then the board will consist of 12 elements.
My board will look like the following such that the elements were randomly placed:

A B C D

C A F B

E F E D

坦率地说,我不执行O(n ^ 2)蛮力方法就不知道如何解决这个问题。 我认为可能还有另一种更有效的算法。

您可以使用Fisher-Yates混洗来有效地在O(n)时间中对每个硬币值中的两个硬币值进行混洗。 该算法基本上采用排序列表,并不断交换列表中的两个随机元素,直到列表在数学上被随机/随机排序为止。

在JavaScript中:

// Generate seed array.
// Numbers are used here for simplicity, but the array can contain any type like String.
a = [];
for (i=0; i<4; i++) { a.push(i, i); }
console.log(a);  // [0, 0, 1, 1, 2, 2, 3, 3]

// This is the "modern version" pseudo-code ported to JavaScript:
// To shuffle an array a of n elements (indices 0..n-1):
n = a.length;
// for i from n−1 downto 1 do
for (i=n-1; i>0; i--)  {  
  // j ← random integer such that 0 ≤ j ≤ i
  j = Math.floor(Math.random() * (i + 1));

  // exchange a[j] and a[i] 
  tmp = a[j];
  a[j] = a[i];
  a[i] = tmp;
}
console.log(a);  // [2, 1, 3, 3, 0, 1, 0, 2]

旁注:尽管算法中的O(n ^ 2)听起来很糟糕,但对于洗牌游戏中的物品来说可能并没有多大区别。 您一开始只将少量项目洗牌。 因此,您可能无法判断复杂度是O(n)还是O(n ^ 2)。 复杂度仅在n变得非常大时才变得重要,或者您需要连续重复计算(例如每秒数百万次)。 我建议首先优化代码以提高可读性。 然后仅在明显需要时进行优化。

创建两个输入数组(或一个包含重复元素的数组)。 从数组中随机逐出元素,并将其随机放置在3个输出数组中。 当您随机选择元素并随机放置它们时,您不需要对它们进行混洗。

在您的代码中,您可以检查是否在输出数组中,给定索引上是否已经存在元素,以避免覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM