Compare commits

...

6 Commits

7 changed files with 96 additions and 1 deletions

View File

@@ -0,0 +1,4 @@
## Overview
Create a program which creates a topological ordering of Python packages.
See this [starter template](https://gitea.bchen.dev/brendan/python-packages-starter)

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,5 @@
## Overview
We'll go over exercise 2 from [last week](../2026.08.20/overview.md), as well as
a new topic: [topological sort](./topological_sort.md). Try to complete the
exercise from the document.

View File

@@ -0,0 +1,32 @@
## Class ordering
These are some classes for Chapman University, for
the [computer science program](https://catalog.chapman.edu/preview_program.php?catoid=33&poid=6408&print).
![An ordering of classes for Chapman University.](./classes.png)
This is a *directed acyclic graph*, or DAG.
- Directed: edges point from one node to another, not necessarily the other way around
- Acyclic: there are no *cycles* in the graph
We say that a class is a *prerequisite* or a *dependency* of another class
if we need to take it before that other class. So, we need to take CPSC 230
before CPSC 231, for example.
Could you come up with something like this for your school?
## The algorithm
If you were to come up with a list of classes, such that the list of classes
is in the order which you need to take them, what would that look like?
This order is what we're trying to achieve with the topological sort
algorithm. Note that there can be multiple correct solutions.
By the way, [here is a link to the whiteboard](https://excalidraw.com/#json=69478-DnuxlMCcyaOkazP,I_-nOWaO9m0wJkAFfqt9JA).
## The exercise
Let's write the algorithm. First, test it against the Chapman classes, then
put in your classes and see how it fares against that.

View File

@@ -15,7 +15,7 @@ classes = {
} }
def topological_sort(adjacency_list: dict[str, set[str]]): def topological_sort(adjacency_list: dict[str, set[str]]):
# return the sorted ordering # return the sorted ordering ['CPSC 230', 'ENGR 101', 'CPSC 231', ...]
return [] return []
print(topological_sort(classes)) print(topological_sort(classes))

View File

@@ -0,0 +1,47 @@
from collections import deque
# This is a solution which uses DFS to trace the paths; there
# are other solutions as well
classes = {
'CPSC 230': {'CPSC 231'},
'CPSC 231': {'CPSC 350', 'CPSC 330'},
'CPSC 350': {'CPSC 380', 'CPSC 408', 'CPSC 406'},
'CPSC 330': {'CPSC 351'},
'CPSC 351': set(),
'ENGR 101': set(),
'CPSC 380': set(),
'CPSC 406': set(),
'CPSC 408': set()
}
def topological_sort(adjacency_list: dict[str, set[str]]):
result = deque()
visited = set()
def dfs(current: str, visited_in_traversal=None):
if visited_in_traversal is None:
visited_in_traversal = set()
if current in visited:
return
if current in visited_in_traversal:
raise ValueError("Graph has a cycle")
visited_in_traversal.add(current)
for neighbor in adjacency_list[current]:
dfs(neighbor, visited_in_traversal)
# to trace the reverse path, use .append
result.appendleft(current)
visited.add(current)
for node in adjacency_list.keys():
if node not in visited:
dfs(node)
return result
print(topological_sort(classes))

View File

@@ -0,0 +1,7 @@
## Overview
We will go over the exercise from last week and start on [Python Packages](https://gitea.bchen.dev/brendan/python-packages-starter),
a new assignment. For reference, this assignment is also in the Assignments section.
Whiteboard for optimizing last week's assignment: https://excalidraw.com/#json=rd-1CkdxA2AMpQsiVOQkY,t7-KayQW3DntCDkXVktEJQ