【发布时间】:2019-05-26 19:59:51
【问题描述】:
我试图在这个反向图问题中提高效率。这个想法很简单,你得到一个有向连通循环图,然后反转边的方向。
我猜对了,但我想让它更快,有些条目需要将近 2 秒。太可怕了……
如果有人知道任何可以帮助加快下面这段代码的事情,请告诉我。
static class Node
{
Integer val;
Vector<Node> neighbours = new Vector<Node>(0);
Node(Integer _val)
{
val = _val;
neighbours.clear();
}
};
static Node build_other_graph(Node node)
{
if(node.neighbours.size() == 0)
return new Node(node.val);
dfs(node);
return col.get(node.val);
}
static Node n = null;
static HashMap<Integer, Node> col = new HashMap<>();
static HashSet<Integer> visited = new HashSet<>();
static void dfs(Node node)
{
if(node == null || visited.contains(node.val))
return;
//visit
Vector<Node> adj = node.neighbours;
visited.add(node.val);
for(Node i: adj)
{
if(col.keySet().contains(i.val))
{
if(col.keySet().contains(node.val))
col.get(i.val).neighbours.add(col.get(node.val));
else
col.get(i.val).neighbours.add(new Node(node.val));
}
else
{
Node v = new Node(i.val);
if(col.keySet().contains(node.val))
v.neighbours.add(col.get(node.val));
else
v.neighbours.add(new Node(node.val));
col.put(i.val, v);
}
dfs(i);
}
}
【问题讨论】:
-
这里不需要 dfs,只需将所有节点存储在 ArrayList 中,将 Vector
neighbours_reverse 添加到每个节点,然后在查看邻居的同时遍历所有节点并将当前节点写入 neigbours neighbours_reverse列表。然后你可以交换邻居和neighbours_reverse。尝试对图表做一些浅薄的事情
标签: java algorithm performance coding-efficiency