我有两个生成器genA
和{
现在我需要一个生成器来生成所有元组(a, b)
,这样a
由genA
生成,b
由{a + b
升序排列。在不明确的情况下,排序是不重要的,即如果a + b == c + d
,那么它是先生成(a, b)
还是先生成{
例如。如果genA
和genB
都生成质数,那么新的生成器应该生成:
(2, 3), (2, 5), (3, 5), (2, 7), (3, 7), (5, 7), (2, 11), ...
如果genA
和{
显然,对于(x, b)
形式的所有元组,以下内容都成立:first(genA) <= x <= max(genA,b) <= b
,是first(genA)
由{max(genA,b)
是{b
。在
我已经走了这么远。有什么办法把两台发电机按上述方式组合起来吗?在
我认为不保存
genA
的所有结果是不可能做到这一点的。解决方案可能如下所示:说明:主循环只迭代
genB
中的所有元素,然后从genA
中获取小于b
的所有元素并将它们保存在一个列表中。然后它生成所有元组(a0, b), (a1, b), ..., (a_n, b)
,并将它们存储在min-heap中,当您只对提取集合的最小值感兴趣时,这是一种有效的数据结构。与排序一样,可以执行trick操作,不保存对本身,而是在它们前面加上要排序的值(a+b
),因为元组之间的比较将从比较第一项开始。最后,它从堆中弹出所有元素,这些元素的总和保证小于为下一个b
生成的任何对的总和,并生成它们。在注意,}在生成结果时都会增加,我猜这与到目前为止生成的元素数量的平方根成比例。在
heap
和{用一些素数快速测试:
^{pr2}$一如预期。无限发电机测试:
相关问题 更多 >
编程相关推荐