我有一个包含一些重复值(双的)中存在的与奔跑穿插重复值的运行列表对象改变价值。我想减少这个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,其索引与时间列表的索引相同。也就是说,如果您查看时间数组的索引234,则可能会得到时间46(秒)。然后,在时间46(秒)的每个变量的计算将在该变量的列表的索引234处找到。
大约有100,000个这样的变量(因此有100,000个列表),但只有一次列表。我也期望增加更多的变量。这显然是一个记忆问题。 (目前至少有200 MB左右的原始空间:-))。这也应该解释为什么我想使用索引作为在特定时间查找某个变量的值的方法。
变量在前x个插槽中只有0的情况是相当典型的。或者在索引y之后,变量保持不变直到结束。我想说的是,对于值恒定的期间数的最坏情况,可能在单个列表中约为30,但更通常在2和5之间。每个阵列中的总值的数量通常可以是约250.
编辑:
请注意,我期望添加更多的变量比100,000,所以这是比只有200 MB更大的问题。为了解释更多的动机,我的应用程序目前运行在大约1 GB以上,并且我看到200 MB作为降低内存使用率的低成本成果。
EDIT2:
我认识到一个非常重要的编辑对我explanation-我上面editted它和这里解释。这些列表可能会在其中运行,但它们也具有值从索引变为索引的部分。因此,我可能列出的一个更好的示例是:
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更多重复值)....等
使用二进制查找的排序列表可能对您有用... – Lucas 2013-03-25 19:34:51
跳过列表会给您O(log n)查找时间。我在C#中发布了一个跳过列表实现。请参阅http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=876。但是,跳过列表的开销可能会否定短列表的压缩节省。 – 2013-03-25 20:17:22