问题:我有两种对象,我们称它们为Building
和Improvement
。大约有30个Improvement
实例,而可以有1-1000个Building
s。对于Building
和Improvement
的每个组合,我必须执行一些繁重的计算,并将结果存储在Result
对象中。Building
s和Improvement
s都可以用整数id表示。
然后我需要能够:
有效访问给定的Result
和Building
的Improvement
(编辑:请参阅下面的注释)
对给定Result
的所有Improvement
执行聚合,如.sum()和.average()
对于给定的Building
s,对所有Result
s执行相同的聚合。
这将发生在web服务器后端,因此内存可能是一个问题,但速度是最重要的。
目前的想法:
使用Building
和Improvement
作为键。这应该可以让我快速插入和单次查找,但我关心的是Dictionary<Tuple<int, int>, Result>
和<BuildingID, ImprovementID>
性能。
使用二维数组,一维表示.Where()
s,一维表示.Sum()
s,BuildingID
作为值。另外,构建两个ImprovementID
将Result
s和Dictionary<int, int>
s映射到各自数组行/列索引。这可能意味着最大1000+BuildingID
s,这会有问题吗?
使用ImprovementID
。我认为这可能是效率最低的,有o(n)插入,尽管我可能是错的。
我是不是错过了一个更好的选择?
编辑:我只对聚合值(perDictionary
和perList<Tuple<int, int, Result>>
)感兴趣;请看我的答案。
最佳答案
一般来说,字典的查找效率最高。当通过密钥访问时,查找效率和操作效率都是常数o(1)。这将有助于进入,第一点。
在第二个和第三个步骤中,您需要遍历所有项o(n),因此无法加快速度,除非您希望按指定的顺序o(n*n)遍历这些项,然后您可以使用sorteddictionray o(n),但会影响查找和操作效率(o(logn))。
所以我会用你发布的第一个解决方案。