Data structures 拉链数据结构是什么?我应该使用它吗?

Data structures 拉链数据结构是什么?我应该使用它吗?,data-structures,functional-programming,theory,zipper,Data Structures,Functional Programming,Theory,Zipper,问题很简单:我无法理解数据结构 我的问题与它在树上的用途有关 我想了解如何使用拉链更改树节点。以及如何不复制整棵树(或其大部分) 请澄清一下我的拉链是否有问题。可能它无法帮助更新树? 或者,也许可以更新树,但我看不见路?让我们从列表的拉链模拟开始。如果要修改列表的第n个元素,则需要O(n),因为必须复制前n-1个元素。相反,您可以将列表保持为一个结构((前n-1个元素颠倒)第n个元素(其余元素))。例如,可在3处修改的列表(123456)将表示为((211)3(456))。现在,您可以轻松地将3

问题很简单:我无法理解数据结构

我的问题与它在树上的用途有关

我想了解如何使用拉链更改树节点。以及如何不复制整棵树(或其大部分)

请澄清一下我的拉链是否有问题。可能它无法帮助更新树?

或者,也许可以更新树,但我看不见路?

让我们从列表的拉链模拟开始。如果要修改列表的第n个元素,则需要O(n),因为必须复制前n-1个元素。相反,您可以将列表保持为一个结构((前n-1个元素颠倒)第n个元素(其余元素))。例如,可在3处修改的列表
(123456)
将表示为
((211)3(456))
。现在,您可以轻松地将3更改为其他内容。您还可以轻松地将焦点向左移动
((1)2(3 4 5 6))
和向右移动
((3 2 1)4(5 6))


拉链也适用于树木。您在树中表示一个特定的焦点,再加上一个上下文(从上到父,从下到子),它以一种形式为您提供了整个树,在该形式下,可以在焦点处轻松修改焦点,并且可以轻松地上下移动焦点。

这是一篇很好的解释文章。维基百科的文章不是很好的参考资料

简而言之,拉链是指向树或列表结构中特定节点的指针或句柄。拉链提供了一种获取树结构的自然方式,并将其视为被聚焦节点“拾取”的树-实际上,您可以获得第二棵树,而不需要对原始树进行额外的复制,也不会影响树的其他用户


给出的示例显示了如何按屏幕上的位置对窗口进行初始排序,然后使用指向焦点窗口的拉链对焦点进行建模。您可以获得一组很好的O(1)操作,例如插入和删除,而无需对焦点窗口进行特殊处理或编写其他代码。

与Haskell有关,但它也很好地解释了Zipper,应该很容易从Haskell的细节中提取出来。

了解Haskell也有。

我不知道,但维基百科上的那篇文章完全令人费解。因此产生了混乱,我的意思是,它澄清了“拉链”结构,但没有说明更新方法。等等,我如何反转树?嗯,对于树,它不是完全反转的。拉链集中在树的某个节点上,由该节点的子节点和该节点的上下文(带孔的树而不是节点)组成。参见@namin:one疑问:为什么我们需要反转第一个
n-1
元素?我完全不知道这有什么用。请解释一下。@eSKay:这是一个深思熟虑的问题。如果获取列表中的任何元素需要固定的时间,则不需要这样做。但通常情况下,列表的头部和其他部分都有基本的访问器,因此颠倒前n-1个元素的基本原理很清楚:您很快就想得到前一个元素,这样它就是头部。我得到了403个链接,这是同一篇文章的更新链接: