【问题标题】:Algorithm to sort an array for first element then first 2 elements then first 3 elements and so on为第一个元素排序数组的算法,然后是前 2 个元素,然后是前 3 个元素,依此类推
【发布时间】:2018-11-13 03:19:03
【问题描述】:

我有一个未排序的数字列表,我想要一个算法,这样我可以获得第一个 R 元素的排序列表,但是由于这个 R 对于不同的测试用例可能不同,我不想每次都对第一个 R 的数组进行排序元素。有没有办法让我完成这项工作。一种可能的方法是维护向量数组,以便我先排序 1 个数字,然后排序前 2 个数字,然后排序前 3 个数字,依此类推,但这需要 1log1 + 2log2 + 3log3 + .... + nlogn 时间,即 N^ 2logN 复杂度。是否有更快的方法?

【问题讨论】:

  • 您在寻找std::nth_element 吗?
  • 对整个列表进行排序并完成它是不切实际的吗?
  • 基本上如果 R 是 6 并且我有一个说 25 个数字的列表,那么我应该能够应用排序数组的所有操作,例如找到不大于给定数字的最小值,比如 S前 6 个元素的排序列表,所以简而言之,我需要前 R 个元素的排序列表,其中 R 在不同的测试用例中可能不同,所以如果整个列表已经排序,我将无法获得大于的最小数字的正确结果S 因为如果说我们有 s=13 并且在前 6 个元素中我有 1,2,3,17,18,20 那么 ans 是 17 但后来如果将 15 添加为第 8 个元素 ans 现在是 15 即错误
  • @kunalgupta 我不明白这个问题...如果添加 15,您只需将其插入正确的位置?您应该添加您正在尝试实现的示例,因为它远非明确......
  • 您可以列出std::pair<int, int>,其中first 是数字,second 是未排序列表中的索引。然后在您对其进行排序后,您可以检索第一个R 数字,其中second < R 以获取您的列表。将为您节省大量排序,但可能不会更快,具体取决于数据。

标签: c++ algorithm sorting


【解决方案1】:

在这种情况下,旧的插入排序似乎比 O(N^2 lg N) 做得更好,因为您不需要从头开始对每个 R 的元素进行排序。 假设您在1..R-1 中拥有n 数组中排序的第一个n 元素的副本。 只需将R-th 元素插入到R-1 第一个元素的排序数组的副本中(即O(R)),就可以得到R 第一个元素的排序数组。

如果您想要 1..N 中每个 R 的结果,则为 O(N^2),但实际上这将小于 O(N^2),因为您可以按需生成排序数组,从元素少于R 的最后一个排序数组开始。

【讨论】:

  • 请注意,它是 O(R),前提是我们已经生成了前 R-1 个元素的排序列表。使用此方法的任意 R 的上限为 O(R^2)。
【解决方案2】:

我们可以使用O(n log n) 空间来保留合并排序的部分结果。然后返回第一个排序的R 元素的上限类似于合并log n 排序列表。我发现one reference 用于将k 总长度为n 的排序列表合并到O(n * log k),这将使我们的O(n * log log n) 成为我们的O(n * log log n),但希望许多查询会更有效。

13,15,12,4,18,1,23,17,6,2 ->

| 1   2   4   6   12   13   15   17   18   23 |
| 4   12   13   15   18 | 1   2   6   17  23  | 
| 13  15  | 4   12   18 | 1   23 | 2   6  17  |
| 13 | 15 | 12 | 4 | 18 | 1 | 23 | 17 | 6 | 2 |

【讨论】:

    【解决方案3】:

    您可以尝试快速排序,但不能完全这样做。我听说 Haskell 也是这样做的。

    这几乎是通常的快速排序,但你推迟了可以推迟的工作。

    对于第一个元素,它只是快速选择,您可以跳过与第一个元素无关的范围。但是对于每个下一个元素,您应该寻找尚未分区但需要的范围并对其进行分区。

    第一个元素的时间是O(n)(你不可能得到更好的),整个时间都是O(n * log n)

    用于存储范围位置的额外内存似乎是O(log n),但我还没有充分考虑到这一点。

    更正:如果您每次都需要输出整个子数组,那将是O(n^2),前提是您一次输出一个数字 - 那将是O(n * log n)

    【讨论】:

    • 您似乎要回答的预期输出是带有 1 + 2 + 3...+ nO(n^2) 元素的 OPs 矢量数组。正如您所建议的那样,在这种情况下,我们不能绑定低于O(n^2) 的时间。我是否误解了您试图实现的输出?
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多