約1,000,000のノードと多くのエッジが非常に大きいグラフがあります。これは、私が隣接リストを実装するときに最も適したデータ構造であることを知りたかったことです。 thisによると、それはAOを(持っているので、ここで私はセットを使用し、私のpythonでコーディングしています接続リストに 隣接リストを使用してグラフ表現を実装するときに使用するデータ構造
をノードに私は
- エッジリストを追跡するためのオブジェクト
- ノード(あります1)平均挿入時間)とノード対ノード接続リスト(これは、完全にハッシュ可能にすることによりHow to make an object properly hashable?とする)を含む。それより速く私が作ることができます。ここに私のコード
class node: def __init__(self, name = ""): self.__name = name def getName(self): return self.__name def __str__(self): return self.__name def __hash__(self): return hash(self.__name) def __lt__(self, other): if(type(self) != type(other)): return NotImplemented return self.__name.__lt__(other.__name) def __eq__(self, other): if(type(self)) != type(other): return NotImplemented return self.__name == other.__name class Edge: def __init__(self, name = "", node1 = None, node2 = None, weight = 0): self.__name = name self.__firstNode = node1 self.__secondNode = node2 self.__weight = weight def getName(self): return self.__name def getFirstNode(self): return self.__firstNode def getSecondNode(self): return self.__secondNode def getWeight(self): return self.__weight def __lt__(self, other): if(type(self) != type(other)): return NotImplemented return self.__name.__lt__(other.__name) and self.__firstNode.__lt__(other.__firstNode) and self.__secondNode.__lt__(other.__secondNode) and self.__weight.__lt__(other.__weight) def __eq__(self, other): if(type(self) != type(other)): return NotImplemented return self.__name == other.__name and self.__firstNode == other.__firstNode and self.__secondNode == other.__secondNode and self.__weight == other.__weight def __str__(self): return self.__name + " " + str(self.__firstNode) + " " + str(self.__secondNode) + " " + str(self.__weight) def __hash__(self): return hash(hash(self.__name) + hash(self.__firstNode) + hash(self.__secondNode) + hash(self.__weight)) class graph: def __init__(self): self.__nodeToNode = {} self.__edgeList = set() def addEdge(self, edge): if(type(edge) != type(Edge())): return False self.__edgeList.add(edge) if(not edge.getFirstNode() in self.__nodeToNode): self.__nodeToNode[edge.getFirstNode()] = set() self.__nodeToNode[edge.getFirstNode()].add(edge.getSecondNode()) if(not edge.getSecondNode() in self.__nodeToNode): self.__nodeToNode[edge.getSecondNode()] = set() self.__nodeToNode[edge.getSecondNode()].add(edge.getSecondNode()) return True def getNodes(self): return dict(self.__nodeToNode) def getEdges(self): return set(self.__edgeList) import string import random import time grp = graph() nodes = [None] * 20000 for i in range(20000): st = ''.join(random.SystemRandom().choice(string.ascii_letters) for i in range(10)) node1 = node(st) nodes[i] = node1 current = time.time() for i in range(3000000): rdm = random.randint(0, 199) rdm2 = random.randint(0, 199) st = ''.join(random.SystemRandom().choice(string.ascii_letters) for i in range(10)) eg = Edge(st, nodes[rdm], nodes[rdm2]) grp.addEdge(eg) last = time.time() print((last - current)) nodes = grp.getNodes() edges = grp.getEdges()
ですが、このコードは非常にゆっくりと走りますか?もしそうなら、どのようなデータ構造を使用しますか?
これを自分でコーディングしたいのですか、またはサードパーティのソリューションに満足していますか?はいの場合は、グラフデータベースNeo4j(https://github.com/neo4j/neo4j)またはpython-graphパッケージを参照してください。 – Jaco
@Jaco私はそれをチェックしますが、これは学校プロジェクト用です。私はそれを自分でコードしなければなりません。 – KidUser
networkxライブラリを使用してください。 (https://networkx.readthedocs.io/en/stable/)。ノード、エッジ、およびウェイトを追加する簡単な関数が存在します。ノードとエッジをプロットするのも非常に簡単です。 – Arjun