修改选择算法以选择加权项

时间:2010-10-29 00:08:47

标签: algorithm optimization select

我正在尝试修改选择算法以处理以下情况:

我的输入是一个数字列表x1,x2,...,xn(不一定是有序的)。

这些数字中的每一个都具有权重“w”。我把W称为所有权重的总和。

如果我提供的值X大于0但不大于W,我怎么能找到一个xi,这样所有索引大于i的x的权重之和小于X,xi的权重+索引大于i的所有项目的权重之和大于或等于X.

如果我们根据索引对所有x进行排序,这很容易实现,但我希望这样做而不进行排序。

1 个答案:

答案 0 :(得分:0)

如果给你标识符i,你不应该对它们进行排序。这听起来像你想要它们的标识符,这是已知的,所以你只需要通过列表O(n)进行一次传递,使它们按顺序排列。然后按照其中一个发布的解决方案找出i的正确值。我误解了这个问题吗?

<强>更新

因此,假设您有四个值,标识符如下:

[ x4, x1, x3, x2 ]

他们的权重分别是:

[ 14, 10, 5, 19 ]

您所要做的就是先按顺序获取清单。它与排序不同,因为在这个原因你有x1 .. xn,其中数字都是连续的,没有重复等等。所以你知道结果将是一个大小为4的新列表。

通过第一个列表进行一次传递。在这种情况下,第一个数字的标识符为4,所以将它放在位置4的新列表中,并将第一个权重放在位置4的新权重列表中。接下来将放在位置1,依此类推等等第四。

在这一次通过后,您的列表将如下所示:

[ x1, x2, x3, x4 ] and [ 10, 19, 5, 14]

所以你现在有了你想要的订单。此时很容易从权重列表的末尾开始,并找到您要查找的属性,最多再遍历一次列表。

因此它应该是O(n)。