作为正确命名的问题,merge
不应该删除重复项,因为它的名字表明它是mergesort
这应该保护它们。Union
是此类操作的更好名称,它通过增加唯一数字列表来表示集合(此处),它应该通过删除只能来自的重复项来保留该约束both其论点。
回到问题本身,我们把它象征性地写成
S235 = {1} ∪ 2S235 ∪ 3S235 ∪ 5*S235
过早实施是万恶之母! (等等,什么?)我们甚至还不会尝试确定这些到底是如何发生的∪
他们做自己的工作,甚至不按什么顺序。或者甚至有多少个术语:
S23 = {1} ∪ 2S23 ∪ 3S23
or even
S2 = {1} ∪ 2*S2
现在这看起来很简单。我们甚至可以假实现联盟A
and B
here simply首先,考虑所有元素A
,然后——的B
。在这里它会工作得很好,因为这里只有一个元素∪
的左输入:
{1} ----∪-->--->--S₂--.--->S₂
/ \
\______*2_______/
---<----<---
这是如何运作的?1
进入∪
combiner,先退出,无条件地(注意这个发现的需求很重要,因为如果∪
必须立即检查它的两个参数,我们就会陷入无限循环,黑洞在 Haskell 行话中),被分成两部分.
splitter,然后第一个副本1
继续前进到输出点,而第二个副本1
回到过去*2
乘数,所得结果2
输入返回∪
这次在右边,无人反对左边的任何东西(此时已经是空的),并以同样的方式继续,所以2
到达输出点,然后4
, then 8
等等等等。
换句话说,S₂
包含所有元素{1}
;加上所有元素{1}
那个经历了*2
乘数一次;和两次;以及三次;等等——所有的权力2按递增顺序:
S2 = {1} ∪ 2*{1} ∪ 2*2*{1} ;; == {1, 2, 4, 8, 16, 32, ...}
∪ 2*2*2*{1}
∪ 2*2*2*2*{1}
∪ ..........
The two S₂
图中的 是相同的,因为我们在分流点从它吸取的任何东西都不会影响它。
这不是很有趣吗?
那么我们如何去添加的倍数3
到它?一种方法是
S23 = S2 ∪ 3*S23
{1} ----∪-->--->--S₂--.---S₂----∪-->--->--S₂₃--.--->S₂₃
/ \ / \
\______*2_______/ \______*3________/
---<----<--- ---<----<---
Here 1
from S₂
enters the second ∪
combiner and proceeds to the output point S₂₃
as well as back through the *3
multiplier, turning into 3
. Now the second ∪
has 2,4,8,...
and 3,...
as its inputs; 2
goes through as well as turning into 6
. Next, ∪
has 4,8,16,...
and 3,6,...
; 3
goes through. Next, 4
; etc., etc., and so on and so forth.
因此所有元素S₂
是一部分S₂₃
,但所有元素也是如此S₂
那个经历了*3
乘数一次、两次等等——所有的幂2 and 3按递增顺序相乘:
S23 = S2 ∪ 3*S2 ∪ 3*3*S2 ;; = S2 ∪ 3*( S2 ∪ 3*S2
∪ 3*3*3*S2 ;; ∪ 3*3*S2
∪ 3*3*3*3*S2 ;; ∪ 3*3*3*S2
∪ .......... ;; ∪ ........ ) !!
为什么顺序递增?如何?为什么,这就是责任∪
!你好,another 发现的需求。无论从任一侧进入它,它都必须先产生较小的元素,然后再产生较大的元素。
如果两者相等该怎么办?在这个方案中,我们是否需要关心这个问题?这会发生吗?
不可以。所以我们可以实施∪
here as a merge
,不作为union
(but 记住第一个发现的需求! ——现在还有效吗?需要吗?随着新病例的增加). Merge
应该比union
因为它不关心平等的情况。
对于的倍数5还?我们继续,作为
S235 = S23 ∪ 5*S235
{1} ----∪-->--->--S₂--.---S₂----∪-->--->--S₂₃--.---S₂₃----∪-->--->--S₂₃₅--.--->S₂₃₅
/ \ / \ / \
\______*2_______/ \______*3________/ \_______*5________/
---<----<--- ---<----<--- ---<----<---
- 这是否描述了书中的代码? _______
- 这是否描述了一个比书中的代码快大约两倍的代码? _______
- 为什么它比书中的代码快两倍左右? _______
- 这个回答有吗your问题? _______
- 这有帮助吗you回答你的问题吗? _______
(填空)。
也可以看看:
本书代码的信号处理框图是:
1 --->---\
cons-stream ->-- S ---.---> S
/----->---->--- *2 --->---\ / |
/ union ->--/ /
.-->-- *3 -->--\ / /
| union ->--/ /
.-->-- *5 -->--/ /
\ /
\__________<__________<__________<_________<_______________/
其中删除重复项的“联合”被称为merge
在书里。