问题:我有两种对象,我们称它们为BuildingImprovement。大约有30个Improvement实例,而可以有1-1000个Buildings。对于BuildingImprovement的每个组合,我必须执行一些繁重的计算,并将结果存储在Result对象中。
Buildings和Improvements都可以用整数id表示。
然后我需要能够:
有效访问给定的ResultBuildingImprovement(编辑:请参阅下面的注释)
对给定Result的所有Improvement执行聚合,如.sum()和.average()
对于给定的Buildings,对所有Results执行相同的聚合。
这将发生在web服务器后端,因此内存可能是一个问题,但速度是最重要的。
目前的想法:
使用BuildingImprovement作为键。这应该可以让我快速插入和单次查找,但我关心的是Dictionary<Tuple<int, int>, Result><BuildingID, ImprovementID>性能。
使用二维数组,一维表示.Where()s,一维表示.Sum()s,BuildingID作为值。另外,构建两个ImprovementIDResults和Dictionary<int, int>s映射到各自数组行/列索引。这可能意味着最大1000+BuildingIDs,这会有问题吗?
使用ImprovementID。我认为这可能是效率最低的,有o(n)插入,尽管我可能是错的。
我是不是错过了一个更好的选择?
编辑:我只对聚合值(perDictionary和perList<Tuple<int, int, Result>>)感兴趣;请看我的答案。

最佳答案

一般来说,字典的查找效率最高。当通过密钥访问时,查找效率和操作效率都是常数o(1)。这将有助于进入,第一点。
在第二个和第三个步骤中,您需要遍历所有项o(n),因此无法加快速度,除非您希望按指定的顺序o(n*n)遍历这些项,然后您可以使用sorteddictionray o(n),但会影响查找和操作效率(o(logn))。
所以我会用你发布的第一个解决方案。

09-11 19:28