UJS S26: Graphs
206. PREREQUISITES
207. Intro to Graphs
208. Uses for Graphs
209. Types of Graphs
210. Storing Graphs: Adjacency Matrix
211. Storing Graphs: Adjacency List
212. Adjacency Matrix Vs. List BIG O
ADJACENCY LIST:
PRO:
- takes up less space if data is sparse
- faster to iterate over all edges
CON:
- can be slow to look up specific edges
ADJACENCY MATRIX:
PRO:
- faster to look up specific edge
CON:
- Takes up more space if data is sparse
- Slower to iterate over all edges
WITH BIG O:
ADJACENCY LIST:
ADJACENCY MATRIX:
213. Add Vertex Intro
class Graph {
constructor() {
this.adjacencyList = {};
}
addVertex(val) {
// SIMPLE
// this.adjacencyList[val] = [];
// With error handling
if (!this.adjacencyList[val]) this.adjacencyList[val] = [];
}
printMe() {
for (let property in this.adjacencyList) {
console.log(property, this.adjacencyList[property]);
}
}
}
myGraph = new Graph();
myGraph.addVertex("Tokyo");
myGraph.printMe();
class Graph:
def __init__(self):
self.adjacencyList = {}
def addVertex(self, val):
self.adjacencyList[val] = []
def print_me(self):
for k,v in self.adjacencyList.items():
print(k,v)
myGraph = Graph()
myGraph.addVertex('Tokyo')
myGraph.print_me()
214. Add Vertex Solution
215. Add Edge Intro
216. Add Edge Solution
class Graph:
def __init__(self):
self.adjacencyList = {}
def addVertex(self, val):
self.adjacencyList[val] = []
def addEdge(self, vert1, vert2):
# self.adjacencyList[vert1] = self.adjacencyList[vert1] + [vert2]
# self.adjacencyList[vert2] = self.adjacencyList[vert2] + [vert1]
# self.adjacencyList[vert1] += [vert2]
# self.adjacencyList[vert2] += [vert1]
self.adjacencyList[vert1].append(vert2)
self.adjacencyList[vert2].append(vert1)
def removeEdge(self, vert1, vert2):
self.adjacencyList[vert1] = [item for item in self.adjacencyList[vert1] if item != vert2]
self.adjacencyList[vert2] = [item for item in self.adjacencyList[vert2] if item != vert1]
def print_me(self):
for k,v in self.adjacencyList.items():
print(k,v)
class Graph {
constructor() {
this.adjacencyList = {};
}
addVertex(val) {
if (!this.adjacencyList[val]) this.adjacencyList[val] = [];
}
addEdge(vert1, vert2) {
this.adjacencyList[vert1].push(vert2);
this.adjacencyList[vert2].push(vert1);
}
removeEdge(vert1, vert2) {
this.adjacencyList[vert1] = this.adjacencyList[vert1].filter(
(item) => item !== vert2
);
this.adjacencyList[vert2] = this.adjacencyList[vert2].filter(
(item) => item !== vert1
);
}
printMe() {
for (let property in this.adjacencyList) {
console.log(property, this.adjacencyList[property]);
}
}
}
myGraph = new Graph();
myGraph.addVertex("Tokyo");
myGraph.addVertex("LA");
myGraph.addVertex("CO");
myGraph.addEdge("Tokyo", "LA");
myGraph.addEdge("LA", "CO");
myGraph.printMe();
myGraph.removeEdge("Tokyo", "LA");
myGraph.printMe();
217. Remove Edge Intro
218. Remove Edge Solution
219. Remove Vertex Intro
220. Remove Vertex Solution
class Graph {
constructor() {
this.adjacencyList = {};
}
addVertex(val) {
if (!this.adjacencyList[val]) this.adjacencyList[val] = [];
}
addEdge(vert1, vert2) {
this.adjacencyList[vert1].push(vert2);
this.adjacencyList[vert2].push(vert1);
}
removeEdge(vert1, vert2) {
this.adjacencyList[vert1] = this.adjacencyList[vert1].filter(
(item) => item !== vert2
);
this.adjacencyList[vert2] = this.adjacencyList[vert2].filter(
(item) => item !== vert1
);
}
removeVertex(val) {
for (let child of this.adjacencyList[val]) {
this.removeEdge(val, child);
}
delete this.adjacencyList[val];
}
printMe() {
for (let property in this.adjacencyList) {
console.log(property, this.adjacencyList[property]);
}
}
}
myGraph = new Graph();
myGraph.addVertex("Tokyo");
myGraph.addVertex("LA");
myGraph.addVertex("CO");
myGraph.addEdge("Tokyo", "LA");
myGraph.addEdge("LA", "CO");
myGraph.printMe();
myGraph.removeEdge("Tokyo", "LA");
myGraph.printMe();
myGraph.addVertex("NJ");
myGraph.addVertex("FL");
myGraph.addVertex("SF");
myGraph.addEdge("SF", "LA");
myGraph.addEdge("CO", "NJ");
myGraph.addEdge("FL", "NJ");
myGraph.addEdge("FL", "LA");
myGraph.printMe();
myGraph.removeVertex("LA");
myGraph.printMe();
class Graph:
def __init__(self):
self.adjacencyList = {}
def addVertex(self, val):
self.adjacencyList[val] = []
def addEdge(self, vert1, vert2):
# self.adjacencyList[vert1] = self.adjacencyList[vert1] + [vert2]
# self.adjacencyList[vert2] = self.adjacencyList[vert2] + [vert1]
# self.adjacencyList[vert1] += [vert2]
# self.adjacencyList[vert2] += [vert1]
self.adjacencyList[vert1].append(vert2)
self.adjacencyList[vert2].append(vert1)
def removeEdge(self, vert1, vert2):
self.adjacencyList[vert1] = [item for item in self.adjacencyList[vert1] if item != vert2]
self.adjacencyList[vert2] = [item for item in self.adjacencyList[vert2] if item != vert1]
def removeVertex(self, val):
children = self.adjacencyList[val]
for child in children:
self.removeEdge(val, child)
del self.adjacencyList[val]
# print(self.adjacencyList[val])
def print_me(self):
for k,v in self.adjacencyList.items():
print(k,v)
myGraph = Graph()
myGraph.addVertex('Tokyo')
myGraph.addVertex('LA')
myGraph.addVertex('CO')
myGraph.addEdge('Tokyo', 'LA')
myGraph.addEdge('LA', 'CO')
myGraph.print_me()
myGraph.removeEdge('Tokyo', 'LA')
myGraph.print_me()
myGraph.addVertex('NJ')
myGraph.addVertex('FL')
myGraph.addVertex('SF')
myGraph.addEdge('SF', 'LA')
myGraph.addEdge('CO', 'NJ')
myGraph.addEdge('FL', 'NJ')
myGraph.addEdge('FL', 'LA')
myGraph.print_me()
myGraph.removeVertex('LA')
myGraph.print_me()