我将3D数组表示为稀疏矩阵,键为Tuple<int, int, int>
,其中元组中的每个值都是i, j, k
矩阵索引之一。
现在我想了解一下。例如,我想要Key.Item1
具有给定索引的所有值。
是否可以在不迭代所有字典键的情况下获取这些值?
作为奖励,是否有另一种数据结构(除了字典)来表示C#中的多维稀疏数组,以便这些切片操作更直接?
答案 0 :(得分:1)
是的,这是可能的。
如果您真的想要字典,请使用有序字典。将订单定义为Item1*1000000+Item2*1000+Item3
之类的简单计算。大小允许你做一些模数学来遍历你想要的维度(我任意选择因子,因为我不知道你的宇宙的大小)。
要获取所有 Item2 元素,您可以进行二进制搜索,其中&#34;找到&#34;表示包含 Item2 的第一个计算值。从那里向前走和,直到你的元素不再包含 Item2 。那是你的结果集。你对元组中的其他项做同样的事情。
在字典之外,一个可逆的 trie 的整数, Item2 的列表可以为您提供所需的内容。搜索单个元组意味着从trie的顶部开始并向下走;对于 Item3 ,从底部开始向上走。对于 Item2 ,请从第二个列表中的目标 Item2 值开始,并为其他项目执行一次查找。
查找元组的所有一维的算法与上面相同,但是下一级访问所有项而不是查找一个。
答案 1 :(得分:0)
可能有一个更好的结构,但您可以使用List<Tuple<int, int, int, double>>
而不是字典,并按您要切片的尺寸对其进行排序。然后您可以二进制搜索以找到所需的切片。当然,只有当你总是按相同的尺寸切片时,这才有效。