循环遍历两组数字的所有组合,使得它们的乘法的总和按降序排列

时间:2014-09-18 21:18:54

标签: algorithm math computer-science discrete-mathematics

例如。循环遍历1-99和1-99的所有组合,使其乘法的总和按降序排列。

99 * 99 = 9801
99 * 98 = 9702
98 * 98 = 9604
99 * 97 = 9603
98 * 97 = 9506
99 * 96 = 9504
...
 5 *  1 = 5
 2 *  2 = 4
 4 *  1 = 4
 3 *  1 = 3
 2 *  1 = 2
 1 *  1 = 1

我已经尝试了几天想出一个模式。在这一点上,我认为如果不先进行乘法运算几乎是不可能的。有没有人这样做过?

2 个答案:

答案 0 :(得分:0)

这是一种使用O(log n)内存和O(n log n)时间的合并排序样式分而治之的方法。它将产品中第一个数字的范围缩小了一半,然后懒洋洋地合并了懒洋洋地生成产品的结果。我使用了一种技巧,在产生器中使产品为负,这样结果就会以降序而不是升序排列。

import heapq

def inorder(a0, a1):
    if a1 - a0 == 1:
        return ((-a0*b, a0, b) for b in xrange(a0, 0, -1))
    am = (a0 + a1) // 2
    return heapq.merge(inorder(a0, am), inorder(am, a1))

for r, a, b in inorder(1, 100):
    print a, '*', b, '=', -r

答案 1 :(得分:0)

此问题基本上与Order (a,b) pairs by result of a*b

重复

我已经查看了问题的所有答案,并且仍然相信我的是最好的,尽管它不是被接受的那个。 :)

关键是:

  • 假设a * b = c使得c目前是您可以获得的最大产品
  • 那么是下一个最大的产品(a - 1) * ba * (b - 1)
  • 我们不知道,除非我们比较它们,因此我们需要维护一个优先级队列
  • 所以在每次迭代中,我们从优先级队列中获取最大的产品,然后添加到优先级队列(a - 1) * ba * (b - 1)

但是如果你需要循环遍历所有组合,到目前为止最简单的解决方案是生成所有产品然后排序。它只有10000个项目,因此使用上述方法获得的任何效率提升都是最小的。