从直接连接到多步可达
若有向边A到B、B到C,闭包会把A到C也记录为可达,而不要求原图已有直接边。这个过程不是给原图增加一条实际道路,而是建立一个概括多步路径的关系,便于直接回答“能否到达”。
一般关系的传递闭包通常记为R⁺,要求至少一步;加入零步身份关系则得到自反传递闭包R*。图算法库有时把每个点到自身也记为可达,因此使用结果前应确认这个约定,不要把对角线上的真值都解释成原图含有非空环路。
为每个起点保存搜索结果
一种直接算法从每个顶点分别运行深度优先搜索,保存它能到达的全部顶点。查询任意点对时,再读取对应起点的标记。Princeton实现一开始就标记搜索源本身,因此其结果包含零步自达。
在邻接表模型下,V次搜索总时间为O(V(V+E));若保存全部点对的布尔结果,需要O(V²)空间。即使原图边很少,闭包也可能非常稠密,例如一条单向链已有二次方数量级的可达点对。
结果大小与查询需求一起考虑
若只偶尔查询少数起点,按需搜索可能比物化整张闭包节省空间;若大量重复查询同一静态图,预存结果则能减少每次重复探索。图更新以后,旧闭包也需要维护,不能继续把缓存当成当前图的事实。
闭包还依赖选择哪一种边关系。直接任职、引用或交易等关系未必具有应用所需的传递含义;图上两跳可达,只能先解释为某种路径存在。需要路径长度、具体经过哪些点或边的证据时,也不能仅凭一个可达布尔值回答。