如何获取导致特定总和的 top-x 元素



我想得到一个数组的前 X 个元素,该元素的总和至少达到给定的总和,而无需事先对整个数组进行线性时间排序。我认为不可能在所有情况下都获得线性时间,但至少在我的输入数组中,我有大约 1% 的元素占总和的 99%。我需要正确识别这些。我不知道它是否有帮助,但所有元素的总和始终为 1。

我已经用一个排序数组实现了它,但这增加了我的算法的复杂性。之后,我已经研究了top-k算法和背包算法,但它们不允许灵活的x元素依赖于给定的最小和。

Input Array: [0.1, 0.2, 0.4, 0.05, 0.01, 0.01, 0.01, 0.02, 0.15, 0.05]
Example 1:
Given Sum: 0.8
Expected output [0.1, 0.2, 0.4, 0.15, ] --> Sum 0.85 but only top 4 elements
Example 2: 
Given Sum: 0.95
Expected output [0.1, 0.2, 0.4, 0.15, 0.05, 0.05 ] --> Sum 0.95 but only top 6 elements

真的很期待你的回答!

如果我们有一个中值选择算法,其时间复杂度为O(n(的可能性足够大,那么我们就可以得到整体O(n(。观察到,选择中位数后,我们只需要检查分区中的一个部分,导致 N + N/2 + N/4...与 O(n( 的界限。这是因为想要的总和要么包含在中位数上方的一半中,要么我们需要从下半部分添加更多,在这种情况下,我们不需要检查上半部分。

您可以将值四舍五入为 3 位十进制数字,并使用存储桶排序。使用 3 个十进制数字时,您将需要 1000 个存储桶。您可以使用更多或更少的存储桶,具体取决于您的问题。时间复杂度为 O(n+k(,其中 k 是桶数。

在存储桶中,您可以存储确切的值,因此在扫描存储桶以获取所需的总和时,您将使用实际值。您说最高值通常占所有值的 1%。然后,顶部存储桶应仅包含几个值。

最新更新