存储部分更改数组的时间序列的最有效数据结构是什么?

时间:2010-09-30 06:13:33

标签: data-structures core-data time time-series series

我的问题是我有一个大小为N的对象数组。每次(t + 1)之后,数组的某些值可能会也可能不会改变。所以我们说t + 1索引15改变但其他一切都保持不变。

除了拥有一系列数组之外,最有效的方法是存储这样的东西(在内存中)?我希望能够以最有效的方式获取数组的所有值,比如说getValues(长时间)。

说4个阵列

时间1 空值 空值 空值 XYZ

时间2 空值 空值 ABC xyz

(请注意,此处仅更改了abc)但我们仍然保留最后一个索引的值,从时间1开始。

1 个答案:

答案 0 :(得分:3)

你所要求的在学术CS领域被称为“部分持久阵列”。有关持久性的更多信息,请参阅the survey of Kaplan

一个简单的解决方案是使用搜索树而不是数组。您可以使用纯功能平衡搜索树来保证每次读取或写入都需要O(lg n)最坏情况时间(其中n是数组的大小),而不是O(1)时间。 (如果将时间戳版本保留在可扩展阵列中,则添加新版本将进行O(1)摊销,并且访问旧版本为O(1)最坏情况。)

如果您不熟悉纯功能搜索树,可以阅读this introduction to Clojure's persistent arrays。它们是纯函数树索引的固定宽度整数(以trie的形式),因此具有固定的深度。对于您的问题,这可能是最快的解决方案,包括最坏情况和现实世界。

在最坏的情况下,我所知道的唯一其他部分持久数组可能需要更长时间。如果以各种受限制的方式访问数组,一些具有更好的摊销复杂性,一些具有更好的预期复杂性。