Проблема
Мне было интересно, как это можно было бы сделать эффективно на некоторое время, но по какой-то причине я не смог этого сделать. Мне нужно смоделировать прямоугольную сетку, где каждое поле содержит некоторые данные.
Мне нужно получить к нему доступ через застежку-молнию, где мой фокус - это поле (значение, так сказать). Застежка-молния должна поддерживать действия goDown
, goUp
, goLeft
и goRight
, каждый из которых меняет фокус на поле в указанном направлении, а также here
, который должен возвращать значение поля в настоящее время в фокусе.
Хотя это можно сделать с помощью Map
, это неэффективно в том смысле, что изменение фокуса займет log n
time, n
- количество элементов в Map
, так как a Map
имеет логарифмическое время поиска.
Мне нужно, чтобы указанные действия работали в O(1)
.
Пример
Для иллюстрации рассмотрим приведенную ниже матрицу. Число в скобках - это текущий фокус.
1 (2) 3
4 5 6
7 8 9
Если я применил goRight
, я должен получить:
1 2 (3)
4 5 6
7 8 9
Если я применил here
сейчас, возвращаемое значение должно быть 3
.
Вопрос
Как бы тип данных в форме, описанной выше, выглядел в haskell? Возможно ли это как алгебраический тип данных?
Помните, что изменение фокуса во всех четырех направлениях должно выполняться в O(1)
времени, а также чтение значения, которое в настоящее время находится в фокусе.