【发布时间】:2017-07-25 22:04:35
【问题描述】:
我研究这个 HackerRank 问题已经有一段时间了,但我似乎无法理解为什么我的代码会因大输入大小而超时。我已经将邻接列表实现为哈希映射以减少时间,并且一直在为我的 DFS 使用堆栈,这是优化其运行时间的标准。我的基本策略是使用 DFS 删除一组连接节点,并继续这样做直到没有剩余节点(我的 DFS 在到达节点时删除节点),问题是每个图通常有大约 80,000 个断开连接的部分 after 我取出没有邻居的单个节点(因此 DFS 被调用了 80,000 次)。这里有什么特别好的策略吗?
static int numDisconnected(HashMap<Integer, List<Integer>> adj) {
int result = 0;
List<Integer> iter = new ArrayList<>(adj.keySet());
for (int k : iter) {
if (adj.get(k).size() == 0) {
adj.remove(k);
result++;
}
}
HashMap<Integer,Boolean> explored = new HashMap<>();
for (int i : adj.keySet()) {
explored.put(i,false);
}
while (!adj.keySet().isEmpty()) {
result++;
depthFirstSearch(adj,explored);
}
return result;
}
作为参考,我的代码大约需要 1.5 秒才能在我的机器上运行大约 2MB 的文件输入。
【问题讨论】:
-
我建议您进行一些分析并将有问题的代码缩小到 10 行或更少。如果您这样做后仍然卡住,您可以提出更具体的问题。
-
@JoeC 我现在就去做
-
一个观察:所有
HashMaps 中的键都是连续整数,因此数组可能更有效。 (HackerRank 挑战使用从 1 开始的城市指数,所以一定要减去一个。)
标签: java algorithm graph graph-algorithm