一個非常簡單的解決辦法是這樣的:
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
與所有項目。他的版本有詞典的字典。他的好處是,如果你必須掃描整行,你可以迭代二級字典(這不會幫助你,你想掃描列),這比單獨查找項目更快。但使用單個詞典意味着更小的內存使用量 - 尤其是當您每行只有很少的項目時。
你的用例是什麼? 3D圖形的變換矩陣? – Alnitak 2011-03-31 12:07:39
nop,只是在問題中添加了詳細信息。 – HuseyinUslu 2011-03-31 13:15:38
對,所以它是一個稀疏的體素矩陣。 30M是細胞總數還是填充細胞數量? – Alnitak 2011-03-31 13:24:12