假设我有一个反向链接列表,即每个节点都指向其前身的数据结构:
g++ *.cpp
./a.out
例如,您可以在Git中找到这种模式,其中每个提交都包含其前身的ID。
现在让我们假设以下情况:每次将新节点添加到列表中时,都会通知另一个组件。不幸的是,这些通知有时会丢失,因此不能保证所有通知都会到达。对于上面给出的列表,通知应为:
A <- B <- C <- D
但是,作为示例,将收到以下消息:
A
B
C
D
现在,我想检测接收组件中的“孔”。即,当收到A
D
时,该组件可以检测到缺少某些东西,因为还没有收到D
的前身。因此,它向发送组件询问缺少的部分。可以说的是:最后收到的是D
,最新收到的是A
。
因此,现在管理原始列表的组件具有有效地确定子列表D
缺少的任务。
最后,这是我的问题起作用的地方:如何有效地做到这一点?我的意思是,最简单的方法是从B <- C
向后移动,直到到达D
。两者之间的一切显然都是缺失的。
假设每个节点都作为单个记录存储在关系数据库系统的表中:找出此子列表的最有效方法是什么?显然,我可以一次又一次地循环运行A
。有更好的方法吗?
SELECT
表的表布局基本上如下所示:
Nodes
这意味着,由于ID不是数字,因此您不能简单地选择缺失节点的范围。
PS:我知道的唯一解决方案是introducing a position
field,它实际上是 一个递增的数字ID,但我明确不希望这样,因为那样我就需要一个单一的故障点,始终提供下一个ID,这是我要避免的事情。