【问题标题】:Is it possible to devise a O(n log n) sorting algorithm using these three procedures Max(A, i, j), Min(A, i, j) and Swap(A, i, j) only?是否可以仅使用这三个过程 Max(A, i, j)、Min(A, i, j) 和 Swap(A, i, j) 来设计 O(n log n) 排序算法?
【发布时间】:2020-12-11 15:51:29
【问题描述】:

Max(A, i, j) 是一个在数组 A 中从 i 到 j 索引的元素中找到最大值的过程。 Min(A, i, j) 是一个在数组 A 中从 i 到 j 索引的元素中找到最小值的过程。 Swap(A, i, j) 是在数组 A 上交换 A[i] 和 A[j] 的过程。

Min(A, i, j) 和 Max(A, i, j) 的时间复杂度为 O(K),其中 K = j - i。 Swap(A, i, j)的时间复杂度是O(1)。

注意:这不是作业问题,因为我是一名在职专业人士,但我即将参加硕士入学考试,这是前一年的问题之一。 我可以在 O(n^2) 时间内轻松完成此操作,但我无法在每次迭代时将此问题分成一半大小并使用 Min、Max 和 Swap 构建排序输出以获得 O(n log n) 时间复杂度.无论哪种方式,我认为它都会达到 O(n^2)。

我觉得这个问题关于它想要的时间复杂度是不正确的。

【问题讨论】:

  • 如果是作业,您可能需要在问题中提及,并说出您需要什么样的帮助。帮别人做作业很好,做别人的作业是另一回事。
  • 提示:表明你可以通过组合这些操作在 O(1) 中比较两个元素 A[i] 和 A[j]。
  • @Henry, int minIndex = Min(A, i, j); int maxIndex = Max(A, i, j); if( minIndex > maxIndex ) Swap(A, minIndex, maxIndex);
  • @n.'pronouns'm.,这不是作业问题,因为我是一名在职专业人士,但我即将参加硕士入学考试,这是前一年的问题之一。
  • 在这里,这可能会对您有所帮助。只需将 k 替换为 0 和 j-i,即该算法使用快速选择,快速排序的一种变体。 geeksforgeeks.org/…

标签: arrays algorithm sorting max min


【解决方案1】:

任何基于比较的就地排序都可以使用这些原语以正常的复杂度实现。要比较任何 2 个项目,只需将它们交换到位置 0 和 1,调用 Min(A,0,1),然后将它们交换回来。

堆排序是保证 O(n log n) 时间的基于比较的就地排序的明显选择。

在堆排序中,比较用于在大部分相邻的项目中找到最大值,因此您当然可以优化对 Min/Max 的使用,以比上述方式需要更少的调用。

【讨论】:

    【解决方案2】:

    Max(A, i, j) : 可以在 O(N log N) 上完成。

    方式:

    1. 将 (j-i) 之间的所有元素克隆到新数组/列表中
    2. 使用合并/快速排序进行降序排序。
    3. 从数组/列表中返回最顶部的元素

    Min(A, i, j):可以在 O(N log N) 上完成

    方式:

    1. 将 (j-i) 之间的所有元素克隆到新数组/列表中。
    2. 使用合并/快速排序升序排序。
    3. 从数组/列表中返回最顶部的元素。

    Swap(A, i, j):可以在 O(1) 上完成

    所有复杂性描述:

    O(N log N) + O(N log N) + O(1) = > O(N log N)。

    【讨论】:

    • 你误解了这个问题。它不要求实现这些功能。它们已经实现(黑匣子)。任务是设计一个只使用这些函数的有效算法。所以没有可以使用的比较运算符。
    • 另外,MinMax 可以更有效地实现。问题中给出的界限比你的要好,而且很容易实现。
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多