优化此代码以查找连接的组件?

时间:2016-03-28 16:33:41

标签: java algorithm performance graph

我有无向图,我需要查找图的连接组件数。我将图表表示为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

但我需要更高效的算法。也许最好使用另一种图形表示,或者有其他方法可以找到连接组件的数量?

2 个答案:

答案 0 :(得分:2)

如果您没有关于图表的连接组件的任何先验知识,那么您在此处获得的算法速度与您获得的算法一样快。 (DFS以线性时间运行。)如果您想加快速度,除非您有关于图结构的其他信息,否则您可能只能通过常数因子这样做。

我建议查看不相交的林数据结构,这是一个非常快速的数据结构,用于维护连接的组件。它渐渐地比DFS慢,但是常数因子非常低,你可能会发现它在实践中比你在这里更快。

答案 1 :(得分:1)

我不知道任何比你的解决方案渐近更快的算法,它以线性时间运行。但是,您可以执行以下操作来减少常量:

  1. 使用bfs而不是dfs:你为每个函数调用支付开销!
  2. 使用int[][]而不是Map<Integer, ListArray<Integer>>(可能Map<Integer, int[]>就够了):首先int[]的访问速度更快,因为访问了ListArray,其次,您不必进行intInteger的装箱/拆箱。