
Bildquelle: https://commons.wikimedia.org/wiki/File:Breadth-First-Search-Algorithm.gif

Bildquelle: https://commons.wikimedia.org/wiki/File:Depth-First-Search.gif
bs_tree_example.ipynb__contains__(...)-Methode um den Baum zu durchsuchenparse_tree_start.py darc:
c == '(': füge einen neuen Knoten als linkes Kind des aktuellen Knotens ein und gehe zum linken Kindc ein Operator (+, -, *, /): setze den Wert des aktuellen Knotens auf den Operator und füge einen neuen Knoten als rechtes Kind des aktuellen Knotens ein und gehe zum rechten Kindc eine Zahl: setze den Wert des aktuellen Knotens auf die Zahl und gehe zum Elternknotenc == ')': gehe zum Elternknotenparse_tree.pyinsert_left(...), insert_right(...) anstelle von Selbstordnung
Bildquelle: [Althoff 2021]
0k
2*k + 12*k + 2heapq-Modul - priority_queue_heap.pyfrom heapq import heapify, heappop, heappush
passenger_list = []
heappush(passenger_list, (3, "Daniel"))
heappush(passenger_list, (2, "Klaus"))
heappush(passenger_list, (1, "Markus"))
heappush(passenger_list, (2, "Thomas"))
heappush(passenger_list, (1, "Andreas"))
while passenger_list:
print(heappop(passenger_list))
# (1, 'Andreas')
# (1, 'Markus')
# (2, 'Klaus')
# (2, 'Thomas')
# (3, 'Daniel')

| Ungerichtet | Gerichtet |
|---|---|
| mit Zyklus | Vollständig |
|---|---|
# node: {node: weight, node: weight}
graph = {
"n1": { "n2": 1, "n3": 5 },
"n2": { "n1": 1, "n3": 7 },
"n3": { "n1": 5, "n2": 7, "n4": 8 },
"n4": { "n3": 8 }
}
n2 nach n4: n2 → n1 → n3 → n4 wenn Gewichte berücksichtigt werdenAlgorithm Dijkstra(G, s):
Input: A graph G and a start node s that is part of G
Output: List of shortest paths from s to all other nodes in G
D = map of distances from s to all other nodes in G initialized to ∞
D[s] = 0
Q = empty queue
Q.enqueue(s)
while Q is not empty:
u = Q.dequeue()
for each node v adjacent to node u:
possible_route = D[u] + v.weight
if possible_route < D[v]:
D[v] = possible_route
Q.enqueue(v)
return D
graph = {
"n1": { "n2": 1, "n3": 5 },
"n2": { "n1": 1, "n3": 7 },
"n3": { "n1": 5, "n2": 7, "n4": 8 },
"n4": { "n3": 8 }
}
dijsktra_algorithm.pynetworkx-Modulnetworkx bieten eine Vielzahl an Funktionen → u.a. eine (recht) effiziente Implementierung von Dijkstra's Algorithmusnetworkx_example.pyimport networkx as nx
graph = nx.Graph()
for i in range(1, 4+1):
graph.add_node(f"n{i}")
graph.add_edge("n1", "n2", weight=1)
graph.add_edge("n1", "n3", weight=5)
graph.add_edge("n2", "n3", weight=7)
graph.add_edge("n3", "n4", weight=8)
path_with_weight = nx.shortest_path(graph, "n2", "n4", weight="weight")
print(path_with_weight)
# ['n2', 'n1', 'n3', 'n4']
DataFrame mit Städten und deren KoordinatenToDo: change image
ToDo: change image