我(几乎)完全理解树的Zipper数据结构.但是,在一些出版物中,我看到了一些暗示,也可以使用Zipper的想法为任意图形创建不可变的函数数据结构(也可能有周期).
这样做的方法是什么?
只要我们有循环,就意味着可以通过多个路径到达任何节点.因此,如果我专注于一个节点,对它进行一些更改,并将焦点移开,我可能稍后通过不同的路径返回到同一节点,这意味着它将是节点的"旧"版本,在改变之前.
我想出的唯一解决方案是在上下文中包含任何节点的更改列表.每次在焦点更改为节点X之前,应检查X是否是更改列表的成员,如果是,则应将其视为焦点节点.
如果我们还跟踪N节点X从更改列表中复制的次数,我们可以从更改列表中删除X,只要N =边数,向内到X.
有没有更好的方法呢?
想分享一个我运行的简单实验,在 Win 10 下使用 node.js v6.11.0。
目标。在内存占用方面比较数组与对象。
代码。每个功能reference,twoArrays,matrix并objects创建两个相同尺寸的阵列,含有随机数。他们以稍微不同的方式组织数据。
reference 创建两个固定大小的数组并用数字填充它们。
twoArrays 通过推送填充两个数组(因此解释器不知道最终大小)。
objects 通过推送创建一个数组,每个元素是一个包含两个数字的对象。
matrix 创建一个两行矩阵,也使用推送。
const SIZE = 5000000;
let s = [];
let q = [];
function rand () {return Math.floor(Math.random()*10)}
function reference (size = SIZE) {
s = new Array(size).fill(0).map(a => rand());
q = new Array(size).fill(0).map(a => rand());
}
function twoArrays (size = SIZE) {
s = [];
q = [];
let i = 0;
while (i++ …Run Code Online (Sandbox Code Playgroud) javascript arrays memory-management node.js javascript-objects