极稀疏数组的实现

时间:2010-10-24 13:28:34

标签: c# arrays sparse-matrix

我有一个非常稀疏的静态数组,其中4个维度为8192,我想从(C#)进行查找。这些4.5 * 10 ^ 15值中只有68796个非零。什么是最快的方法,速度和低内存使用是至关重要的?

由于

5 个答案:

答案 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