如何有效地找出低于阈值的最大值?

问题描述 投票:4回答:3

我有两个清单。列表L1包含所有正整数,列表L2包含正数(e.g. 0.01,0.1,0.5,3,5,10,100....)

给出一个小的正数M (e.g. 0.10948472),从L1和a,bfrom c s.t.找到L2(b/a)*c最大化但仍然<=M

请注意,列表qazxsw poi是固定的(qazxsw poi周围的长度),列表qazxsw poi具有可变长度(可以有单个元素或高达L2元素)。

我们如何有效地设计算法来解决这个问题?我正在考虑在列表7000上使用分而治之以将其分解成两个然后合并,但是没有成功。任何人都能有效地解决它?

更新:目前我制定了一些低效但正确的解决方案:首先排序'L1'。将'L1'分成两个块:一个块是第一个L1元素,另一个块是最后一个元素。假设在3000的第一个L1元素上发现了最好的N-1,我检查我们是否可以在第一个块中找到一些a,b,c,在第二个块(仅一个元素)和一些N-1中找到L1,这样a就会改善。因为我必须遍历b中的每个元素,虽然它是nlogn,但仍然看起来很慢

python algorithm recursion divide-and-conquer
3个回答
0
投票

按升序排序L1。让我们说| L1 | = n。这是O(n log n)。

对于L2中的每个元素(等式中的'c'),执行以下操作(因此,如果L2固定,则为O(1)次)。

c

在第2步和第3步中,我们跟踪到目前为止a,b和c找到的最佳值。

运行时间:O(n log n)要排序,然后在步骤2中我们只从每个值增加一次分子或分母,所以这是O(n)+ O(n)= O(n)。

这利用了L2固定。如果| L2 | = m且m未固定,则需要O(n log n)+ O(m * n)


1
投票

这个问题是(b/a)*c,所以你不太可能比Theta(n ^ 2)做得更好。如果我理解正确,你当前的算法是O(n ^ 2 log n),这不会留下很大的改进空间。


1
投票

根据我的理解,你不必为给定的a / b组合循环遍历L2的每个元素。按升序排序L2。那么假设你从L1中选择了第一个a / b组合。对于c,您可以在L2的中间选择元素,即在索引3500处并乘以a / b。如果答案小于M,你可以选择较高指数的元素,例如7000 * 3/4即5250.如果答案仍然较小,则继续走高。如果相反(a / b)* c超过M,则选择较低的索引。你可以收敛到特定a / b组合的c的最大值。

附:不用说,在排序L1和L2之后,你可以添加一个if语句来消除L1或L2中的那些元素,它们对于任何L2或L1值总是会超过M.

© www.soinside.com 2019 - 2024. All rights reserved.