在反向链接列表中,如何有效地获取其子列表?

时间:2018-10-04 05:36:32

标签: sql git data-structures linked-list singly-linked-list

假设我有一个反向链接列表,即每个节点都指向其前身的数据结构:

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,这是我要避免的事情。

0 个答案:

没有答案