【发布时间】:2013-12-25 22:03:20
【问题描述】:
我将在底部解释问题的来源,但这是声明。假设我有两个非负整数列表,我将分别写为(A[0] ... A[n]) 和(B[0] ... B[m])。它们是严格增加的,所以A[i+1] > A[i] 对所有i 和B 类似。我想按总和的升序收集所有 n * m 元素对。
所以,例如如果A = (0 1 2) 和B = (1 4),那么我想最终收集((0 1) (1 1) (2 1) (0 4) (1 4) (2 4))。如果出现平局,我不在乎我以哪个顺序收集这两个元素。例如,如果A = (0 1) 和B = (0 1),那么我不介意哪个混合术语,(0 1) 或@987654333 @,我先接。
显然,我希望这样的效率相当高。我希望有可能在时间上渐近到m * n。具体来说,如果我对输入一无所知,我希望有序输入比等效问题更容易解决这个问题。当我第一次问这个问题时,我在想的是我们必须存储的状态量。我希望以恒定的数量有可能,但也许这是不现实的。 (后来我尝试过的东西都失败了!)
代码实际上是用 Lisp 编写的,但我认为问题陈述几乎与 Lisp 无关。输入最自然地以单链表的形式出现,但无论如何我都必须提前反转它们,所以如果随机访问是相关的,我可以将它们制作成数组。如果它是相关的,我希望这主要是在非常小的列表上调用的,因此运行时中的大量常数项/常数因子可能会排除解决方案。 (虽然我很想知道算法的想法!)
背景:我一直在查看计算机代数系统 Maxima 的源代码,尤其是用于两个多项式相乘的代码。多项式以“稀疏格式”表示,因此x^5 + x^2 + 2 可能显示为(5 1 2 1 0 2),其指数下降后跟它们各自的系数。为了有效地计算产品,我真正想做的是收集零度项,然后是度1项等。当前代码通过半心半意地尝试解决这个问题来避免解决这个问题,然后做一个一种通用多项式加法,以它不期望的顺序处理系数。我觉得我们应该可以做得更好!
【问题讨论】:
-
您使用什么语言?数组有多大?
-
波西米亚:阅读第二段。其他人也是,如果你想回答这个问题,我猜。
-
正如下面几个人所指出的,当我说“迭代每个列表一次”时,我很傻。我将进行编辑,以便上面的声明更明智。
-
阵列的备件有多少?例子 ?因为如果我们在多项式 (x^500+3*x^120+x) 中有大洞,我们要么最好进行分治法(这将跳过空白部分),要么像手动处理乘法一样。
-
Aside:等效的 Python 表达式:
sorted([(a,b) for a in A for b in B], key=sum)
标签: algorithm sorting numbers iteration