Ich habe den folgenden Code Modellierung eines schlanken Rahmenwerk für einen Eckpunkt in meiner Studie der Netzwerkdiffusion. Der erste Prototyp stammt von einem Framework in Python, das ich in Java übersetzt habe. Das Problem, das ich habe, ist, dass, während dieser Code viel schneller als seine Python-Version bis zu 10000 Vertices läuft, für eine größere Anzahl von Vertices (100.000+) zum Stillstand kommt. Tatsächlich wurde die Python-Version in 1.2 Minuten ausgeführt, während der Java-Build selbst nach 7 Minuten der Ausführung nicht zurückkehrte. Ich bin nicht sicher, warum der gleiche Code bei einer größeren Anzahl von Vertices zusammenbricht und ich brauche Hilfe bei der Korrektur des Codes.Java-Code Ausführungszeit Ausgabe
import java.util.*;
public class Vertex
{
private int id;
private HashMap<Integer, Double> connectedTo;
private int status;
public Vertex(int key)
{
this.id = key;
this.connectedTo = new HashMap<Integer, Double>();
this.status = 0;
}
public void addNeighbour(int nbr, double weight)
{
this.connectedTo.put(nbr, weight);
}
public int getId()
{
return this.id;
}
public double getWeight(int nbr)
{
return this.connectedTo.get(nbr);
}
public int getStatus()
{
return this.status;
}
public Set<Integer> getConnections()
{
return this.connectedTo.keySet();
}
//testing the class
public static void main(String[] args)
{
int noOfVertices = 100000;
Vertex[] vertexList = new Vertex[noOfVertices];
for (int i = 0; i < noOfVertices; i++) {
vertexList[i] = new Vertex(i);
}
for (Vertex v : vertexList) {
int degree = (int)(500*Math.random()); //random choice of degree
int neighbourCount = 0; // count number of neighbours built up
while (neighbourCount <= degree) {
int nbr = (int) (noOfVertices * Math.random()); // randomly choose a neighbour
double weight = Math.random(); // randomly assign a weight for the relationship
v.addNeighbour(nbr, weight);
neighbourCount++;
}
}
}
}
Als Referenz ist die Python-Version dieses Code wie folgt:
import random
class Vertex:
def __init__(self, key):
self.id = key
self.connectedTo = {}
def addNeighbor(self, nbr, weight=0):
self.connectedTo[nbr] = weight
def __str__(self):
return str(self.id) + ' connectedTo: ' \
+ str([x.id for x in self.connectedTo])
def getConnections(self):
return self.connectedTo.keys()
def getId(self):
return self.id
def getWeight(self, nbr):
return self.connectedTo[nbr]
if __name__ == '__main__':
numberOfVertices = 100000
vertexList = [Vertex(i) for i in range(numberOfVertices)] # list of vertices
for vertex in vertexList:
degree = 500*random.random()
# build up neighbors one by one
neighbourCount = 0
while neighbourCount <= degree:
neighbour = random.choice(range(numberOfVertices))
weight = random.random() # random choice of weight
vertex.addNeighbor(neighbour, weight)
neighbourCount = neighbourCount + 1
Ich bin gerade dabei und werde bald einen optimierten Code veröffentlichen! –
Es ist nicht einfach ohne Profiling zu sagen, könnte eigentlich fast überall sein. Nur ein kleiner Punkt: Sehen Sie sich die 'java.util.Random'-Klasse an, die eine 'nextInt (bound)' Methode hat (es ist unwahrscheinlich, dass es eine beträchtliche Beschleunigung ist, aber immer noch). –
Die Lösung gefunden und unten veröffentlicht! –