Вдохновленный недавним вопросом о 2d сетках в Haskell, мне интересно, можно ли создать двумерную молнию для отслеживания позиции в списке списков. Одномерная молния в списке позволяет нам эффективно перемещаться локально в большом списке (обычный пример - текстовый редактор). Но давайте говорить, что мы имеем второе измерение, как это:Двумерная молния
grid =
[[ 1, 2, 3, 4, 5]
,[ 6, 7, 8, 9,10]
,[11,12,13,14,15]
,[16,17,18,19,20]
,[21,22,23,24,25]]
Можем ли мы создать какую-то структуру данных молнии эффективно двигаться не только влево и вправо, но вверх и вниз в сетке здесь? Если да, то что, если мы заменим список списков бесконечным списком бесконечных списков, можем ли мы по-прежнему эффективно двигаться?
«Одним из ключевых аспектов, как застежки-молнии работы является то, что они представляют собой место в структуре по пути, используемой для достижения его». Почему у этого уникального пути есть ключевое требование для молнии?Я бы подумал, что любой способ представления «местоположения» в структуре данных будет достаточным –
@AnupamJain: поскольку фрагменты, используемые для перестройки, являются частями исходной, неизменяемой структуры, если один из них содержит другой путь к «тому же», местоположение, когда вы его собираете, этот путь по-прежнему будет иметь исходное значение. Единственный способ справиться с этим - это спуститься по обоим путям и выполнить обе замены, т. Е. Рассматривать оба пути вместе как «уникальный» путь. –
@AnupamJain: чем больше избыточных путей, тем больше неэффективности вы создаете. Наихудший сценарий - это что-то вроде циклического списка, где есть бесконечное количество путей, и каждый путь содержит всю структуру, которая заставляет вас перестраивать все. –