切片由Dictionary, double>表示的稀疏数组不列举所有的键:这可

本文关键字:int 这可 double Dictionary 表示 切片 Tuple 数组 | 更新日期: 2023-09-27 18:17:10

我将一个3D数组表示为一个稀疏矩阵,键为Tuple<int, int, int>,其中元组中的每个值是i, j, k矩阵索引之一。

现在我想分一杯羹。例如,我想要Key.Item1具有给定索引的所有值。

是否有可能在不迭代所有字典键的情况下获得这些值?

作为奖励,是否有另一种数据结构(除了字典)来表示c#中的多维稀疏数组,以便这些切片操作更直接?

切片由Dictionary<Tuple<int, int, int>, double>表示的稀疏数组不列举所有的键:这可

是可能的。

如果你真的需要一个字典,那就使用有序字典。将顺序定义为像Item1*1000000+Item2*1000+Item3这样的简单计算。大小允许您做一些模运算来遍历您想要的维度(我任意选择因子是因为我不知道您的宇宙的大小)。

要获得所有Item2元素,您将执行二进制搜索,其中"found"表示包含Item2的第一个计算值。从那里您向前走和向后走,直到您拥有不再包含Item2的元素。这就是你的结果集。对元组中的其他项执行相同的操作。

在字典之外,一个可逆的 int数组和一个Item2列表可以得到你想要的。搜索单个元组意味着从树的顶部开始,然后往下走;对于Item3,从底部开始,向上走。对于Item2,从第二个列表中的目标Item2值开始,并对其他项分别执行一次查找。

查找元组的所有一个维度的算法与上面相同,但下一级访问所有项而不是查找一个。

可能有更好的结构,但是您可以使用List<Tuple<int, int, int, double>>而不是字典,并根据将要切片的维度对其进行排序。然后你可以进行二分搜索来找到你想要的切片。当然,这只适用于你总是按相同的维度切片