Welkom op de Nederland Computer Kennisnetwerk!  
 
Zoeken computer kennis
Home Hardware Netwerken Programmering Software Computerstoring Besturingssysteem
Computer Kennis >> Programmering >> Java Programming >> Content
Hoe kan een algoritme in Java worden geïmplementeerd met behulp van een heap-datastructuur voor efficiënte berekeningen van het kortste pad?
Java heeft geen ingebouwde heap-gegevensstructuur, maar u kunt `PriorityQueue` gebruiken, die een min-heap implementeert (of u kunt uw eigen heap bouwen). Het meest voorkomende algoritme dat gebruik maakt van een hoop voor berekeningen met de kortste weg is het algoritme van Dijkstra. Hier leest u hoe u het algoritme van Dijkstra in Java kunt implementeren met behulp van een `PriorityQueue`:

```java

java.util.* importeren;

openbare klasse Dijkstra {

public static Map dijkstra(Grafiekgrafiek, Node-bron) {

Map afstanden =nieuwe HashMap<>();

PriorityQueue minHeap =nieuwe PriorityQueue<>(Comparator.comparingInt(distances::get)); //Min-heap gebaseerd op afstand

// Initialiseer afstanden tot oneindig, behalve de bron

for (Knoopknooppunt:graph.getNodes()) {

afstanden.put(knooppunt, geheel getal.MAX_VALUE);

}

afstanden.put(bron, 0);

minHeap.add(bron);

terwijl (!minHeap.isEmpty()) {

Knooppuntstroom =minHeap.poll();

voor (Randrand:current.getEdges()) {

Knooppunt buur =edge.getTo();

int afstand =afstanden.get(huidig) + edge.getWeight();

if (afstand minHeap.remove(buur); //Verwijderen om de prioriteit bij te werken

afstanden.put(buurman, afstand);

minHeap.add(buur);

}

}

}

retourafstanden;

}

//Helperklassen voor grafiekweergave

statische klasse Grafiek {

private Set knooppunten =nieuwe HashSet<>();

public void addNode(knooppunt) {

knooppunten.add(knooppunt);

}

public Set getNodes() {

retourknooppunten;

}

}

statische klasse Knooppunt {

privé Stringnaam;

privélijst randen =nieuwe ArrayList<>();

openbaar knooppunt (tekenreeksnaam) {

deze.naam =naam;

}

public String getName() { retournaam;}

public void addEdge(Randrand) {

randen.toevoegen(rand);

}

openbare lijst getEdges() {

retourranden;

}

@Overschrijven

public boolean is gelijk aan (Object obj) {

if (dit ==obj) retourneert waar;

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

Knooppunt knooppunt =(knooppunt) obj;

return Objects.equals(naam, knooppunt.naam);

}

@Overschrijven

openbare int hashCode() {

return Objects.hash(naam);

}

}

statische klasse Rand {

privé knooppunt naar;

privé int gewicht;

public Edge(knooppunt naar, int gewicht) {

dit.to =naar;

dit.gewicht =gewicht;

}

openbaar knooppunt getTo() {

terugkeren naar;

}

public int getWeight() {

retourgewicht;

}

}

public static void main(String[] args) {

Grafiekgrafiek =nieuwe grafiek();

Knooppunt a =nieuw knooppunt("A");

Knooppunt b =nieuw knooppunt("B");

Knooppunt c =nieuw knooppunt("C");

Knooppunt d =nieuw knooppunt("D");

a.addEdge(nieuwe Rand(b, 4));

a.addEdge(nieuwe Rand(c, 2));

b.addEdge(nieuwe Rand(c, 1));

b.addEdge(nieuwe rand(d, 5));

c.addEdge(nieuwe Rand(d, 8));

grafiek.addNode(a);

grafiek.addNode(b);

grafiek.addNode(c);

grafiek.addNode(d);

Kaart afstanden =dijkstra(grafiek, a);

for (Map.Entry invoer:distances.entrySet()) {

System.out.println("Afstand van A tot " + entry.getKey().getName() + ":" + entry.getValue());

}

}

}

```

Uitleg:

1. `Graph`, `Node`, `Edge` klassen: Deze vertegenwoordigen de grafiekstructuur. De klasse `Node` bevat een lijst met de uitgaande `Edge`-objecten.

2. `dijkstra`-functie: Hiermee wordt het algoritme van Dijkstra geïmplementeerd.

- Het initialiseert een `HashMap` (`distances`) om de kortste afstanden van het bronknooppunt naar alle andere knooppunten op te slaan. Aanvankelijk zijn alle afstanden ingesteld op oneindig, behalve de bron, die 0 is.

- Een `PriorityQueue` wordt gebruikt als een min-heap om efficiënt het knooppunt met de kleinste afstand te selecteren. De comparator zorgt ervoor dat knooppunten worden geordend op afstand.

- Het algoritme verwijdert iteratief het knooppunt met de kleinste afstand van de heap. Voor elk van zijn buren controleert het of er een korter pad is gevonden en werkt de afstand en de hoop dienovereenkomstig bij. De bewerkingen `remove` en `add` op de `PriorityQueue` behouden de heap-eigenschap efficiënt (logaritmische tijd).

3. `hoofd`-functie: Hierdoor wordt een voorbeeldgrafiek gemaakt en wordt de functie 'dijkstra' aangeroepen. Het resultaat toont de kortste afstand van knooppunt "A" tot alle andere knooppunten.

Vergeet niet om potentiële problemen zoals negatieve randgewichten (het algoritme van Dijkstra werkt er niet goed mee; je hebt in plaats daarvan het Bellman-Ford-algoritme nodig) en niet-verbonden grafieken te behandelen. Dit verbeterde voorbeeld verwerkt `equals` en `hashCode` in de klasse `Node` om de sleutelafhandeling van `PriorityQueue` en `HashMap` correct te beheren.

Previous: Next:
  Java Programming
·Hoe maak je een aangepaste nav…
·Waarom hebben we Java voor Win…
·Hoe te gebruiken Tekst -naar-s…
·Hoe te JSP bewerken in NetBean…
·Het wijzigen van de JDK in BEA…
·Kan de Android Run . Jar ? 
·Hoe maak je een besluit Boom i…
·Hoe kan ik een bereik van waar…
·Hoe je Een afbeelding toevoege…
  Related Articles
Waarom gebruiken we functies bij het pro…
Welke rol speelt een tolk bij het progra…
Wat is de rol van een compiler bij compu…
Wat is het doel van een voorwaardelijke …
Wat is de meest efficiënte manier om ee…
Wat is de hiërarchie van programmeertal…
Wat is de analoge definitie in de inform…
Wat is redex en hoe verhoudt dit zich to…
Wat is assembleertaal en hoe wordt het g…
  Programmering Articles
·Hoe te voorkomen meer dan een aanleg van…
·Hoe kan ik een element van een array 
·Gemakkelijk CGI Problemen 
·Wat zijn CNC Machines? 
·AJAX PHP MySQL Tutorial 
·Wat is computerprogrammeur in het Frans?…
·Hoe maak je een handmatige stap-voor - s…
·Structuur van JavaScript 
·Hoe te berekenen van het aantal lijnen i…
Copyright © Computer Kennis https://www.nldit.com