我正在研究一种适用于大量项目的排序/排名算法,我需要以有效的方式实现以下算法以使其工作:
有两个数字列表。它们同样长,大约 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 比两者都大。所以你不能只看两个邻居,但你必须回溯。