【发布时间】:2012-05-17 13:50:57
【问题描述】:
我正在研究一种适用于大量项目的排序/排名算法,我需要以一种有效的方式实现以下算法以使其工作:
有两个数字列表。它们同样长,大约 100-50 万条。从这里我需要找到这些列表之间的第 n 个最大的产品,即。如果您创建一个矩阵,其中顶部有一个列表,一侧有另一个列表,每个单元格都是上面数字和侧面数字的乘积。
示例:列表为A=[1, 3, 4] 和B=[2, 2, 5]。那么产品是[2, 2, 5, 6, 6, 15, 8, 8, 20]。如果我想要第三大,那就是 8。
简单的解决方案是简单地生成这些数字,对它们进行排序,然后选择第 n 个最大的。但那是O(m^2 * log m^2),其中 m 是小列表中元素的数量,这还不够快。
我认为我需要先对两个小列表进行排序。那是O(m * log m)。然后我肯定知道最大的一个A[0]*B[0]。第二大的是 A[0]*B[1] 或 A[1]*B[0], ...
我觉得这可以在O(f(n)) 步骤中完成,与矩阵的大小无关。但是我想不出一种有效的方法来完成这部分。
编辑:有一个答案被删除,建议记住两个排序集中的位置,然后查看 A[a]*B[b+1] 和 A[a+1]*B[b] ,返回较大的一个并递增 a/b。我打算在它被删除之前发布这条评论:
这行不通。想象两个列表 A=B=[3,2,1]。这会给你 像 [9,6,3 ; 6,4,2; 3,2,1]。所以你从 (0,0)=9 开始,去 (0,1)=6,然后选择是 (0,2)=3 或 (1,1)=4。然而,这将 错过了 (1,0)=6 ,它比两者都大。所以你不能只看 两个邻居,但你必须原路返回。
【问题讨论】:
-
n 的范围为 (0..m^2),因此我认为您不能声称任何 O(f(n)) 都与矩阵的大小无关。
-
生成的矩阵称为两个向量的外积。
-
您的列表值的范围是多少?如果在实践中范围比列表的大小小很多,那么作为范围大小函数的算法可能比作为列表大小函数的算法更好。
-
看Kth sum的类似问题:stackoverflow.com/questions/5212037/…
-
您的 A 和 B 样本均已排序。我们是否应该假设它们总是排序的?
标签: performance algorithm search sorting language-agnostic