4 ms·
Sometimes. Sometimes you just need to throw things in the oven until the first one browns up. I recently had a problem where I needed an adjacency matrix of s
by R_haterade 10y ago
Sometimes. Sometimes you just need to throw things in the oven until the first one browns up.
I recently had a problem where I needed an adjacency matrix of shortest paths. It was a choice between dijkstra and floyd-warshall. My dijkstra implementation kicked the pants off of floyd warshall for this application by an order of magnitude, which you wouldn't really expect. And the big-O complexity was the same for both algorithms, it's just that for the graph structure, the operation count for dijkstra was much lower. It was the first one to brown up.
- bogomipz 10y agoYes and its good to know the limits of Big O as you mentioned Big O tells you what an upper bound on something is but it will provide no answer as to which to which of two algorithms with the same upper bound will be faster. There is a field that deals with this and I watched some lectures by Robert Sedgewick called "Analytic Combinatorics" where he talks about a different analysis to do just that. He talks about being able to tell large institutional clients exactly how long an algorithm on a particular input will take and how important this was in the 1970s when computing power was much slower and far more expensive.
- R_haterade 10y agoI will have to check this out as I'm in a lot of places where speed matters these days. Does he delve into the nuts and bolts of data structure for this, or does it stay more theoretical?
- bogomipz 10y agoIts both. Here are some links: Video Lectures are here: https://www.coursera.org/learn/analysis-of-algorithms https://www.coursera.org/learn/analysis-of-algorithms and the book: http://aofa.cs.princeton.edu/home/ http://aofa.cs.princeton.edu/home/ Also a youtube - short history of algorithm analysis by Sedgewick is worth a watch: https://www.youtube.com/watch?v=qap2MyBTSZk https://www.youtube.com/watch?v=qap2MyBTSZk
- gk101 10y agoA few comments just in case this a critical part of your program, and if running it faster would help: 1. Using a heap with Dijkstra's algorithm would speed up your program From your comment I am guessing you are using Dijkstra's algorithm without a heap, which gives O(n * m) for one source, and O(n^2 * m) for all sources (all pairs shortest path), where n is the number of nodes/vertices, and m is the number of edges You would be able to improve that to O(m * n * lgn) by using a heap, which improves the time to run it by quite a lot in practice 2. The time it takes to run the program also depends on the density of your matrix: In the case where the graph is sparse: m ~ n, and will result in O(n^2 * lgn) (or O(n^3) without a heap) In the case where the graph is dense: m ~ n^2, and will result in O(n^3 * lgn) (or O(n^4) without a heap) Compare the numbers above to O(n^3), which is the time complexity of Floyd-Warshall So just in terms of time complexity, Floyd-Warshall would be faster in a dense graph
- R_haterade 10y agoAgreed, but this was for a fast script that will probably run 100 times for analysis purposes--the code itself wasn't the end goal. I just needed something that could crunch my numbers in 10 minutes instead of 2 hours. :-)
- R_haterade 10y agoI do want to express that I appreciate the effort you put into this post. Algorithms and data structures are my weakest point right now, and being able to read through your explanation is a helpful thing.