Fix critical base.Graph Denkfehler
This commit is contained in:
parent
efaa96ff68
commit
30b20dff8d
4 changed files with 34 additions and 8 deletions
|
|
@ -113,7 +113,8 @@ public class Graph<T> {
|
||||||
public Edge<T> getEdge(Node<T> nodeA, Node<T> nodeB) {
|
public Edge<T> getEdge(Node<T> nodeA, Node<T> nodeB) {
|
||||||
|
|
||||||
return edges.stream()
|
return edges.stream()
|
||||||
.filter(x -> x.getNodeA().equals(nodeA) && x.getNodeB().equals(nodeB))
|
.filter(x -> x.getNodeA().equals(nodeA) && x.getNodeB().equals(nodeB) ||
|
||||||
|
x.getNodeA().equals(nodeB) && x.getNodeB().equals(nodeA))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import java.util.*;
|
||||||
public abstract class GraphAlgorithm<T> {
|
public abstract class GraphAlgorithm<T> {
|
||||||
|
|
||||||
final static boolean DEBUG = true;
|
final static boolean DEBUG = true;
|
||||||
|
final static boolean DEBUG_2 = false;
|
||||||
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
|
|
@ -70,6 +71,9 @@ public abstract class GraphAlgorithm<T> {
|
||||||
*/
|
*/
|
||||||
private AlgorithmNode<T> getSmallestNode() {
|
private AlgorithmNode<T> getSmallestNode() {
|
||||||
|
|
||||||
|
if (DEBUG_2)
|
||||||
|
System.out.println("Enter gSN");
|
||||||
|
|
||||||
if (availableNodes.isEmpty()) {
|
if (availableNodes.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -85,6 +89,14 @@ public abstract class GraphAlgorithm<T> {
|
||||||
|
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
|
|
||||||
|
if (DEBUG)
|
||||||
|
n += 1;
|
||||||
|
|
||||||
|
if (DEBUG_2) {
|
||||||
|
System.out.println("gSN with size " + availableNodes.size() + " and n=" + n);
|
||||||
|
System.out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
tempElem = algorithmNodes.get(iter.next());
|
tempElem = algorithmNodes.get(iter.next());
|
||||||
if (tempElem.value > 0) {
|
if (tempElem.value > 0) {
|
||||||
if (tempElem.value < MinElem.value) {
|
if (tempElem.value < MinElem.value) {
|
||||||
|
|
@ -92,9 +104,6 @@ public abstract class GraphAlgorithm<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DEBUG)
|
|
||||||
n += 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
iter.remove();
|
iter.remove();
|
||||||
|
|
||||||
|
|
@ -124,14 +133,26 @@ public abstract class GraphAlgorithm<T> {
|
||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
|
if (DEBUG_2)
|
||||||
|
System.out.println("Enter run");
|
||||||
|
|
||||||
AlgorithmNode<T> v = getSmallestNode();
|
AlgorithmNode<T> v = getSmallestNode();
|
||||||
|
|
||||||
while (v != null) {
|
while (v != null) {
|
||||||
|
|
||||||
|
if (DEBUG_2)
|
||||||
|
System.out.println("numEdges="+graph.getEdges(v.node).size());
|
||||||
|
|
||||||
for (Edge<T> e : graph.getEdges(v.node)) {
|
for (Edge<T> e : graph.getEdges(v.node)) {
|
||||||
|
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
n += 1;
|
n += 1;
|
||||||
|
|
||||||
|
if (DEBUG_2) {
|
||||||
|
System.out.println("run with n="+n);
|
||||||
|
System.out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
if (isPassable(e)) {
|
if (isPassable(e)) {
|
||||||
|
|
||||||
AlgorithmNode<T> n = algorithmNodes.get(e.getOtherNode(v.node));
|
AlgorithmNode<T> n = algorithmNodes.get(e.getOtherNode(v.node));
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ public class GraphAlgoComplexityTest {
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
|
|
||||||
for (int i = 1; i < 100; i++) {
|
for (int i = 1; i < 1000; i+=10) {
|
||||||
|
|
||||||
Graph<Integer> g = generateGraph(i);
|
Graph<Integer> g = generateGraph(i);
|
||||||
DumbGraphAlgorithm ga = new DumbGraphAlgorithm(g, g.getNodes().get(0));
|
DumbGraphAlgorithm ga = new DumbGraphAlgorithm(g, g.getNodes().get(0));
|
||||||
|
|
@ -27,6 +27,7 @@ public class GraphAlgoComplexityTest {
|
||||||
double divN3 = (double)ga.getN() / ((double)i*i*i);
|
double divN3 = (double)ga.getN() / ((double)i*i*i);
|
||||||
|
|
||||||
System.out.println(i + "," + ga.getN() + "," + divN + "," + divN2 + "," + divN3);
|
System.out.println(i + "," + ga.getN() + "," + divN + "," + divN2 + "," + divN3);
|
||||||
|
//System.out.println();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ werden der ArrayDeque \texttt{nextVisitNodes} hinzugefügt.
|
||||||
\end{algorithm}
|
\end{algorithm}
|
||||||
|
|
||||||
|
|
||||||
$$O(n)$$
|
$$O(n^2)$$
|
||||||
|
|
||||||
$n$ soll in diesem Fall die Anzahl an Knoten wiedergeben.
|
$n$ soll in diesem Fall die Anzahl an Knoten wiedergeben.
|
||||||
|
|
||||||
|
|
@ -166,7 +166,10 @@ eine Komplexität von $O(n)$ hat, wenn $n$ die Anzahl
|
||||||
der Knoten darstellt.
|
der Knoten darstellt.
|
||||||
|
|
||||||
Bei jeder Iteration des Algorithmus wird zuerst der
|
Bei jeder Iteration des Algorithmus wird zuerst der
|
||||||
Knoten mit dem kleinsten Wert gesucht.
|
Knoten mit dem kleinsten Wert gesucht. Dann werden alle
|
||||||
|
Nachbarn dieses Knotens abgeprüft. Das können höchstens
|
||||||
|
$n - 1$ Knoten sein, da ausgeschlossen wird, dass ein
|
||||||
|
Knoten eine Kante mit sich selber haben kann.
|
||||||
|
|
||||||
\subsubsection{Teil (b)}
|
\subsubsection{Teil (b)}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue