【发布时间】:2026-02-15 04:25:03
【问题描述】:
我正在努力为以下问题找到一个好的算法:
- 输入:n 个整数的未排序列表
- 输出:p 个(大致)大小相等的未排序列表,其中每个列表的每个最小元素都大于其之前列表的最大元素
目标是对输出进行分层,例如,在 p = 3 的情况下,我得到 3 个小数、中数和大数的无序列表(按此顺序)。
例如:
n = 10, p = 3
- 输入:[4, 1, 8, 7, 9, 3, 6, 0, 2, 5]
- 输出:[[1, 0, 2], [4, 3, 6, 5], [8, 7, 9]]
显然,我可以在O(n*log(n)) 时间通过简单地排序然后分区来做到这一点,但我想知道这是否不能在线性时间内完成。我知道 QuickSelect 在预期的O(n) 平均情况下运行,所以我的直觉是这个问题应该可以在O(p*n) 时间内解决。
天真地我认为你可以简单地运行 QuickSelect p 次,连续找到下一个第 k 个最小的元素,然后对每个元素执行类似基数的排序,以通过在原始步骤中识别的 p 个枢轴对元素进行分区.
所以:
- 我不确定我概述的算法是否有效
- 我不确定
确实需要
O(p*n) - 即使是
O(p*n),我也不确定 这是一个最佳的复杂性(虽然我怀疑它是,因为它 似乎在 p = 1 和 p = n 的边缘情况下工作) - 不是很 优雅
有更好的算法吗?
谢谢
【问题讨论】:
-
举个例子,
[[0], [1], [4, 8, 7, 9, 3, 6, 2, 5]]是一个有效的输出吗?通过找到p-1最小的元素,并将每个元素放在一个单例列表中,其余元素在最终列表中,可以在 O(p*n) 时间内找到它。如果它无效,则说明您的问题未充分说明。 -
好点。目的是使输出列表具有相同大小的 +/- 1 个元素。更新问题。