There was an error while loading. Please reload this page.
1 parent e257a16 commit 1a42f57Copy full SHA for 1a42f57
Design/1146.Snapshot-Array/Readme.md
@@ -0,0 +1,9 @@
1
+### 1146.Snapshot-Array
2
+
3
+最直观的想法就是给每个元素设立快照,即snaps[index]记录了关于index这个元素所有的{snapId, val}。
4
5
+接下来我们需要考虑一个效率的问题。我们每调用一次snap()是否需要给每个元素都新建一次快照呢?显然如果大多数元素都没有更新过的话,再添加一次快照的效率不高。所以我们可以设置一个changed的集合,里面只存放上一次snap()之后变动过的元素,也就是被set()过的元素。
6
7
+这样的话,我们会发现对于每个元素而言,它被记录的snapId并不是连续的。比如说snaps[index]={{1,4},{3,8}},即该元素在第一次拍快照时的值是4,第三次拍快照时的值是8. 那么我们在第二次拍快照的时候,该元素的值是什么呢?显然哪个时候它的值应该是与snapId==1时的值是一样的。所以我们应该在snaps[index]里面找到最后一个小于等于snapId的那个时间戳。
8
9
+此外还有一个细节,每个元素的初始值是0,我们也应该给它虚拟地加一个快照,它的snapId可以认为是-1.
0 commit comments