精简版:
我有一个 List 对象,其中包含许多重复值(双精度值),这些重复值存在于重复值的运行中,其中穿插着不断变化的值。我想在不损害索引和值之间的关联的情况下减少此 List 对象占用的内存空间。我还想使用索引作为查找,尽可能保持接近 O(1) 的算法查找时间。例如,如果您有一个包含元素 {0, 0.1, 0.1, 0.1, 0.2} 的列表,那么如果给定索引 1,2 或 3,新对象/实体将始终返回 0.1。我希望我需要创建我自己的对象(可能实现 IList),或使用现有的对象。我对如何实现这一点有一个想法,这将使算法成为 O(log(m)),其中 m 是相同值的运行次数(在我的示例中,只会有 1 次运行)。但是,如果可能的话,我宁愿不自己动手。
C# 是否存在这样的对象,还是我需要自己动手?
动机/长版:
我有一个桌面应用程序正在做一些繁重的科学计算。计算会生成大量数据,并且这些数据是根据时间组织的。也就是说,对于时间 50,存在变量 x、y 和 z 的值。对于时间 51,变量 x、y 和 z 有另一个值。我有一个列表,其中包含计算运行的所有时间。每个变量都有一个 List,其索引与时间 List 的索引相同。也就是说,如果您查看时间数组的索引 234,您可能会得到时间 46(秒)。然后将在该变量的列表的索引 234 处找到每个变量在时间 46(秒)的计算。
大约有 100,000 个这样的变量(因此有 100,000 个列表),但只有一个列表。我还希望添加更多变量。这显然是一个内存问题。(目前至少有大约 200 MB 的原始空间 :-))。这也应该可以解释为什么我要使用索引作为在某个时间找到某个变量的值的方法。
一个变量在前 x 个插槽中只有 0 是相当典型的。或者在索引 y 之后,变量保持不变直到结束。我想说,值恒定的周期数的最坏情况可能是单个列表中的 30 左右,但更通常在 2 到 5 之间。每个数组中的总值的数量通常可能在 250 左右。
编辑:
请注意,我希望添加比 100,000 更多的变量,所以这是比 200 MB 更大的问题。为了解释这样做的更多动机,我的应用程序目前以大约 1+ GB 的速度运行,我认为 200 MB 是减少内存使用量的唾手可得的成果。
编辑2:
我意识到对我的解释进行了非常重要的编辑-我在上面进行了编辑并在此处进行了解释。列表可能在其中运行,但它们也有值从索引更改为索引的部分。因此,我可能拥有的一个更好的列表示例如下:
0 0 0 0 0 0 ....(50 个重复的 0)...0.1 0.2 0.4 0.5 0.6 ...(50 个变化值)... 200.45 200.45 200.45 200.55 ...(50 个重复值).. .. ETC。