获得最大前k值

时间:2013-03-26 03:23:11

标签: performance algorithm sorting optimization computer-science

现在我有一个表达式y=0.5*a+0.7*b+0.4*c,其中0<a,b,c<1。假设有一个a,b,c值的列表,例如:

(a,   b,   c)
---------------
(0.9, 0.4, 0.6)
(0.5, 0.8, 0.4)
(0.7, 0.4, 0.8)
(0.9, 0.2, 0.1)
...

是否有一些快速查找k=3的最高y值的方法?

我知道蛮力的方法是枚举(a,b,c)的每个元组用于计算y,然后找到y的k个最大值,但是当元组的数量巨大时,它似乎这种方法效率不高。所以欢迎任何其他方式!

3 个答案:

答案 0 :(得分:2)

走过每一个元组。当您阅读它时,评估它上面的表达式,并保持前三个值的数组。

试图比这更聪明的问题是,如果你的元组列表很大,那么你的程序花费的时间将完全由只读它来控制,并且没有聪明可以让你摆脱它。评估表达式并使用前三个值保持数组最新的开销将是完全无关紧要的,只需阅读部分顶部的几条指令。

(至于为什么我建议将你的顶级值保存在一个数组而不是像堆一样更漂亮的东西:当k = 3时,任何使用大量指令执行的任何东西的持续开销,或者需要足够的内存你并不总是会得到一个缓存命中,它将超过数据结构提供的任何渐近的好处。)

答案 1 :(得分:2)

使用QuickSelect会给你平均O(n)的复杂性:

  1. 假设有N个元素并且y = f(a,b,c),为(a,b,c)中的每一个计算长度为N的数组Y(将索引添加到(a,b,c)到Y以及稍后你需要的背面参考。)
  2. 在Y上使用QuickSelect得到(N-k)阶数统计量,并得到结果Y.元素Y [N-k-1]到Y [N-1]将是你的k个最大元素。
  3. 将Y [N-k-1]分类为Y [N-1]以获得结果。

答案 2 :(得分:1)

无论你做什么,你仍然必须经历表中的每个元组,所以这将至少是O(n)操作。对于前3个值,您可以对大小为3的数组进行硬编码,并进行所需的if检查。

所以,鉴于你必须至少完成一次整个表格,在这种情况下你不会比O(n)做得更好。