Sto imparando algoritmi e strutture dati da questa fantastica risorsa Algorithms . Invece di leggere a secco sto cercando di riscrivere tutto il codice in modo da poter imparare contemporaneamente la codifica e le decisioni di progettazione (come: quali API esporre e come fare asserzioni, ecc.) Quindi, di seguito è riportato il mio codice semplificato che è per lo più copiato da questa versione.
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.Graph;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Queue;
public class CC {
private int count;
private boolean[] marked;
private int[] id;
public CC(Graph G) {
marked = new boolean[G.V()];
id = new int[G.V()];
count = 0;
for (int v = 0; v < G.V(); v++) {
if (!marked[v]) {
dfs(G, v);
count++;
}
}
}
public int count() {
return count;
}
public int id(int v) {
return id[v];
}
private void dfs(Graph G, int u) {
if (!marked[u]) {
marked[u] = true;
id[u] = count;
for(int v : G.adj(u)) {
dfs(G, v);
}
}
}
public static void main(String[] args) {
In in = new In(args[0]);
Graph G = new Graph(in);
CC cc = new CC(G);
// number of connected components.
int M = cc.count();
StdOut.println(M + " components");
// Get number of vertices in each component.
Queue<Integer>[] components = (Queue<Integer>[]) new Queue[M];
for (int i = 0; i < M; i++) {
components[i] = new Queue<Integer>();
}
for (int v = 0; v < G.V(); v++) {
components[cc.id(v)].enqueue(v);
}
for (int i = 0; i < M; i++) {
for (int v : components[i]) {
StdOut.print(v + " ");
}
StdOut.println();
}
}
}
Sto scrivendo alcuni dei dubbi che ho e comprenderli può permettermi di scrivere un codice migliore in futuro e capire meglio gli autori (potrebbe esserci qualche domanda stupida quindi ti prego di sopportarmi: p):
- Variabile di istanza
G
, perché è sempre dichiarata con maiuscole? - Posso fare
final Graph G
per assicurarmi che non venga mai riassegnato da nessuna parte? - Perché
Queue
e non sempliceArrayList
? (mentre si stampano tutti i vertici nel componente). - Interfacce pubbliche con nomi come
V
, mi viene sempre insegnato a scrivere nomi descrittivi. In quali condizioni sono consentiti questi nomi? - Perché abbiamo bisogno di astrazioni come
StdOut
quando abbiamo già il supporto di libreria comeSystem.out
?