我们有两个离线系统,它们通常无法相互通信。这两个系统都维护着同一个有序项目列表。它们只有在极少数情况下才能相互通信以同步该列表。
为了检测编辑,项目标记有修改时间戳。为避免在插入新项目时发生冲突(而不是使用自增整数),项目由UUID进行标识。在同步时,会检测到新的UUID并将其复制到另一个系统中。删除也是如此。
上述数据结构对于无序列表来说是可以的,但是如何处理排序呢?如果我们添加一个整数“rank”,那么在插入新项目时就需要重新编号(因此需要由于仅插入1个项目而同步所有后续项目)。或者,我们可以使用分数排名(使用前任和后继项目的排名平均值),但这似乎不是一个稳健的解决方案,因为当许多新项目被插入时,它很快就会遇到精度问题。
我们还考虑将其实现为双向链表,每个项目都持有其前任和后继项目的UUID。然而,当插入1个新项目时,仍需要同步3个项目(或在删除1个项目时同步2个剩余项目)。
最好的情况是,我们想使用一种数据结构或算法,只需要同步新插入的项目。是否存在这样的数据结构?
编辑:我们还需要能够处理将现有项目移动到不同的位置!
为了检测编辑,项目标记有修改时间戳。为避免在插入新项目时发生冲突(而不是使用自增整数),项目由UUID进行标识。在同步时,会检测到新的UUID并将其复制到另一个系统中。删除也是如此。
上述数据结构对于无序列表来说是可以的,但是如何处理排序呢?如果我们添加一个整数“rank”,那么在插入新项目时就需要重新编号(因此需要由于仅插入1个项目而同步所有后续项目)。或者,我们可以使用分数排名(使用前任和后继项目的排名平均值),但这似乎不是一个稳健的解决方案,因为当许多新项目被插入时,它很快就会遇到精度问题。
我们还考虑将其实现为双向链表,每个项目都持有其前任和后继项目的UUID。然而,当插入1个新项目时,仍需要同步3个项目(或在删除1个项目时同步2个剩余项目)。
最好的情况是,我们想使用一种数据结构或算法,只需要同步新插入的项目。是否存在这样的数据结构?
编辑:我们还需要能够处理将现有项目移动到不同的位置!
{a, b, c}
,并且系统 A 插入p
以获得{a, b, p, c}
,系统 B 插入p
以获得{a, p, b, c}
,当您同步时,您希望最终得到什么顺序? - Geoff{a, b, c}
,并且系统 A 插入p
以获得{a, b, p, c}
,系统 B 插入q
以获得{a, b, q, c}
,当你同步时,你希望p
和q
的顺序是什么? - Geoffp
和q
的任何顺序都是可以接受的,显然。 - Jason Smith