热线电话:13121318867

登录
2019-02-14 阅读量: 627
怎么有效地找出低于阈值的最大值?

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

给定一个小的正数M (e.g. 0.10948472),发现a,b从L1和c从L2ST (b/a)*c最大化,但仍<=M

请注意,列表L2是固定的(长度约为7000),列表L1具有可变长度(可以有单个元素或最多3000元素)。

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

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

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

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

0.0000
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子