Что такое структура данных Zipper и нужно ли мне ее использовать? - PullRequest
43 голосов
/ 19 декабря 2008

Вопрос прост: я не могу понять структуру данных Zipper .

Мой вопрос связан с использованием дерева.

Я хочу понять, как я могу изменить узел дерева с помощью молнии. И как не копировать целое дерево (или большую его часть).

Пожалуйста, уточните, если я не так с молнией. Может быть, это не может помочь с обновлением дерева?
Или, может быть, можно обновить дерево, а я просто не вижу пути?

Ответы [ 4 ]

51 голосов
/ 19 декабря 2008

Начнем с Zipper-аналога для списков. Если вы хотите изменить n-й элемент списка, для этого потребуется O (n), потому что вы должны скопировать n-1 первых элементов. Вместо этого вы можете сохранить список как структуру ((первые n-1 элементы обращены), n-й элемент (оставшиеся элементы)). Например, список (1 2 3 4 5 6), изменяемый на 3, будет представлен как ((2 1) 3 (4 5 6)). Теперь вы можете легко изменить 3 на что-то другое. Вы также можете легко перемещать фокус влево ((1) 2 (3 4 5 6)) и вправо ((3 2 1) 4 (5 6)).

Молния - это та же идея, что и деревья. Вы представляете определенный фокус в дереве плюс контекст (вплоть до родителей, вплоть до детей), который дает вам все дерево в форме, где его легко изменить в фокусе и легко перемещать фокус вверх и вниз.

12 голосов
/ 19 декабря 2008

Вот очень хорошая статья, объясняющая использование молнии для оконного менеджера тайлинга в Haskell . Статья в Википедии не очень хорошая ссылка.

Короче говоря, застежка-молния - это указатель или указатель на определенный узел в структуре дерева или списка. Молния дает естественный способ взять древовидную структуру и обращаться с ней так, как будто дерево было «подобрано» сфокусированным узлом - по сути, вы получаете второе дерево, не требуя дополнительных копий, сделанных из исходного дерева, и не влияя на других пользователей дерево.

В приведенном примере показано, как у вас окна изначально отсортированы по местоположению на экране, а затем для моделирования фокуса вы используете молнию, направленную на окно фокуса. Вы получаете хороший набор операций O (1), таких как вставка и удаление, без особого случая окна фокуса или написания дополнительного кода.

5 голосов
/ 10 августа 2013

Learn You a Haskell также имеет отличную главу о молниях .

2 голосов
/ 20 декабря 2008

Эта статья относится к Haskell, но она также достаточно хорошо объясняет молнии, и ее следует легко абстрагировать от специфики Haskell.

...