Skip to content

Commit

Permalink
fix: 修复算法错误
Browse files Browse the repository at this point in the history
  • Loading branch information
ascoders committed Apr 22, 2021
1 parent 70468ea commit 542faaf
Showing 1 changed file with 7 additions and 11 deletions.
18 changes: 7 additions & 11 deletions 前沿技术/192.精读《DOM diff 最长上升子序列》.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,23 +126,19 @@

最后我们看看,如何在找到答案的同时,还能找到正确的序列呢?

其实读到这里,不用说你应该也能猜出来,前面已经说过了,**只要替换了最后一个或者插入的时候,栈顺序就是正确的**。所以我们可以在替换最后一个或者插入的时候,存储下当前栈的拷贝,这样最后留下来的拷贝就是最终正确的顺序。
### 找出正确的序列

那为什么是这样呢?我们最后用一个例子强化一下理解,因为已经很熟练了,因此前几步合并了一下
找出正确的序列并不容易,让我们看下面这个情况

<img width=400 src="https://img.alicdn.com/imgextra/i3/O1CN01Mi7fPY1FLlDhiuGSC_!!6000000000471-2-tps-1200-344.png">
<img width=450 src="https://img.alicdn.com/imgextra/i2/O1CN01DXI8Cm1Uh1qjYGtEM_!!6000000002548-2-tps-1208-486.png">

到目前为止,`7, 8, 9, 13` 是不存在的,但实际上它指代的是 `10, 11, 12, 13`,这个前面已经解释过,就不再赘述。我们此时已经存了队列 `10, 11, 12, 13`,因此此时结束的话,这个队列输出是正确的。我们看下一步
贪心算法结束后,总长度是对的,但很明显顺序还是错的。为了方便计算,我们存储时转化为下标

<img width=400 src="https://img.alicdn.com/imgextra/i1/O1CN01ZtAMAR1V30rKrchB2_!!6000000002596-2-tps-1204-444.png">
<img width=450 src="https://img.alicdn.com/imgextra/i3/O1CN01tflKTQ1soP0NpnIiu_!!6000000005813-2-tps-1216-716.png">

为了方便识别,我给不同分组数字加了背景色,这样更容易观察:我们发现,由于每次替换的都是比它稍大的数字,一旦遇到了一个更小的开始 `1, 2, 3, 4, 5`,即便上一轮 `7, 8, 9` 还没有完全替换完 `10, 11, 12, 13`,更小的也一定从最左边开始替换,因为栈内数字是单调递增的。那么全部替换完,或者从某个数字开始,向右替换完,此时队列中的数字一定都是相对顺序正确的。从这里例子来看,`2, 3` 一定会优先替换掉 `8, 9`,等 `13` 被替换的时候,栈的相对顺序一定符合原数组的相对顺序。
并且使用二维数组存储,这样被替换的数字可以被保留下来。当计算完毕后,我们从最后一位开始向前查找,**一旦发现一个值不是单调递减的,就向数组上方继续查找,直到首节点。**

最后看一个更复杂的例子加深印象:

<img width=400 src="https://img.alicdn.com/imgextra/i1/O1CN01GXWX6G1jaoiMJWC9h_!!6000000004565-2-tps-1102-768.png">

读到这里,恭喜你已经大功告成,完全理解这个 DOM diff 算法啦。
因此上面的例子,最终顺序下标是 `[0, 1, 2, 3, 4, 5, 9]`,对应数字为 `[10, 20, 30, 40, 50, 60, 61]`**而且这个数字是潜力最大的最长子序列。**

## 总结

Expand Down

0 comments on commit 542faaf

Please sign in to comment.