From d4463b5ba9d5c394419f62c1b1d8d0dd0db352ce Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Thu, 9 Aug 2018 21:38:37 -0700 Subject: [PATCH 01/12] first draft of Dijkstra --- .../code/python/dijkstra.py | 53 +++++++++++++++++++ .../dijkstra-algorithm/dijkstra_algorith.md | 1 + 2 files changed, 54 insertions(+) create mode 100644 contents/dijkstra-algorithm/code/python/dijkstra.py create mode 100644 contents/dijkstra-algorithm/dijkstra_algorith.md diff --git a/contents/dijkstra-algorithm/code/python/dijkstra.py b/contents/dijkstra-algorithm/code/python/dijkstra.py new file mode 100644 index 000000000..22c442e9a --- /dev/null +++ b/contents/dijkstra-algorithm/code/python/dijkstra.py @@ -0,0 +1,53 @@ +import sys +from itertools import product + +class Graph: + def __init__(self, vertices, edges): + self.vertices = vertices + self.edges = {} + + for x, y, delta in edges: + self.edges.setdefault(x, {})[y] = delta + self.edges.setdefault(y, {})[x] = delta + + def route(self, start, end): + unvisited = {x for x in self.vertices if x != start} + distances = {k: 0 if k == start else sys.maxsize for k in self.vertices} + paths = {k: [] if k == start else None for k in self.vertices} + + current = start + while current != end and len(unvisited) > 0: + for n, d in self.edges[current].items(): + if distances[current] + d < distances[n]: + distances[n] = distances[current] + d + paths[n] = paths[current] + ([current] if current != start else []) + + next_node = None + for n in unvisited: + if next_node is None or distances[n] < distances[next_node]: + next_node = n + + if next_node is not None: + unvisited.remove(next_node) + current = next_node + else: + break + + if distances[end] is not sys.maxsize: + return distances[end], paths[end] + else: + return None, [] + + + +def main(): + v = [1, 2, 3, 4, 5, 6] + e = [(1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 4, 11), (3, 6, 2), (4, 5, 6), (5, 6, 9)] + g = Graph(v, e) + + for x, y in product(v, v): + d, p = g.route(x, y) + print('Going from {} to {} with distance {} by way of {}'.format(x, y, d, p)) + +if __name__ == '__main__': + main() diff --git a/contents/dijkstra-algorithm/dijkstra_algorith.md b/contents/dijkstra-algorithm/dijkstra_algorith.md new file mode 100644 index 000000000..323fae03f --- /dev/null +++ b/contents/dijkstra-algorithm/dijkstra_algorith.md @@ -0,0 +1 @@ +foobar From 71b8415428e6118d3b2c05acbb84def7fa8beb4f Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Fri, 10 Aug 2018 13:09:04 -0700 Subject: [PATCH 02/12] second draft of Dijkstra --- .../code/python/dijkstra.py | 21 +++++++++++-------- .../dijkstra.md} | 0 2 files changed, 12 insertions(+), 9 deletions(-) rename contents/{dijkstra-algorithm => dijkstra}/code/python/dijkstra.py (76%) rename contents/{dijkstra-algorithm/dijkstra_algorith.md => dijkstra/dijkstra.md} (100%) diff --git a/contents/dijkstra-algorithm/code/python/dijkstra.py b/contents/dijkstra/code/python/dijkstra.py similarity index 76% rename from contents/dijkstra-algorithm/code/python/dijkstra.py rename to contents/dijkstra/code/python/dijkstra.py index 22c442e9a..d2280b7c2 100644 --- a/contents/dijkstra-algorithm/code/python/dijkstra.py +++ b/contents/dijkstra/code/python/dijkstra.py @@ -10,13 +10,13 @@ def __init__(self, vertices, edges): self.edges.setdefault(x, {})[y] = delta self.edges.setdefault(y, {})[x] = delta - def route(self, start, end): + def route(self, start): unvisited = {x for x in self.vertices if x != start} distances = {k: 0 if k == start else sys.maxsize for k in self.vertices} paths = {k: [] if k == start else None for k in self.vertices} current = start - while current != end and len(unvisited) > 0: + while len(unvisited) > 0: for n, d in self.edges[current].items(): if distances[current] + d < distances[n]: distances[n] = distances[current] + d @@ -33,11 +33,12 @@ def route(self, start, end): else: break - if distances[end] is not sys.maxsize: - return distances[end], paths[end] - else: - return None, [] + for n, d in distances.items(): + if d == sys.maxsize: + distances[n] = None + paths[n] = None + return distances, paths def main(): @@ -45,9 +46,11 @@ def main(): e = [(1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 4, 11), (3, 6, 2), (4, 5, 6), (5, 6, 9)] g = Graph(v, e) - for x, y in product(v, v): - d, p = g.route(x, y) - print('Going from {} to {} with distance {} by way of {}'.format(x, y, d, p)) + for x in v: + d, p = g.route(x) + print('Starting at {}:'.format(x)) + for y in v: + print('\t-> {} with distance {} via path {}'.format(y, d[y], p[y])) if __name__ == '__main__': main() diff --git a/contents/dijkstra-algorithm/dijkstra_algorith.md b/contents/dijkstra/dijkstra.md similarity index 100% rename from contents/dijkstra-algorithm/dijkstra_algorith.md rename to contents/dijkstra/dijkstra.md From 5ea491d35614c92f6179230732f04b074d857327 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Fri, 10 Aug 2018 13:19:53 -0700 Subject: [PATCH 03/12] first draft of chapter text --- contents/dijkstra/dijkstra.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/contents/dijkstra/dijkstra.md b/contents/dijkstra/dijkstra.md index 323fae03f..b7aa4268d 100644 --- a/contents/dijkstra/dijkstra.md +++ b/contents/dijkstra/dijkstra.md @@ -1 +1,11 @@ -foobar +# Dijkstra's Algorithm +Edsger Dijkstra was one of the foremost computer scientists of the 20th century. He pioneered a large body of work that is integral to modern theoretical computer science and software engineering. A graph algorithm bearing his name is but one of his major contributions, but it is one to which he is most often associated. The algorithm is used to efficiently find shortest paths between vertices in a weighted graph, with the condition that the graph satisfies the [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality). + +{% method %} +{% sample lang="py" %} +[import:4-9, lang:"python"](code/python/dijkstra.py) +{% endmethod %} + + \ No newline at end of file From 07bd750a0f17856393dc3bcac04ba376fe338e6c Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Fri, 10 Aug 2018 13:42:24 -0700 Subject: [PATCH 04/12] Update dijkstra.md --- contents/dijkstra/dijkstra.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/contents/dijkstra/dijkstra.md b/contents/dijkstra/dijkstra.md index b7aa4268d..d5a6ce431 100644 --- a/contents/dijkstra/dijkstra.md +++ b/contents/dijkstra/dijkstra.md @@ -1,11 +1,17 @@ # Dijkstra's Algorithm -Edsger Dijkstra was one of the foremost computer scientists of the 20th century. He pioneered a large body of work that is integral to modern theoretical computer science and software engineering. A graph algorithm bearing his name is but one of his major contributions, but it is one to which he is most often associated. The algorithm is used to efficiently find shortest paths between vertices in a weighted graph, with the condition that the graph satisfies the [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality). +Edsger Dijkstra was one of the foremost computer scientists of the 20th century. He pioneered a large body of work that is integral to modern theoretical computer science and software engineering. A graph algorithm bearing his name is but one of his major contributions, but it is one to which he is most often associated. The algorithm is used to efficiently find shortest paths between vertices in a weighted graph, with the condition that the graph satisfies the [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality). The edge weights of the graph may be any positive numbers. + +The algorithm is fairly simple and uses the assumption about the triangle inequality to ignore paths that can't be shorter than ones already known. Two variations of the algorithm exist: one which finds the shortest path between two vertices `x` and `y`, terminating once one such path is found, and one which finds the shortest path between a start vertex `x` and all other vertices in the same connected component of the graph. These two variations are functionally the same, but the former is able to terminate early once its narrower goal is met. We will focus on the latter variant, but the code for the former is very similar. + +To begin, start at the first vertex `x` and make a set of all the other "unvisited" vertices in the graph. Initialize a structure to store the shortest known path to all vertices, with a path of zero weight to the start vertex and infinity (or a suitably large constant) to all others. Next, look at all the neighbors of `x`. By the triangle inequality, we know that following each adjacent edge to `x` will yield a shortest path to each of the neighbors of `x`. Thus, we have found shortest paths to each of these. Record these shortest paths (both the vertices crossed and the total path weight) in the auxilary data structure(s). Now, step to the vertex `z` whose path weight is the lowest. Remove that vertex from the unvisited set. Repeat the above process from this vertex, noting that a shortest path to all of `z`'s neighbors must go through `z` and will have a total path weight of the `x`-`z` path plus the edge weight being traversed. Repeat this process of improving shortest known paths, choosing vertices from the unvisited set whose known paths are the shortest, and checking neighbors until there remain no known paths to vertices of total weight less than infinity. Once we have run out of vertices to visit in the component of `x`, then we have found the shortest paths from `x` to connected vertices. {% method %} {% sample lang="py" %} [import:4-9, lang:"python"](code/python/dijkstra.py) {% endmethod %} + + \ No newline at end of file + From 59c95e2f9f5aff941f815abebec309b4c2395ccd Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Fri, 10 Aug 2018 13:58:04 -0700 Subject: [PATCH 05/12] changed to work with disconnected graphs --- contents/dijkstra/code/python/dijkstra.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/contents/dijkstra/code/python/dijkstra.py b/contents/dijkstra/code/python/dijkstra.py index d2280b7c2..75f3b9e6d 100644 --- a/contents/dijkstra/code/python/dijkstra.py +++ b/contents/dijkstra/code/python/dijkstra.py @@ -4,11 +4,11 @@ class Graph: def __init__(self, vertices, edges): self.vertices = vertices - self.edges = {} + self.edges = {v: {} for v in self.vertices} for x, y, delta in edges: - self.edges.setdefault(x, {})[y] = delta - self.edges.setdefault(y, {})[x] = delta + self.edges[x][y] = delta + self.edges[y][x] = delta def route(self, start): unvisited = {x for x in self.vertices if x != start} @@ -24,7 +24,7 @@ def route(self, start): next_node = None for n in unvisited: - if next_node is None or distances[n] < distances[next_node]: + if distances[n] < sys.maxsize and (next_node is None or distances[n] < distances[next_node]): next_node = n if next_node is not None: @@ -50,7 +50,10 @@ def main(): d, p = g.route(x) print('Starting at {}:'.format(x)) for y in v: - print('\t-> {} with distance {} via path {}'.format(y, d[y], p[y])) + if d[y]: + print('\t-> {} with distance {} via path {}'.format(y, d[y], p[y])) + else: + print('\t-> {} does not exist'.format(y)) if __name__ == '__main__': main() From 500a424425e0487182c0cce1427977084fd37da0 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Fri, 10 Aug 2018 17:10:39 -0700 Subject: [PATCH 06/12] added more complicated test graph --- contents/dijkstra/code/python/dijkstra.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contents/dijkstra/code/python/dijkstra.py b/contents/dijkstra/code/python/dijkstra.py index 75f3b9e6d..212fb5b64 100644 --- a/contents/dijkstra/code/python/dijkstra.py +++ b/contents/dijkstra/code/python/dijkstra.py @@ -42,15 +42,19 @@ def route(self, start): def main(): - v = [1, 2, 3, 4, 5, 6] - e = [(1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 4, 11), (3, 6, 2), (4, 5, 6), (5, 6, 9)] + v = list(range(1, 24)) # 1-23 + e = [ + (1, 2, 5), (2, 3, 7), (3, 4, 1), (3, 11, 5), (3, 12, 7), (4, 5, 4), (4, 11, 5), (5, 6, 6), (5, 14, 20), (6, 7, 7), (6, 8, 11), (6, 14, 11), + (8, 9, 4), (8, 15, 2), (9, 10, 5), (10, 11, 12), (10, 12, 17), (12, 13, 10), (12, 16, 2), (13, 14, 5), (14, 15, 10), (15, 16, 9), (17, 18, 1), + (17, 20, 6), (18, 19, 7), (18, 21, 10), (19, 22, 4), (20, 21, 5), (21, 22, 4) + ] g = Graph(v, e) for x in v: d, p = g.route(x) print('Starting at {}:'.format(x)) for y in v: - if d[y]: + if d[y] is not None: print('\t-> {} with distance {} via path {}'.format(y, d[y], p[y])) else: print('\t-> {} does not exist'.format(y)) From b6097bead30b876e103f2c2c4ef4f27cf83fbfc1 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Thu, 16 Aug 2018 23:28:44 -0700 Subject: [PATCH 07/12] bit of code cleanup --- contents/dijkstra/code/python/dijkstra.py | 38 +++++++++++++---------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/contents/dijkstra/code/python/dijkstra.py b/contents/dijkstra/code/python/dijkstra.py index 212fb5b64..fd005b0b1 100644 --- a/contents/dijkstra/code/python/dijkstra.py +++ b/contents/dijkstra/code/python/dijkstra.py @@ -6,22 +6,25 @@ def __init__(self, vertices, edges): self.vertices = vertices self.edges = {v: {} for v in self.vertices} - for x, y, delta in edges: - self.edges[x][y] = delta - self.edges[y][x] = delta + for x, y, dist in edges: + self.edges[x][y] = dist + self.edges[y][x] = dist - def route(self, start): + def route_from(self, start): + current = start unvisited = {x for x in self.vertices if x != start} distances = {k: 0 if k == start else sys.maxsize for k in self.vertices} paths = {k: [] if k == start else None for k in self.vertices} - current = start while len(unvisited) > 0: + # Check all edges incident to our current vertex, looking for improved paths to neighbors for n, d in self.edges[current].items(): if distances[current] + d < distances[n]: distances[n] = distances[current] + d paths[n] = paths[current] + ([current] if current != start else []) + # Find the next vertex to iterate on. This should be a vertex for which we've found a path, but + # whose path is a shortest length of that to all the yet-unvisited vertices. next_node = None for n in unvisited: if distances[n] < sys.maxsize and (next_node is None or distances[n] < distances[next_node]): @@ -31,8 +34,11 @@ def route(self, start): unvisited.remove(next_node) current = next_node else: + # This break handles the scenario in which our graph is disconnected, and we've found optimal paths + # to all vertices in the component we began our search in. break + # Clean-up our output to better indicate which vertices are disconnected from our start vertex for n, d in distances.items(): if d == sys.maxsize: distances[n] = None @@ -42,22 +48,22 @@ def route(self, start): def main(): - v = list(range(1, 24)) # 1-23 - e = [ + vertices = list(range(1, 24)) # 1-23 + edges = [ (1, 2, 5), (2, 3, 7), (3, 4, 1), (3, 11, 5), (3, 12, 7), (4, 5, 4), (4, 11, 5), (5, 6, 6), (5, 14, 20), (6, 7, 7), (6, 8, 11), (6, 14, 11), (8, 9, 4), (8, 15, 2), (9, 10, 5), (10, 11, 12), (10, 12, 17), (12, 13, 10), (12, 16, 2), (13, 14, 5), (14, 15, 10), (15, 16, 9), (17, 18, 1), (17, 20, 6), (18, 19, 7), (18, 21, 10), (19, 22, 4), (20, 21, 5), (21, 22, 4) ] - g = Graph(v, e) - - for x in v: - d, p = g.route(x) - print('Starting at {}:'.format(x)) - for y in v: - if d[y] is not None: - print('\t-> {} with distance {} via path {}'.format(y, d[y], p[y])) + g = Graph(vertices, edges) + + for start in vertices: + distances, paths = g.route_from(start) + print('Starting at {}:'.format(start)) + for end in vertices: + if distances[end] is not None: + print('\t-> {} with distance {} via path {}'.format(end, distances[end], paths[end])) else: - print('\t-> {} does not exist'.format(y)) + print('\t-> {} does not exist'.format(end)) if __name__ == '__main__': main() From 12c15cdd2de13f34263cd7c65b6f445a7948e6ac Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Thu, 16 Aug 2018 23:42:22 -0700 Subject: [PATCH 08/12] cleaned up writing --- contents/dijkstra/dijkstra.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contents/dijkstra/dijkstra.md b/contents/dijkstra/dijkstra.md index d5a6ce431..18d06d410 100644 --- a/contents/dijkstra/dijkstra.md +++ b/contents/dijkstra/dijkstra.md @@ -1,9 +1,11 @@ # Dijkstra's Algorithm Edsger Dijkstra was one of the foremost computer scientists of the 20th century. He pioneered a large body of work that is integral to modern theoretical computer science and software engineering. A graph algorithm bearing his name is but one of his major contributions, but it is one to which he is most often associated. The algorithm is used to efficiently find shortest paths between vertices in a weighted graph, with the condition that the graph satisfies the [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality). The edge weights of the graph may be any positive numbers. -The algorithm is fairly simple and uses the assumption about the triangle inequality to ignore paths that can't be shorter than ones already known. Two variations of the algorithm exist: one which finds the shortest path between two vertices `x` and `y`, terminating once one such path is found, and one which finds the shortest path between a start vertex `x` and all other vertices in the same connected component of the graph. These two variations are functionally the same, but the former is able to terminate early once its narrower goal is met. We will focus on the latter variant, but the code for the former is very similar. +The algorithm is fairly simple and uses the assumption about the triangle inequality to ignore potential paths that can't be shorter than ones already known. Two variations of the algorithm exist: one which finds the shortest path between two particular vertices `x` and `y`, terminating once one such path is found, and one which finds the shortest path between a start vertex `x` and all other vertices in the same connected component of the graph. These two variations are functionally the same, but the former is able to terminate once its narrower goal is met. We will focus on the latter variant, but the code for the former is very similar. -To begin, start at the first vertex `x` and make a set of all the other "unvisited" vertices in the graph. Initialize a structure to store the shortest known path to all vertices, with a path of zero weight to the start vertex and infinity (or a suitably large constant) to all others. Next, look at all the neighbors of `x`. By the triangle inequality, we know that following each adjacent edge to `x` will yield a shortest path to each of the neighbors of `x`. Thus, we have found shortest paths to each of these. Record these shortest paths (both the vertices crossed and the total path weight) in the auxilary data structure(s). Now, step to the vertex `z` whose path weight is the lowest. Remove that vertex from the unvisited set. Repeat the above process from this vertex, noting that a shortest path to all of `z`'s neighbors must go through `z` and will have a total path weight of the `x`-`z` path plus the edge weight being traversed. Repeat this process of improving shortest known paths, choosing vertices from the unvisited set whose known paths are the shortest, and checking neighbors until there remain no known paths to vertices of total weight less than infinity. Once we have run out of vertices to visit in the component of `x`, then we have found the shortest paths from `x` to connected vertices. +To begin, start at the first vertex `x` and make a set of all the other "unvisited" vertices in the graph. Initialize a structure to store the shortest known path to all vertices, with a path of zero weight to the start vertex and infinity (or a suitably large constant) to all others. Next, look at all the neighbors of `x`. By the triangle inequality, we know that following each adjacent edge to `x` will yield a shortest path to each of the neighbors of `x`. Thus, we have found shortest paths to each of these. Record these shortest paths (both the vertices crossed and the total path weight) in the auxilary data structure(s). + +Now, step to the vertex `z` whose path weight is the lowest. Remove that vertex from the unvisited set. Repeat the above process from this vertex, noting that a shortest path to each of `z`'s neighbors must go through `z` and will have a total path weight of the `x`-`z` path plus the weight of the edge being traversed. Repeat this process of improving shortest known paths, choosing vertices from the unvisited set whose known paths are the shortest, and checking neighbors until one of two terminating conditions is met. Either the unvisted set of vertices is exhausted (meaning we have traversed the entire graph), or no remaining unvisted vertices have known paths to them. This latter condition is met when the graph is disconnected, leaving us with vertices that cannot be reached from a start vertex via any path. Once either of these conditions is met, then we have found the shortest paths from `x` to all connected vertices. {% method %} {% sample lang="py" %} From fe939a20b76b338c720961b2d3300d3660ab92a2 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Mon, 20 Aug 2018 00:07:28 -0500 Subject: [PATCH 09/12] added GitBook top-level chapter --- SUMMARY.md | 39 ++++++++++++++++------------- contents/dijkstra/dijkstra.md | 2 +- contents/graph_algorithms/README.md | 4 +++ 3 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 contents/graph_algorithms/README.md diff --git a/SUMMARY.md b/SUMMARY.md index 569142807..d61ed7672 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -5,34 +5,37 @@ * [How To Contribute](contents/how_to_contribute/how_to_contribute.md) * [Version Control](contents/git_and_version_control/git_and_version_control.md) * [Data Structures](contents/data_structures/data_structures.md) - * [Stacks and Queues](contents/stacks_and_queues/stacks_and_queues.md) + * [Stacks and Queues](contents/stacks_and_queues/stacks_and_queues.md) * [Mathematical Background](contents/mathematical_background/mathematical_background.md) - * [Complexity Notation](contents/notation/notation.md) - * [Bit Logic](contents/bitlogic/bitlogic.md) - * [Convolutions](contents/convolutions/convolutions.md) - * [Taylor Series](contents/taylor_series_expansion/taylor_series_expansion.md) + * [Complexity Notation](contents/notation/notation.md) + * [Bit Logic](contents/bitlogic/bitlogic.md) + * [Convolutions](contents/convolutions/convolutions.md) + * [Taylor Series](contents/taylor_series_expansion/taylor_series_expansion.md) * [Sorting and Searching](contents/sorting_and_searching/sorting_and_searching.md) - * [Bubble Sort](contents/bubble_sort/bubble_sort.md) - * [Bogo Sort](contents/bogo_sort/bogo_sort.md) + * [Bubble Sort](contents/bubble_sort/bubble_sort.md) + * [Bogo Sort](contents/bogo_sort/bogo_sort.md) * [Tree Traversal](contents/tree_traversal/tree_traversal.md) * [Euclidean Algorithm](contents/euclidean_algorithm/euclidean_algorithm.md) * [Monte Carlo](contents/monte_carlo_integration/monte_carlo_integration.md) * [Matrix Methods](contents/matrix_methods/matrix_methods.md) - * [Gaussian Elimination](contents/gaussian_elimination/gaussian_elimination.md) - * [Thomas Algorithm](contents/thomas_algorithm/thomas_algorithm.md) + * [Gaussian Elimination](contents/gaussian_elimination/gaussian_elimination.md) + * [Thomas Algorithm](contents/thomas_algorithm/thomas_algorithm.md) * [Computational Geometry](contents/computational_geometry/computational_geometry.md) - * [Gift Wrapping](contents/gift_wrapping/gift_wrapping.md) - * [Jarvis March](contents/jarvis_march/jarvis_march.md) - * [Graham Scan](contents/graham_scan/graham_scan.md) + * [Gift Wrapping](contents/gift_wrapping/gift_wrapping.md) + * [Jarvis March](contents/jarvis_march/jarvis_march.md) + * [Graham Scan](contents/graham_scan/graham_scan.md) * [FFT](contents/cooley_tukey/cooley_tukey.md) * [Decision Problems](contents/decision_problems/decision_problems.md) - * [Stable Marriage Problem](contents/stable_marriage_problem/stable_marriage_problem.md) + * [Stable Marriage Problem](contents/stable_marriage_problem/stable_marriage_problem.md) * [Differential Equation Solvers](contents/differential_equations/differential_equations.md) - * [Forward Euler Method](contents/forward_euler_method/forward_euler_method.md) + * [Forward Euler Method](contents/forward_euler_method/forward_euler_method.md) * [Physics Solvers](contents/physics_solvers/physics_solvers.md) - * [Verlet Integration](contents/verlet_integration/verlet_integration.md) - * [Quantum Systems](contents/quantum_systems/quantum_systems.md) - * [Split-Operator Method](contents/split-operator_method/split-operator_method.md) + * [Verlet Integration](contents/verlet_integration/verlet_integration.md) + * [Quantum Systems](contents/quantum_systems/quantum_systems.md) + * [Split-Operator Method](contents/split-operator_method/split-operator_method.md) * [Data Compression](contents/data_compression/data_compression.md) - * [Huffman Encoding](contents/huffman_encoding/huffman_encoding.md) + * [Huffman Encoding](contents/huffman_encoding/huffman_encoding.md) * [Quantum Information](contents/quantum_information/quantum_information.md) +* [Graph Algorithms](contents/graph_algorithms/README.md) + * [Dijkstra's Algorithm](contents/dijkstra/dijkstra.md) + diff --git a/contents/dijkstra/dijkstra.md b/contents/dijkstra/dijkstra.md index 18d06d410..a36aba09d 100644 --- a/contents/dijkstra/dijkstra.md +++ b/contents/dijkstra/dijkstra.md @@ -9,7 +9,7 @@ Now, step to the vertex `z` whose path weight is the lowest. Remove that vertex {% method %} {% sample lang="py" %} -[import:4-9, lang:"python"](code/python/dijkstra.py) +[import:1-69, lang:"python"](code/python/dijkstra.py) {% endmethod %} diff --git a/contents/graph_algorithms/README.md b/contents/graph_algorithms/README.md new file mode 100644 index 000000000..917e14642 --- /dev/null +++ b/contents/graph_algorithms/README.md @@ -0,0 +1,4 @@ +# Graph Algorithms +Graph Theory is a beautiful intersection of pure, abstract math and pragmatic computer science. The idea of a graph is a simple one to describe, but with an incredibly deep well of applications, both theoretical and practical. A graph is simply a collection of objects called *vertices* or *nodes* and connections between them called *edges*. This structure can be augmented in a variety of ways: duplicate edges, loops on single vertices, directed edges, etc. These structures are incredibly important to computer science as a variety of real-world systems can be modelled as graphs: computer networks, physical utility connections, user interactions, the list goes on. + +Algorithms on these objects are thus very important if data is to be stored in such a way. Traversing graphs, finding vertices meeting some condition, optimizing various values, etc. This chapter focuses on a selection of prominent graph algorithms and circumstances in which they are often applied. From 6737c870c92b4a304f9240941c4d6e9577848dd6 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Sun, 19 Aug 2018 22:41:30 -0700 Subject: [PATCH 10/12] fixed indentation problem --- SUMMARY.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index d61ed7672..df211bb7b 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -5,36 +5,36 @@ * [How To Contribute](contents/how_to_contribute/how_to_contribute.md) * [Version Control](contents/git_and_version_control/git_and_version_control.md) * [Data Structures](contents/data_structures/data_structures.md) - * [Stacks and Queues](contents/stacks_and_queues/stacks_and_queues.md) + * [Stacks and Queues](contents/stacks_and_queues/stacks_and_queues.md) * [Mathematical Background](contents/mathematical_background/mathematical_background.md) - * [Complexity Notation](contents/notation/notation.md) - * [Bit Logic](contents/bitlogic/bitlogic.md) - * [Convolutions](contents/convolutions/convolutions.md) - * [Taylor Series](contents/taylor_series_expansion/taylor_series_expansion.md) + * [Complexity Notation](contents/notation/notation.md) + * [Bit Logic](contents/bitlogic/bitlogic.md) + * [Convolutions](contents/convolutions/convolutions.md) + * [Taylor Series](contents/taylor_series_expansion/taylor_series_expansion.md) * [Sorting and Searching](contents/sorting_and_searching/sorting_and_searching.md) - * [Bubble Sort](contents/bubble_sort/bubble_sort.md) - * [Bogo Sort](contents/bogo_sort/bogo_sort.md) + * [Bubble Sort](contents/bubble_sort/bubble_sort.md) + * [Bogo Sort](contents/bogo_sort/bogo_sort.md) * [Tree Traversal](contents/tree_traversal/tree_traversal.md) * [Euclidean Algorithm](contents/euclidean_algorithm/euclidean_algorithm.md) * [Monte Carlo](contents/monte_carlo_integration/monte_carlo_integration.md) * [Matrix Methods](contents/matrix_methods/matrix_methods.md) - * [Gaussian Elimination](contents/gaussian_elimination/gaussian_elimination.md) - * [Thomas Algorithm](contents/thomas_algorithm/thomas_algorithm.md) + * [Gaussian Elimination](contents/gaussian_elimination/gaussian_elimination.md) + * [Thomas Algorithm](contents/thomas_algorithm/thomas_algorithm.md) * [Computational Geometry](contents/computational_geometry/computational_geometry.md) - * [Gift Wrapping](contents/gift_wrapping/gift_wrapping.md) - * [Jarvis March](contents/jarvis_march/jarvis_march.md) - * [Graham Scan](contents/graham_scan/graham_scan.md) + * [Gift Wrapping](contents/gift_wrapping/gift_wrapping.md) + * [Jarvis March](contents/jarvis_march/jarvis_march.md) + * [Graham Scan](contents/graham_scan/graham_scan.md) * [FFT](contents/cooley_tukey/cooley_tukey.md) * [Decision Problems](contents/decision_problems/decision_problems.md) - * [Stable Marriage Problem](contents/stable_marriage_problem/stable_marriage_problem.md) + * [Stable Marriage Problem](contents/stable_marriage_problem/stable_marriage_problem.md) * [Differential Equation Solvers](contents/differential_equations/differential_equations.md) - * [Forward Euler Method](contents/forward_euler_method/forward_euler_method.md) + * [Forward Euler Method](contents/forward_euler_method/forward_euler_method.md) * [Physics Solvers](contents/physics_solvers/physics_solvers.md) - * [Verlet Integration](contents/verlet_integration/verlet_integration.md) - * [Quantum Systems](contents/quantum_systems/quantum_systems.md) - * [Split-Operator Method](contents/split-operator_method/split-operator_method.md) + * [Verlet Integration](contents/verlet_integration/verlet_integration.md) + * [Quantum Systems](contents/quantum_systems/quantum_systems.md) + * [Split-Operator Method](contents/split-operator_method/split-operator_method.md) * [Data Compression](contents/data_compression/data_compression.md) - * [Huffman Encoding](contents/huffman_encoding/huffman_encoding.md) + * [Huffman Encoding](contents/huffman_encoding/huffman_encoding.md) * [Quantum Information](contents/quantum_information/quantum_information.md) * [Graph Algorithms](contents/graph_algorithms/README.md) * [Dijkstra's Algorithm](contents/dijkstra/dijkstra.md) From b4b17f34c97b652cff677e6f68777dbcb0065052 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Mon, 20 Aug 2018 15:09:44 -0700 Subject: [PATCH 11/12] fixed triangle-inequality violation --- contents/dijkstra/code/python/dijkstra.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contents/dijkstra/code/python/dijkstra.py b/contents/dijkstra/code/python/dijkstra.py index fd005b0b1..a5e004c44 100644 --- a/contents/dijkstra/code/python/dijkstra.py +++ b/contents/dijkstra/code/python/dijkstra.py @@ -50,7 +50,7 @@ def route_from(self, start): def main(): vertices = list(range(1, 24)) # 1-23 edges = [ - (1, 2, 5), (2, 3, 7), (3, 4, 1), (3, 11, 5), (3, 12, 7), (4, 5, 4), (4, 11, 5), (5, 6, 6), (5, 14, 20), (6, 7, 7), (6, 8, 11), (6, 14, 11), + (1, 2, 5), (2, 3, 7), (3, 4, 1), (3, 11, 5), (3, 12, 7), (4, 5, 4), (4, 11, 5), (5, 6, 11), (5, 14, 20), (6, 7, 7), (6, 8, 11), (6, 14, 11), (8, 9, 4), (8, 15, 2), (9, 10, 5), (10, 11, 12), (10, 12, 17), (12, 13, 10), (12, 16, 2), (13, 14, 5), (14, 15, 10), (15, 16, 9), (17, 18, 1), (17, 20, 6), (18, 19, 7), (18, 21, 10), (19, 22, 4), (20, 21, 5), (21, 22, 4) ] From b692caae2a312b17f583013552945e430e08743c Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Mon, 20 Aug 2018 15:14:28 -0700 Subject: [PATCH 12/12] added sample graph to Dijkstra page --- contents/dijkstra/assets/sample_graph.png | Bin 0 -> 66236 bytes contents/dijkstra/dijkstra.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 contents/dijkstra/assets/sample_graph.png diff --git a/contents/dijkstra/assets/sample_graph.png b/contents/dijkstra/assets/sample_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3ce58172b4944b0783bcfc9b49a2a20fd25370 GIT binary patch literal 66236 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