We found 16 Reddit comments about Algorithms. Here are the top ones, ranked by their Reddit score.
As far as books go:
Algorithms by Dasgupta, Papadimitrou, Vazirani. This is the most concise algorithms book I've read. It is very to-the-point and has a good collection of algorithms with their proofs.
My algorithms class presupposed that I took linear algebra, I think. I think you'll need to be able to do maths, but they taught me the maths I needed to know as I went along. It depends on the course, though. Here's the book we used in class. Here's its home page, but the link seems to be broken. It should be online for free. For example, I found another copy here. Here's the PDF Also a free book on linear algebra.
Lots of recurrence relations, set theory, formal logic and proofs, and of course graph theory. Every once in a while, a little calculus. ( I should note I do not have a PhD, this is just my experiences from some graduate-level courses) I hope this is the sort of description your looking for?
If you'd like a non-gargantuan book to read that gives a good intro to this topic, I'd recommend this one It mostly covers the analysis of algorithms but does go into complexity classes towards the end.
To do something "complex" (and perhaps by complex you mean "concrete" or "practical"?) with a programming language like python, you'll probably want to learn more about programming language libraries.
The libraries that accompany a programming language are what give it most of its practical power -- they are the bridge between the high-level programming language and the low-level operating system / hardware. You may want to look at some of these, or other libraries, just to get some ideas flowing: wxWidgets (and wxPython in particular, for designing window-based interfaces), OpenGL (for graphics), and ODBC database interfaces (for storing and retrieving large amounts of structured data).
Without an understanding of the OS or the available programming language libraries, you'll end up staying on the abstract side of things. I have a hunch that you might enjoy the book "The Elements of Computing Systems".
On the other hand, if what you want is more complexity while staying in the abstract realm, you could get a good book on Algorithms.
The word "beginner" is loaded. In my opinion, it is better for beginners to start on algorithms with:
Copy pasting my response to a similar question:
Edited to have more resources and be easier to read.
It's hard to draw the line between "essential" and "recommended." That depends a lot on what you want to do. So, I will present a rough outline of core topics covered in the 4 year CS program at my university (UC Berkeley). This is not a strict order of topics, but prerequisites occur before topics that depend on them.
Topics include Environments/Scoping, abstraction, recursion, Object oriented vs functional programming models, strings, dictionaries, Interpreters. Taught in Python.
The class is based on the classic MIT text, "Structure and Interpretation of Computer Programs." Of course, that book is from 1984 and uses Scheme, which many people don't want to learn due to its rarity in industry. We shifted recently to reading materials based on SICP, but presented in python. I believe this is the reading used now. This course is almost entirely posted online. The course page is visible to public, and has the readings, discussion slides / questions and solutions, project specs, review slides, etc. You can find it here.
Data Structures and basic algorithms
DS: Arrays, Linked Lists, Trees (Binary search, B, Spaly, Red-Black), Hash Tables, Stacks/Queues, Heaps, Graphs. Algorithms: Search (Breadth first vs depth first), Sorting (Bubble, radix, bucket, merge, quick, selection, insert, etc), Dijkstra's and Kruskal's, Big-O analysis.
This class uses two books: "Head First Java" and "Data Structures and Algorithms in Java" (any edition except 2). The class doesn't presupposed knowledge in any language, so the first portion is covering Object Oriented principles and Java from a java book (doesn't really matter which), then moving to the core topics of data structures and algorithms. The course page has some absolutely fantastic notes -- I skim through these before every interview to review. You can also check out the projects and homeworks if you want to follow along. The course page is available here (note that it gets updated with new semesters, and links will be removed -- download them soon if you want to use them).
Machine Structures (Intro Architecture)
Warehouse scale computing (Hadoop Map-Reduce). C language, basics of assemblers/compilers/linkers, bit manipulation, number representation. Assembly Language (MIPS). CPU Structure, pipelining, threading, virtual memory paging systems. Caching / memory hierarchy. Optimization / Performance analysis, parallelism (Open MP), SIMD (SSE Intrinsics).
This class uses two books: "The C Programming Language" and "Computer Organization and Design". This class is taught primarily in C, so the first few weeks are spent as a crash course in C, along with a discussion/project using Map-Reduce. From there in jumps into Computer Organization and Design. I personally loved the projects I did in this class. As with above, the lecture slides, discussion notes, homeworks, labs, solutions, and projects are all available on an archived course page.
Discrete Math / Probability Theory
Logic, Proofs, Induction, Modular Arithmetic (RSA / Euclid's Algorithm). Polynomials over finite fields. Probability (expectation / variance) and it's applicability to hashing. Distributions, Probabilistic Inference. Graph Theory. Countability.
Time to step away from coding! This is a math class, plain and simple. As for book, well, we really didn't have one. The class is based on a series of "Notes" developed for the class. When taken as a whole, these notes serve as the official textbook. The notes, homeworks, etc are here.
Efficient Algorithms and Intractable Problems
Designing and analyzing algorithms. Lower bounds. Divide and Conquer problems. Search problems. Graph problems. Greedy algorithms. Linear and Dynamic programming. NP-Completeness. Parallel algorithms.
The Efficient Algorithms class stopped posting all of the resources online, but an archived version from 2009 has homeworks, reading lists, and solutions. This is the book used.
Operating Systems and System Programming
Concurrency and Synchronization. Memory and Caching. Scheduling and Queuing theory. Filesystems and databases. Security. Networking.
The Operating Systems class uses this book, and all of the lectures and materials are archived here (Spring 2013).
Those are the core classes, not including about 4 (minimum) required technical upper division electives to graduate with a B.A. in CS. The math required is:
Ah, okay on that I agree. I thought originally you were dismissing reading entire books in general because of tools like google which gives instant access to individual bits of information.
Particularly, for algorithm design, this one I read for college. It starts out with a motivation, what is an algorithm? Why do we study them? It then gives definitions for how to measure the performance of an algorithm. With a metric established, it picks a basic process we take for granted, addition, and breaks it down to how a computer would run the algorithm that we run in our heads. Then, it introduces an alternative algorithm that actually performs better than the one we use intuitively. And this is all in the first chapter. Every paragraph builds on another, relates back to the chapter, and ultimately, the theme of the book which implores us to answer the questions: Can we solve this problem? If so, how fast? And can we do better? Dynamic programming, divide-and-conquer, linear programming are all useful tools in and of themselves, but unified they provide a coherent narrative: What kinds of problems can computers never solve? How should one approach a problem that, on the surface, seems unfamiliar? And to be fair, the insights are expressed directly. In italics. At the beginning of the textbook. But it wouldn't have much meaning unless you understood the context in which the insights related to. Anywho, this is just one example of many where reading a book in its entirety allowed me to gain a valuable skill (or in literature, a different perspective), rather than a fixed atom of knowledge.
I guess when I first read your post, it worried me when you said that the information density of most books is impractically small and that the value of most books lie in random particles dispersed throughout, rather than as a unified collection of ideas. For me, it has been the opposite: the majority of books I've read, though time consuming, have paid enormous dividends not because of the discrete particles of knowledge they dispensed (Hamlet kills Claudius), but rather because they have changed the way I look at life (what am I tasked to do by my family or society, what purpose is worth acting for?) Though it seems like you understand this already, you just don't like the fact that the author seems to advocate for undue amounts of reading because "that's how it was in my day".
It's a great course and Dimitris is a very good teacher. It is pretty challenging and Dimitris expects you to keep up, so most importantly take it seriously and make sure you intuitively and analytically understand each part. Ask questions and go to office hours. Some of the techniques taught in this class are very important for use in industry.
When I took the class he used Algorithms by Dasgupta:http://www.amazon.com/Algorithms-Sanjoy-Dasgupta/dp/0073523402
There used to be a free PDF available as well.
CLRS is the standard text for algorithms, but it is not obviously student-friendly. (I can't learn from it very well, and there are few exercises.) I'd recommend you take a look at this book, written by reputable authors, which is easy to read, covers interesting topics in addition to the standard core, and has tons of exercises. The book used to be available online but now McGraw Hill has told the authors to take it down. Googling "Dasgupta Algorithms" will give you a pdf either way.
[Also note the book's chapter on complexity. It provides a nice intuitive intro into NP-completeness that's somewhat light on rigour and uses non-standard definitions, but reading it first might make understanding Sipser easier.]
Thank you for your comment. Yep, regarding the pedagogy of LP, I have pretty much covered what you say here
>This shows that LPs can be solved in finite time, which isn't even obvious. It also introduces the essential idea behind simplex, namely that a vertex can be described combinatorially by choosing n of the k inequalities.
in a previous article. Also this book [Algorithms - Dasgupta, Papadimitriou, Vazirani] inspired me to write about LP in a more intuitive way, it has a really good introductory chapter in LP :)
The most common textbook is this:
I learned from this:
Can't say anything about Free Code Camp, but I will say that work experience at the best company that will take you is likely going to trump anything you do on the side OR a master's. You should, ofc, learn as aggressively as possible regardless.
At last, a question in my domain! Wikipedia actually provides a very good beginner's introduction to computational complexity theory. You should start at O(n) notation (big-O notation) and go from there to the articles on computational complexity.
There are also wonderful books like Dasgupta, Papadimitriou, and Vazirani's textbook "Algorithms". The latter third of the book will teach you about computational complexity theory, but the first two-thirds will teach you much of what you need to know to understand it. http://www.amazon.com/Algorithms-Sanjoy-Dasgupta/dp/0073523402
If you have any questions as you read feel free to PM me directly.
The suggested textbook. Authors' initials. This one (don't know if correct edition). https://www.amazon.com/Algorithms-Sanjoy-Dasgupta/dp/0073523402
A few more to consider:
A recent book that looks like fun is the Nature of Computation.
Sipser's book on theory of computation is good.
Algorithms by Dasgupta, Papadimitriou, and Vazirani is a very accessible algorithms book, as is Skiena. CLRS is a good reference, but dull as a read.
Comprehensive Mathematics for Computer Scientists volumes one and two might be interesting to look at.