如何获得产生特定总和的top-x元素

时间:2019-06-04 09:10:27

标签: python arrays algorithm knapsack-problem

我想获得一个数组的前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

真的很期待您的回答!

2 个答案:

答案 0 :(得分:2)

如果我们可以有一个中位数选择算法,其时间复杂度为O(n),那么我们可以拥有整体O(n)。观察到选择中位数后,我们只需要检查分区中的一个部分,得出N + N / 2 + N / 4 ...,边界为O(n)。这是因为所需的总和包含在中位数以上的一半中,或者我们需要在下半部分中添加更多,在这种情况下,我们无需检查上半部分。

答案 1 :(得分:0)

您可以将值四舍五入为3个十进制数字,然后使用bucket sort。使用3个十进制数字,您将需要1000个存储桶。您可以根据问题使用更多或更少的存储桶。时间复杂度为O(n + k),其中k为存储桶数。

在存储桶中,您可以存储准确的值,因此在扫描存储桶以获取所需的总和时,将使用实际值。您说最高值通常代表所有值的1%。然后,最上面的存储桶应该只包含几个值。