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

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

我的问题是关于它与树的使用。

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

请澄清,如果我错了拉链。 也许它不能帮助树更新?
或者,也许,有可能更新树,我只是不能看到的方式?

让我们从列表的拉链模拟开始。 如果您想要修改列表的第n个元素,则需要O(n),因为您必须复制n-1个第一个元素。 相反,您可以将列表保留为一个结构((前n-1个元素颠倒)第n个元素(其余元素))。 例如,在3可以修改的列表(1 2 3 4 5 6)将被表示为((2 1) 3 (4 5 6)) 。 现在,你可以很容易地把3改成别的东西。 ((1) 2 (3 4 5 6))和右((3 2 1) 4 (5 6))也可以轻松移动焦点。

拉链是适用于树木的相同的想法。 你在树上加上一个上下文(一直到父母,一直到孩子)都是一个特定的焦点,它把整棵树以一种容易在焦点上修改的forms给予你,而且很容易上下移动焦点。

这是一篇非常不错的文章,解释了如何使用Haskell中的平铺窗口pipe理器的拉链 。 维基百科文章不是一个很好的参考。

简而言之,拉链是指向树或列表结构中特定节点的指针或句柄。 拉链提供了一个自然的方式来采取一个树结构和对待它,就好像这棵树被“聚焦”的节点“拾起” – 实际上,你得到了第二棵树,而不需要额外的原树复制或影响其他用户那个树。

给出的例子显示了你如何拥有最初按屏幕上的位置sorting的窗口,然后使用指向焦点窗口的拉链build模焦点。 你可以得到一组很好的O(1)操作,比如插入和删除,而不必特殊指定焦点窗口或者编写额外的代码。

学习你一个Haskell也有一个关于拉链的伟大篇章 。

本文与Haskell有关,但它也很好地解释了拉链,应该很容易从Haskell细节中抽象出来。