【发布时间】:2023-03-23 02:34:01
【问题描述】:
我有两个列表。列表L1 包含所有正整数,列表L2 包含正数(e.g. 0.01,0.1,0.5,3,5,10,100....)。
给定一个小的正数M(e.g. 0.10948472),从L1 中找到a,b,从L2 s.t.中找到c。 (b/a)*c 已最大化但仍为 <=M
请注意,列表 L2 是固定的(长度约为 7000),列表 L1 的长度是可变的(可以有单个元素或最多 3000 个元素)。
我们如何有效地设计算法来解决这个问题?我正在考虑使用列表L1 上的分而治之将其分成两部分然后合并,但没有成功。任何人都可以有效地解决它?
更新:目前我制定了一些低效但正确的解决方案:首先对“L1”进行排序。将“L1”分成两个块:一个块是第一个N-1 元素,另一个块是最后一个元素。假设在L1 的第一个N-1 元素上找到了最好的a,b,c,我检查我们是否可以在第一个块中找到一些a,在第二个块中找到b(仅一个元素)和一些c ,这样(b/a)*c 就会改进。由于我必须循环遍历L2 中的每个元素,虽然它是nlogn,但似乎仍然很慢
【问题讨论】:
-
你是不是先以低效的方式做到了?
-
是的,我想出了两个低效但正确的解决方案。让我更新一下这个问题,谢谢
-
我想这可以在
O((n^2) * log(n^2))完成,方法是创建所有可能的b/a和d/c的数组并对它们进行排序。您想达到什么复杂程度? -
@dWinder 我正在尝试至少达到 O(nlogn)
-
O(nlog n) 中的 n 是什么意思?从技术上讲,您有两个不同长度的数组,从长度(L1)将它们称为n1,将长度(L2)称为n2。我相信你可以得到 O(n1*n2*log(n1)) 并且由于 n2 是固定的,技术上是 O(n*log(n)) - 但这似乎是作弊。
标签: python algorithm recursion divide-and-conquer