我有无向图,我需要查找图的连接组件数。我将图表表示为Select Distinct wc.UserID
, CONVERT(Datetime,wc.ShiftDate) as TimeDate
From WIP30Hist wc With(nolock)
Join WIP wa with(nolock) on wc.USerID = wa.UserID
Join WIP7Hist wb with(nolock) on wc.UserID = wa.UserID
Where wc.TimeDate <= GETDATE()-30 and wc.UserID Not in(select wa.UserID from WIP)
and wc.UserID Not in(select wb.UserID from WIP7Hist)
Group By wc.UserID, wc.TimeDate, wc.ShiftDate
Order By TimeDate
(节点:连接节点列表)。然后我浏览该地图并计算连通组件
Map<Integer, ArrayList<Integer>> map
但我需要更高效的算法。也许最好使用另一种图形表示,或者有其他方法可以找到连接组件的数量?
答案 0 :(得分:2)
如果您没有关于图表的连接组件的任何先验知识,那么您在此处获得的算法速度与您获得的算法一样快。 (DFS以线性时间运行。)如果您想加快速度,除非您有关于图结构的其他信息,否则您可能只能通过常数因子这样做。
我建议查看不相交的林数据结构,这是一个非常快速的数据结构,用于维护连接的组件。它渐渐地比DFS慢,但是常数因子非常低,你可能会发现它在实践中比你在这里更快。
答案 1 :(得分:1)
我不知道任何比你的解决方案渐近更快的算法,它以线性时间运行。但是,您可以执行以下操作来减少常量:
int[][]
而不是Map<Integer, ListArray<Integer>>
(可能Map<Integer, int[]>
就够了):首先int[]
的访问速度更快,因为访问了ListArray
,其次,您不必进行int
到Integer
的装箱/拆箱。