Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Ako je možné implementovať algoritmus v Java pomocou štruktúry údajov HADE pre efektívne výpočty najkratšej cesty?

Java nemá vstavanú štruktúru údajov o halkách, ale môžete použiť „priorityqueue“, ktorá implementuje ministerstvo (alebo si môžete vybudovať svoju vlastnú haldu). Najbežnejším algoritmom, ktorý využíva hromadu pre najkratšie výpočty cesty, je algoritmus Dijkstra. Tu je návod, ako môžete implementovať algoritmus Dijkstra v Java pomocou „priorityqueue“:

`` `Java

import java.util.*;

verejná trieda dijkstra {

verejná statická mapa dijkstra (graf graf, zdroj uzlov) {

Map vzdialenosti =nový hashmap <> ();

Priorityqueue minHeap =nový priorityqueue <> (Comparator.comParingInt (vzdialenosti ::get)); // min-heap na základe vzdialenosti

// Inicializujte vzdialenosti na nekonečno, s výnimkou zdroja

pre (uzol uzol:graph.getNodes ()) {

vzdialenosť.put (uzol, Integer.max_value);

}

vzdialenosti.put (zdroj, 0);

MinHeap.add (zdroj);

while (! minheap.isempty ()) {

Uzol prúd =minheap.poll ();

pre (Edge Edge:Current.GetEdges ()) {

Uzol sused =Edge.getto ();

int DISTISTIL =DISTANCE.Get (current) + Edge.getweight ();

if (vzdialenosť Minheap.Remove (sused); // Odstrániť Aktualizácia priority

vzdialenosti.Put (sused, vzdialenosť);

Minheap.add (sused);

}

}

}

návratové vzdialenosti;

}

// HELRER TRIEDY pre reprezentáciu grafu

graf statickej triedy {

private set nodes =new hashset <> ();

public void addnode (uzol uzol) {

nodes.add (uzol);

}

public set getNodes () {

spätné uzly;

}

}

uzol statickej triedy {

Private String názov;

súkromný zoznam Edes =new ArrayList <> ();

public uzol (názov String) {

this.Name =name;

}

public String getName () {return name;}

public void pridané (Edge Edge) {

Edges.add (Edge);

}

public List getADges () {

návratové hrany;

}

@Override

public boolean sa rovná (objekt obj) {

if (this ==obj) vráti true;

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

Uzol =(uzol) obj;

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

}

@Override

public int hashcode () {

return Objects.hash (meno);

}

}

statická hrana triedy {

súkromný uzol;

súkromná váha;

public Edge (uzol do, int váha) {

this.to =to;

this.weight =váha;

}

verejný uzol getto () {

Návrat k;

}

public int getweight () {

návrat;

}

}

public static void main (String [] args) {

Graf graf =nový graf ();

Uzol A =nový uzol ("A");

Uzol b =nový uzol ("b");

Uzol C =nový uzol ("C");

Uzol d =nový uzol ("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);

Map vzdialenosti =dijkstra (graf, a);

pre (mapa

System.out.println ("Vzdialenosť od A do" + enadt.getKey (). GetName () + ":" + enadt.getValue ());

}

}

}

`` `

Vysvetlenie:

1. Predstavujú štruktúru grafu. Trieda „Node“ obsahuje zoznam svojich odchádzajúcich objektov `Edge.

2. `Dijkstra` funkcia: To implementuje Dijkstra algoritmus.

- Inicializuje `hashmap` (` vzdialenosti`) na ukladanie najkratších vzdialeností od zdrojového uzla do všetkých ostatných uzlov. Spočiatku sú všetky vzdialenosti nastavené na nekonečno, s výnimkou zdroja, ktorý je 0.

- „Priorityqueue“ sa používa ako ministerstvo financií na efektívny výber uzla s najmenšou vzdialenosťou. Porovnávač zaisťuje, že uzly sú usporiadané podľa ich vzdialeností.

- Algoritmus iteratívne odstraňuje uzol s najmenšou vzdialenosťou od haldy. Pre každého zo svojich susedov kontroluje, či sa nachádza kratšia cesta, a podľa toho aktualizuje vzdialenosť a hromadu. Operácie `remove` a` add` na `priorityqueue` udržiavajte vlastnosť haldy efektívne (logaritmický čas).

3. `main` funkcia: Tým sa vytvorí vzorový graf a volá funkciu `dijkstra`. Výsledok ukazuje najkratšiu vzdialenosť od uzla „A“ k všetkým ostatným uzlom.

Nezabudnite riešiť potenciálne problémy, ako sú negatívne hmotnosti okrajov (algoritmus Dijkstra s nimi nefunguje správne; namiesto toho by ste potrebovali algoritmus Bellman-Ford) a odpojené grafy. Tento vylepšený príklad spracováva `Equals` a` hashcode` v triede „Node`, aby správne spravoval spracovanie kľúčov„ Priorityqueue “a` Hashmap`.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené