私はこのHackerRankの問題に取り組んできましたが、大きな入力サイズのためにコードがタイムアウトしている理由を理解できないようです。私は、時間を短縮するためにハッシュマップとして隣接リストを実装しました。また、実行時間を最適化するための標準として、DFSにスタックを使用しています。私の基本的な戦略は、DFSを使用して接続されたノードのグループを削除し、残りのものがなくなるまで(DFSでノードが削除されるまで)それを継続することです。問題は一般的にグラフあたり80,000個の切断された部分があることです。私は隣人のない単一のノードを取り出します(DFSは80,000回呼ばれます)。ここに特に優れた戦略はありますか?HackerRackの道路と図書館のタイムアウト
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;
}
参考までに、約2MBのファイル入力で私のコードを実行するのに約1.5秒かかります。
(言い換え代わりのコードを投稿するため申し訳ありませんが、私はむしろそれを台無しにないと思いますが)私はあなたには、いくつかのプロファイリングを行うと、ダウン10行以下に問題のあるコードを狭める提案することができます。あなたがそれをした後にまだ立ち往生しているなら、あなたはもっと具体的な質問に戻ることができます。 –
@JoeCこれからやるよ – robcarney
あなたの 'HashMap'のすべてのキーは連続した整数なので、おそらく配列が効率的です。 (HackerRankの挑戦では、都市のための1ベースのインデックスを使用するので、必ず1つを減算してください。) – smarx