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.py
insert_left(...)
, insert_right(...)
anstelle von SelbstordnungBildquelle: [Althoff 2021]
0
k
2*k + 1
2*k + 2
heapq
-Modul - priority_queue_heap.py
from 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 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
D[s] = 0
Q = empty queue
Q.enqueue(s)
while Q is not empty:
u = Q.dequeue()
for each node v adjacent to u:
alt_rout = D[u] + v.weight
if alt_rout < D[v]:
D[v] = alt_rout
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.py
networkx
-Modulnetworkx
bieten eine Vielzahl an Funktionen → u.a. eine effiziente Implementierung von Dijkstra's Algorithmusnetworkx_example.py
import 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