我有一个非常稀疏的静态数组,其中4个维度为8192,我想从(C#)进行查找。这些4.5 * 10 ^ 15值中只有68796个非零。什么是最快的方法,速度和低内存使用是至关重要的?
由于
答案 0 :(得分:7)
首先,我认为普通数组显然是你问题的错误数据结构。
如何使用dictionary来使用4 - tuple作为索引?
var lookup = new Dictionary<Tuple<int,int,int,int>, int>();
我自己从未这样做过,但它应该可以正常工作。如果您没有准备好Tuple
,因为您正在使用.NET 4之前的.NET Framework版本,那么您可以提供自己的索引类型:
struct LookupKey
{
public readonly int First;
public readonly int Second;
public readonly int Third;
public readonly int Fourth;
…
}
var lookup = new Dictionary<LookupKey, int>();
答案 1 :(得分:1)
您可以使用普通Dictionary
或创建一个适合您需要的类似地图(它将是一个数组,您可以根据您在4个值上计算的哈希值来放置元素)但是您需要关心碰撞。
如果您接受查找的对数复杂度,那么二进制搜索树也可以成为技巧。
答案 2 :(得分:0)
使用哈希表(泛型词典已经实现为Hashtable)。作为4维索引的关键使用向量。作为价值存储你想要的东西。
答案 3 :(得分:0)
我要做的是使用哈希列表而不是“普通”数组,然后(伪代码):
// first, check bounds:
if(x < 0 || y < 0 || z < 0 || w < 0
|| x > xsize || y > ysize || z > zsize || w > wsize)
throw new Whatever(...);
// now return value if != 0
if(x in arr && y in arr[x] && z in arr[x][y] && w in arr[x][y][z])
return arr[x][y][z][w];
else
return 0;
答案 4 :(得分:0)
我认为最好的方法是使用哈希表(Dictionary<T, int>
),使用包含4个索引的自定义struct
编制索引。不要忘记覆盖object.Equals()
上的object.GetHashCode()
和struct
。