Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> Programmazione >> Java Programming >> .

Come può essere implementato l'algoritmo in Java utilizzando una struttura di dati HEAP per calcoli di percorso più brevi efficienti?

Java non ha una struttura di dati heap integrata, ma puoi usare `priorityQueue` che implementa un Min-Heap (oppure puoi costruire il tuo heap). L'algoritmo più comune che sfrutta un heap per i calcoli del percorso più breve è l'algoritmo di Dijkstra. Ecco come è possibile implementare l'algoritmo di Dijkstra in Java usando un "priorityqueue":

`` `Java

import java.util.*;

Classe pubblica Dijkstra {

Mappa statica pubblica dijkstra (grafico, sorgente nodo) {

Mappa distanze =new hashmap <> ();

PriorityQueue MinHeap =new PriorityQueue <> (comparatore.caringint (distanze ::get)); // min-heap basato sulla distanza

// inizializza le distanze all'infinito ad eccezione della fonte

per (nodo nodo:graph.getNodes ()) {

Distances.put (nodo, integer.max_value);

}

Distances.put (fonte, 0);

MinHeap.Add (fonte);

while (! minHeap.isempty ()) {

Nodo corrente =minHeap.Poll ();

per (Edge Edge:current.getEdges ()) {

Nodo vicino =edge.getto ();

int distance =distances.get (corrente) + edge.getWeight ();

if (distance MinHeap.remove (vicino); // Rimuovi per aggiornare la priorità

Distances.put (vicino, distanza);

MinHeap.Add (vicino);

}

}

}

distanze di ritorno;

}

// Classi di supporto per la rappresentazione del grafico

grafico della classe statica {

set privato nodes =new hashset <> ();

public void addNode (nodo nodo) {

nodi.add (nodo);

}

public set getNodes () {

restituire nodi;

}

}

nodo di classe statica {

Nome stringa privato;

Elenco privato Edges =new ArrayList <> ();

nodo pubblico (nome stringa) {

this.name =name;

}

public String getName () {return name;}

public void addge (edge ​​edge) {

Edges.add (Edge);

}

Public List getEdges () {

bordi di ritorno;

}

@Override

Public Boolean Equals (Object Obj) {

if (this ==obj) restituisce vero;

if (obj ==null || getClass ()! =obj.getclass ()) restituisce false;

Nodo nodo =(nodo) obj;

return objects.quals (name, node.name);

}

@Override

public int hashCode () {

restituire oggetti.hash (nome);

}

}

Classe statica Edge {

nodo privato a;

Peso privato int;

Public Edge (nodo a, int peso) {

this.to =to;

this.weight =peso;

}

nodo pubblico getTo () {

tornare a;

}

public int getweight () {

Restituire il peso;

}

}

public static void main (string [] args) {

Grafico grafico =new graph ();

Nodo a =nuovo nodo ("a");

Nodo b =nuovo nodo ("b");

Nodo c =nuovo nodo ("c");

Nodo d =nuovo nodo ("d");

A.Addedge (new Edge (B, 4));

A.Addedge (new Edge (C, 2));

B.ADDEDge (new Edge (C, 1));

B.AdDedge (new Edge (d, 5));

C.AddEdge (New Edge (d, 8));

Graph.addNode (a);

Graph.addNode (b);

Graph.addNode (c);

Graph.addNode (d);

Mappa distanze =dijkstra (grafico, a);

for (map.entry voce:distances.entryset ()) {

System.out.println ("Distanza da a a" + entry.getKey (). GetName () + ":" + entry.getValue ());

}

}

}

`` `

Spiegazione:

1. `Graph`,` Node`, `Edge` Classi: Questi rappresentano la struttura del grafico. La classe `Node` include un elenco dei suoi oggetti` Edge 'in uscita.

2. `Dijkstra` Funzione: Ciò implementa l'algoritmo di Dijkstra.

- inizializza un `hashmap` (` distances`) per archiviare le distanze più brevi dal nodo di origine a tutti gli altri nodi. Inizialmente, tutte le distanze sono impostate su Infinity ad eccezione della fonte, che è 0.

- Un `priorityQueue` viene utilizzato come Min-heap per selezionare in modo efficiente il nodo con la distanza più piccola. Il comparatore garantisce che i nodi siano ordinati dalle loro distanze.

- L'algoritmo rimuove iterativamente il nodo con la distanza più piccola dal mucchio. Per ciascuno dei suoi vicini, controlla se viene trovato un percorso più breve e aggiorna la distanza e il mucchio di conseguenza. Le operazioni `Rimuovi` e` Aggiungi` sul `priorityQueue` mantengono in modo efficiente la proprietà heap (tempo logaritmico).

3. `Funzione principale: Questo crea un grafico di esempio e chiama la funzione `Dijkstra`. Il risultato mostra la distanza più breve dal nodo "A" a tutti gli altri nodi.

Ricorda di gestire potenziali problemi come i pesi di bordo negativo (l'algoritmo di Dijkstra non funziona correttamente con loro; invece avresti bisogno dell'algoritmo Bellman-Ford) e grafici disconnessi. Questo esempio migliorato gestisce `uguali` e` hashcode` nella classe `nodo` per gestire correttamente la gestione della chiave di` priorityqueue 'e `hashmap'.

 

Programmazione © www.354353.com