我刚刚提出的一个非常简单的解决方案是这样的:
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));
}
}
usage:
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
与所有物品。他的版本有词典的词典。他的好处是,如果您必须扫描整行,您可以只迭代二级字典(如果您想扫描列,这对您没有帮助),这比单独查找项目更快。但是拥有一个字典意味着更少的内存使用 - 特别是当每行只有很少的项目时。