5

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

除了当然只有一个数组之外,存储这样的东西(在内存中)的最有效方法是什么?我希望能够以最有效的方式随时获取数组的所有值,例如 getValues(long time)。

说4个阵列

时间 1 null null null xyz

时间 2 null null abc xyz

(注意这里只有 abc 改变了)但我们仍然保留从时间 1 开始的最后一个索引的值。

4

1 回答 1

4

您所要求的在学术 CS 领域被称为“部分持久数组”。有关持久性的更多信息,请参阅Kaplan 的调查

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

如果您不熟悉纯函数式搜索树,您可以阅读Clojure 持久数组的介绍。它们是纯功能树索引的固定宽度整数(以 trie 的形式),因此具有固定深度。这可能是您的问题的最快解决方案,无论是最坏情况还是现实世界。

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

于 2010-10-03T14:43:30.250 回答