【发布时间】:2011-04-09 02:31:42
【问题描述】:
我有一个问题,我想确定我是否做得最有效。我有一个大小为 N 的浮点值数组 A。这些值都在 0 和 1 之间。
我必须找到前 k 个值,它可以是 A 中最多三个数字的乘积。所以,前 k 个列表可以 有来自 A 的单个数字、两个数字的乘积或来自 A 的三个数字的乘积。
所以,这就是我现在的做法。我可以在 O(Nlogk) 时间内按降序获得前 k 个数字。然后我创建一个 max-heap 并用最大大小为 3 的最佳值初始化它,即如果我将 k 值的排序数组(降序)表示为 B 以及该数组中的索引数字,我插入索引为 (0)、(0,1) 和 (0,1,2) 的数字。接下来,我在堆上执行提取和 每当我提取大小 z(z 数字的乘积)值时,我将其替换为下一个可能大小 z 数字的集合,即 如果假设(2,4)被提取,我可以用(3,4)和(2,5)替换它。并提取k次得到结果。
如果有的话,需要更好的想法。 谢谢大家。
【问题讨论】:
-
您确定没有将相同的数字添加两次吗?例如,(1,3) 位于 (1,2) 和 (0,3) 之后
-
对,我没有提到它,但我们必须确保我们不会添加两次,可能使用哈希表
-
@user:由于您的数字都在 0 和 1 之间,因此您的集合中任意两个数字的乘积都将小于这两个数字(如果其中一个为 1,则等于较小的数字, 如果两者都是 1),则等于两者。因此,前 k 个将始终是单个数字。这是正确的,还是我误解了?
-
是的,两个数字 a,b 的乘积将小于单个数字。但是,a*b 可以大于 c,d,.... (a>b>c>d>....)
-
可能是一个愚蠢的疑问,但仍然支持 Space_C0wb0y 的评论。如果特定数字是 2 或 3 个单独数字的乘积,我们是否真的需要制表,如果列表可以包含也可以包含单独数字的前 k 个:-D
标签: algorithm computer-science