【问题标题】:Counting the number of same ordered pairs in three different permutations计算三种不同排列中相同有序对的数量
【发布时间】:2019-09-10 13:53:43
【问题描述】:

我有集合 {1,2,..n} 的三个不同排列,我想编写一些代码来计算所有三个排列中顺序相同的数字对的数量。

作为一个排列的例子。
{1,2,3}
(1,2,3).
(3,2,1)

有 0 个这样的对,它们的顺序相同,因为 (1,2,3)(3,2,1) 按升序和降序排序

我想要一个最佳的O(N*logN) 解决方案。给出了一个提示,您必须在其中计算每个排列的反转次数,即

倒置是一对(i,j) 使得i > ja[j] > a[i]

我可以在O(NlogN) 中做到这一点。

因此,如果一对以递增的顺序出现在每个排列中,那么肯定会为每个排列的每个反转计数加 1。但如果i > ja[j] > a[i](全部按降序排列)因为我应该增加计数,但这对反转计数没有任何贡献。之后,如果我可以计算每个数组中的反转次数,但我没有看到它与同序对的数量之间的联系。

【问题讨论】:

  • 添加一个示例(具有预期输出)会使这个问题更清楚。

标签: algorithm counting


【解决方案1】:

对于您拥有的每个排列,您应该计算a[i] < a[j]、每对索引ij 的情况数,例如i < j。我们称之为非倒置。然后,您可以通过获取您找到的非反转计数中的最小值来找出结果。

例如,在您的示例中,排列 (1,2,3)(1,2,3)(3,2,1) 对应的值分别为 3、3 和 0。

对于不同的示例案例,您可以检查(1,2,3,4)(1,2,4,3)(1,3,2,4)(4,1,3,2)。这些排列的对应计数是 6、4、5 和 2。结果是 min(6,4,5,2),因为在每种情况下唯一保持有序的元组是 (1, 2)(1, 3)

此解决方案背后的关键思想是基于非倒置计数的含义。在大小为N 的有序数组中,有N(N-1)/2 有序对有助于非反转计数。当您在该数组中引入一些反转时,一些元素的相对顺序会丢失,而一些元素会保留。通过找到 非反转 计数的最小值,您可以找到在“最坏”情况下保持其相对顺序的对数。 (即使仅此还不够,不能单独识别它们)

如果您坚持计算反转(即与 非反转 相对),则过程几乎相同。计算给你的每个排列的反转。然后简单地从N(N-1)/2中减去你找到的最大值,得到结果。

【讨论】:

  • 这是错误的,因为三元组 (3,2,1), (3,2,1), (3,2,1) 应该有 3 作为答案,但你的方法说 0。
  • 问题的作者明确指出,在这种情况下,答案是 0。(“有 0 个这样的对......”)@btilly
  • 问题是所有3次以相同顺序出现的数字对的数量。在我给出的示例中,所有数字对都以相同的顺序出现 3 次。 (首先是较大的。)您正在查看的示例包括(3,2,1), (1,2,3),其中没有一对的顺序相同,因此答案为 0。
  • 哦,我明白了。我会尽快修改我的答案。
  • 另一个例子,考虑(1,2,3), (2,1,3), (1,3,2)。非反转的数量是 3, 2, 2。但唯一的对在相同的顺序所有 3 次是(1,3)
猜你喜欢
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2014-06-19
  • 2014-03-25
相关资源
最近更新 更多