Очень простое решение, которое я только что принял, состоит в следующем:
public class Sparse3DMatrix<T>
{
Dictionary<Tuple<int,int,int>, T> values = new Dictionary<Tuple<int, int, int>, T>();
public T this[int x, int y, int z]
{
get { return values[new Tuple<int, int, int>(x, y, z)]; }
set { values[new Tuple<int, int, int>(x, y, z)] = value; }
}
public bool ContainsKey(int x, int y, int z)
{
return values.ContainsKey(new Tuple<int, int, int>(x, y, z));
}
}
использование:
var test = new Sparse3DMatrix<float>();
test[1, 1, 1] = 1f;
Console.WriteLine(test[1, 1, 1]);
Это можно расширить с помощью методов, подобных тем, которые есть в его версии, и проверками наx, y, z
значения и т. Д.
Я уверен, что кто-то может что-то сказать о его производительности.Это будет достойная реализация, если вам действительно не нужно что-то для высокой производительности.Это зависит от реализации хеш-кода Tuple
и вашего конкретного использования.Если мы предположим, что хэши хороши, у нас будет O(1)
время поиска.Если вы знаете, что у вас будет много элементов, вы можете использовать new Dictionary<...>(initial capacity)
, чтобы избежать ненужного изменения размера при добавлении элементов.
В отличие от его , у него есть только один Dictionary
со всеми предметами.У его версии есть словари словарей.Преимущество его в том, что если вам нужно сканировать всю строку, вы можете просто выполнить итерацию словаря второго уровня (это не поможет вам, если вы хотите сканировать столбцы), что быстрее, чем поиск отдельных элементов.Но наличие одного словаря означает меньшее использование памяти, особенно когда в строке мало элементов.