Scelta di nomi e tipi di variabili nell'algoritmo del grafico

2

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):

  1. Variabile di istanza G , perché è sempre dichiarata con maiuscole?
  2. Posso fare final Graph G per assicurarmi che non venga mai riassegnato da nessuna parte?
  3. Perché Queue e non semplice ArrayList ? (mentre si stampano tutti i vertici nel componente).
  4. Interfacce pubbliche con nomi come V , mi viene sempre insegnato a scrivere nomi descrittivi. In quali condizioni sono consentiti questi nomi?
  5. Perché abbiamo bisogno di astrazioni come StdOut quando abbiamo già il supporto di libreria come System.out ?
posta CodeYogi 22.05.2016 - 07:04
fonte

1 risposta

4

Hai chiesto

Instance variable G, why its always declared with capital?

e

Public interfaces with names like V, I am always taught to write descriptive names. In what conditions these names are allowed?

Suppongo che queste due cose abbiano lo stesso motivo: la descrizione dell'algoritmo originale e le sezioni correlate nel tuo libro di testo ha la forma di un testo matematico. I matematici usano spesso una lettera per le variabili e le maiuscole per gli insiemi e impostano strutture come i grafici, quindi non sorprende colui che ha implementato l'algoritmo appiccicato a quella convenzione. Per un tale contesto algoritmico va bene, dal momento che si desidera utilizzare i termini e le abbreviazioni simili nel proprio codice come quelli utilizzati nel libro di testo.

Can I do final Graph G to make sure its never reassigned anywhere?

Sì, puoi. Tuttavia, poiché G è usato solo come variabile locale in funzioni più o meno brevi, questo non aggiunge molto valore al codice, ma solo "rumore" aggiuntivo. Vedi questo post SO , leggi le due risposte più in alto, una che dice "sì, fallo" e l'altra "è una perdita di tempo". Nel tuo esempio sopra, tendo a concordare di più sulla seconda risposta.

Why Queue and not simple ArrayList?(while printing all the vertices in the component)

In realtà, non importa: l'uso di un ArrayList nel pezzo di codice mostrato non semplificherebbe né complicherebbe il codice. Sembra solo una questione di gusti. Dal modo in cui hai chiesto ti sembra di essere di parte, pensando che un ArrayList sembra essere "più semplice" di un Queue , ma chiediti perché pensi questo e come cambierà il codice quando sostituirai un tipo con l'altro .

Why we need abstractions like StdOut when we already have library support like System.out

Se esamini la sezione di commento iniziale della classe Java originale StdOut : è descritto proprio lì. Le differenze sono relative al set di caratteri, alla formattazione float / double number e al flushing. Inoltre, le precedenti edizioni del libro "Algorithms" non sono state scritte usando Java, ma linguaggi più vecchi come Pascal, C e C ++, quindi fornire un'astrazione per l'output standard rende il libro più indipendente dal linguaggio.

    
risposta data 22.05.2016 - 09:30
fonte