некоторые из моих мыслей:
Массив предназначен для доступа через индексацию.Если вы используете массив для хранения ваших данных, то доступ к ним с помощью индексации является наиболее удобным способом.
Вам нужна структура данных, в которой элемент знает, где находятся его соседи.Эта структура данных не является простым массивом.Вы можете спроектировать такую структуру данных, увеличив массив:
type NArray(A: int [,]) =
member x.Item with get (i,j) = (A.[i,j], i, j, A)
, и вы также можете явно добавить четырех соседей к элементу:
type NArray(A: int [,]) =
let get i j di dj =
let newI = i + di
let newJ = j + dj
if newI < 0 || newI > A.GetLength(0) then None
elif newJ < 0 || newJ > A.GetLength(1) then None
else Some (A.[newI, newJ])
member x.Item with get (i,j) = (A.[i,j], get i j 0 1, get i j 0 -1, get i j 1 0, get i j -1, 0)
Та же проблема возникает припоследовательность или список, чтобы знать своих соседей.Они предназначены, чтобы не знать.Если элемент в списке знает свой предыдущий узел, то он больше не является одним связанным списком.
Когда вы выбираете структуру данных, вы наследуете ее преимущества и краткость.Для массива вы получаете быструю индексацию, в то время как его элементы сами не имеют представления о положении.Другие структуры данных, скажем, резьбовые двоичные деревья или двойные связанные списки, их элементы знают, где они находятся.Но цена в том, что используется больше памяти.