允许对密切相关的序列公共子序列进行有效相等性检查的数据结构

问题描述

我正在寻找可用于以下示例中的 Snapshot(序列)的数据结构:

val oldSnapshot = Snapshot(3,2,1)
val newSnapshot = 4 +: (oldSnapshot dropRight 1) // basically a shift

// newSnapshot is Now passed to another function that also kNows the old snapshot

// this check should be fast if true
if (newSnapshot.tail == (oldSnapshot dropRight 1))         

背景:我需要一个不可变的数据结构来存储流中出现的最后 n 个项目的快照。当一个新项目出现在流中并且最旧的项目被删除时它会更新,因此长度总是最多 n 并且快照类似于最后一个 n 上的滑动窗口元素。在极少数情况下,流可以中断并重新启动。在重新启动的情况下,流首先发出至少 n 个旧元素,然后再继续发出新的“活动”元素。但是,有些元素可能会有所不同,因此我无法确定是否可以通过附加新元素从旧快照派生出最近历史记录的新快照。

我还有一个组件,它使用这些快照流并对元素进行一些增量处理。例如,它可能会跟踪元素的总和。对于新快照,它必须决定它是通过将一个还是几个元素附加到最后一个已知快照的末尾(并删除最旧的元素)来派生的,因此它不必再次处理所有旧项目但可以重用一些中间结果。

到目前为止,最常见的情况是快照被转移以包含一个新元素,而最旧的元素被删除。这种情况应该很快就被识别出来。如果我要跟踪元素的整个历史而不删除最旧的,我可以使用 List 并将新列表的 tail 与最后一个已知列表进行比较。在内部,它会比较对象标识,并且在大多数情况下,这足以看出列表是相同的。

我正在考虑对快照使用 Vector 或类似的数据结构,我想知道这种比较是否也能保证在这个意义上是有效的,或者是否有更合适的数据内部使用对象标识检查子集合以快速确定两个实例是否相同的结构。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)