Algorithms Implemented in Python
github.com
github.com
Here's a short list of things I found that were really bad, all of which we teach our first-year students how to do correctly:
- the entire `Graphs/` directory is a dumpster fire. The implementation of Dijkstra's algorithm doesn't use a priority queue, nor does that of Prim's MST algorithm. Both of these also use a strange hard-coded maximum distance of 100000 for no reason. Both Kruskal implementations are bad, too: one doesn't use any kind of Union-Find data structure, the other uses a naive version which has terrible worst case behaviour.
- There is another implementation of Dijkstra's algorithm in `data_structures/Graph/dijkstra.py` that is just as bad.
- The DFS implementation in `data_structures/Graph/DepthFirstSearch.py` isn't a DFS.
- The sorting and selection algorithms are comically bad, too. `sorts/merge_sort_fastest.py` really takes the cake here. It is neither a mergesort nor fast (it's a weird non-inplace implementation of cocktail shaker sort, with quadratic best- and worst-case behaviour). The quicksort at `sorts/quick_sort.py` always uses the first element as a pivot, which is a bad idea. Its partitioning also copies the entire data in every recursive step, which is an even worse idea. The quickselect in `searches/quick_select.py` at least uses a random pivot, but also partitions out-of-place.
- Why does this contain an implementation of FTP?
Discussed here a month ago:
Others have already addressed the incorrectly implemented algorithms, so let me instead point out that there is an ebook about prehistoric humans in the “ciphers” folder: https://github.com/TheAlgorithms/Python/blob/master/ciphers/...
(Robert J. Braidwood - Prehistoric Men)
https://github.com/TheAlgorithms/Python/blob/d4b4b7ba35cc4e1...
pivot = random.randint(0, len(list) - 1)
pivot = list[pivot]
which is bad at every possible level. First, it can be a one liner with `pivot = random.choice(list)`, but also, reusing the same variable over and over again is discouraged.Again, congrats to the team that put this together for free and with probably the best intentions. But if you're using it, be aware that the code might be worth a refactor.
I like Human Ressource Machine, because it rates me on code length and complexity. But the types of algorithms seems limited.
I like project Euler for its variety, but I don't get any feedback on quality of my solutions.
Is there a good middle ground?
They have an automated grader that runs through a number of test cases (some of which are hidden from you). Unfortunately, after the first few problems unless you're a paid student you only get an input file and a box to enter your result in.
No direct feedback on complexity, but the automated grader has some limits on execution time and memory use that at least tell you whether your implementation is "good enough."
Nice (even animated) illustrations in readme.
The categories are:
* Sorting
* Searching
* Ciphers
As well as others, which aren't listed in the README.