【问题标题】:What data structure should I use for integer pairs?我应该为整数对使用什么数据结构?
【发布时间】:2015-07-29 16:46:06
【问题描述】:

我正在尝试优化我的代码以加快计算速度并减少内存消耗。我需要存储年份和成本的数据。目前我使用固定数组来保存值。

例如,我会有一个整数数组:

integer[0] = 0,  
integer[1] = 200,  
integer[2] = 0,  
integer[3] = 0,  
integer[4] = 200,  
integer[5] = 0,  
...   
integer[99] = 0

integer[0] = 0 表示 2015 年的成本为 0 美元,integer[1] = 200 表示 2016 年的成本为 200 美元,依此类推。由于我在内存中保存了数百万个这样的数组并用于计算,因此我希望最大限度地减少对内存和性能的影响。

为了澄清,我使用数据的方式是为了图表目的。一旦我将成本分配给年份,我就会根据它们所属的对象系列对数组进行汇总。然后我将它们显示在堆积条形图中。

有没有更好的方法来存储我的数据?我正在考虑键值列表,所以我只存储非零成本和年份,但我不知道这是否会有很大帮助。

【问题讨论】:

  • 最佳答案在很大程度上取决于您如何使用这些数据。你能详细说明一下吗?
  • @Diosjenin 我添加了一些信息。希望有帮助吗?
  • 确实如此。我在 Jacob 的回答中看到的唯一问题是 Dictionary 不会在内部保持元素按年份排序,因此您必须 a) 遍历字典并自己对它们进行排序(使用 LINQ 或自定义函数),或者 b ) 迭代已知年份并查看字典是否包含每年作为键。如果其中任何一个都是可接受的性能权衡,那么字典将适合您。如果没有,请告诉我们。

标签: c# arrays list data-structures key-value


【解决方案1】:

使用Dictionary<int, int>

var costs = new Dictionary<int, int> {
    { 2014, 150 },
    { 2016, 200 },
};

它不一定会占用更少的内存,但是可以避免存储空条目,并且数据的含义更加明显。

【讨论】:

  • 这是“我正在考虑键值列表”的示例。这也是一个很好的答案。
  • @AC 真正的改进在于可读性。像costByYear[2016] 这样的东西比costByYear[1] 更有意义。
  • @DStanley,O(1) 并不总是意味着更快,它只是意味着它可以很好地扩展。该恒定时间是非零的。使用字典的 O(1) 比使用数组的 O(1) 慢。这是我的主要观点。
  • 这将使用比数组更多的内存,并且性能会大大降低。虽然字典方法确实具有可读性的优势(即costByYear[2016]),但您可以使用costByYear[2016-baseYear] 使数组索引非常可读。
  • @A C - 由于您的数字很小,您可以考虑使用short 而不是int 来减少内存消耗。如果您想进一步减少它,那么您可以压缩数字,但性能也可能会下降。
【解决方案2】:

如果 (1) 您所做的只是求和,并且 (2) 不需要对任何给定值进行查找访问,而是简单地遍历它们,并且 (3) 您的值确实是稀疏的,

然后类似

integer[0] = 200,  
integer[1] = 200,  
...   

结合

year[0] = 2016,
year[1] = 2019,
...

将使您的内存占用最少,而不会降低效率。字典(哈希)消耗内存;数组对于内存占用来说是最经济的,如果您有一个可以假设省略年份的默认值 (0),则更是如此。但这仅在您不需要进行查找时才有效,因为使用这种结构是一个 O(n) 练习。

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多