【问题标题】:Average case nlogn Nuts and Bolts matching平均情况下 nlogn 螺母和螺栓匹配
【发布时间】:2021-10-05 23:28:19
【问题描述】:

我必须制定一个算法来匹配两个数组中的项目,我们不能先对任何一个数组进行排序,我们只能通过比较从数组 1 到数组 2 的一个项目和一个到数组 2 的项目进行匹配(比较是 )。输出是两个列表,它们具有相同的顺序。我可以想办法用 n(n+1)/2 次来解决它。目标是 nlog(n)。我一直在用头撞墙试图想办法,但我做不到。谁能给个提示?

所以要解释输入是两个数组 ex。 A = [1,3,6,2,5,4] B =[4,2,3,5,1,6] 并且输出是具有相同顺序的两个数组。您不能先单独对数组进行排序或比较同一数组中的项目。您只能比较列表中的项目,例如 A_1

【问题讨论】:

  • @don'ttalkjustcode 已编辑
  • 那么 A 和 B 有相同的元素?每个都可以重复吗?
  • 如果允许的话,随机化会使这变得更容易。
  • 我忘记了细节,但最坏的情况 n log n 是 90 年代中期的一篇研究论文:stackoverflow.com/a/27722418/2144669
  • @DavidEisenstat 谢谢。考虑到即使是“更简单”的论文也有 23 个看起来很复杂的页面,我很高兴我没有花时间自己想出一个最坏的情况 n log n 解决方案 :-)

标签: algorithm complexity-theory


【解决方案1】:

类似于快速排序:

使用随机的 A 元素将 B 划分为较小的 B、相等的 B 和较大的 B。使用其相等的 B 元素对 A 进行分区。递归匹配 small-A 与 small-B 以及 large-A 与 large-B。

就像快速排序一样,预期时间是 O(n log n),最坏情况是 O(n2)。

【讨论】:

  • +1,但请注意,虽然这给出了 expected O(n log n) 时间,但它给出了 worst-case O(n²) 时间: 想象一下,你碰巧总是选择最大的 A 元素或最小的 A 元素。
  • @ruakh 好的,已添加。没有发现它值得注意,因为大多数人可能都熟悉快速排序及其复杂性,而且不太可能出现最坏的情况。
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2017-07-23
  • 1970-01-01
相关资源
最近更新 更多