As a programmer, mathematics is important basic knowledge to study some topics, especially Algorithms. Many websites, and my fellows suggest me to study Discrete Mathematics before going to Algorithms, so I want to know which Discrete Mathematics book is suitable for my needs?
Discrete Math knowledge is needed to become adept in proving the correctness and deriving the complexity of algorithms and data structures. You will be taught those in Algo/DS books, but you can only get the mathematical proficiency by practicing just discrete math.
Knuth book is very good for that. But IMHO, you will only need it if you for doing advanced proofs in DS/Algorithms.
For a beginner, it would be great to go over "Grimaldi" http://www.amazon.com/Discrete-Combinatorial-Mathematics-Applied-Introduction/dp/0201199122 and then quickly move to Algorithms.
Otherwise, you will continue going deep in Discrete Math and never get to Algorithms/DS.
Remember, Discrete Math does not teach you how to design algorithms or Data structures. That will come only by practicing Algorithm problems @ topcoder, acm icpc , spoj etc and reading books on Algos/DS or courses on those.
My 2 cents.
A very good textbook for discrete mathematics at an undergraduate level is the Kenneth Rosen book titled Discrete Mathematics and Its Applications.
The book provides solutions to half of the problems. You can also buy the Student's Solutions Guide. I don't own it, but I would suspect that it either provides the answers to the other half of the questions or provides a step-by-step guide to solving the problems (the book only provides final answers with minimal explanations of those answers).
It's used for the two-quarter sequence in Discrete Mathematics that is taken by computer science and software engineering majors, as well as a number of mathematics programs at my university. I kept this book around even after I took the course, and I'm currently using it to brush up on my discrete math skills for my Certified Software Development Associate exam.
Theres many different areas to discrete math, and many good books.
theres Graph Theory by Diestel, which has a free pdf version available at
theres generatingfunctionology by wilf, free pdf version at
Other books that are good include Enumerative combinatorics 1 and 2 by Richard P Stanley (a book which is sufficiently dense that having at least 1 analysis and algebra course each will help).
that being said, for more introductory expositions in terms of expected mathematical maturity, I'd suggest googling around and looking at various lecture notes of the "intro to combinatorics" or "mathematics for computer scientists" sorts. I found that MIT OCW's "mathematics for Computer Scientists" notes were quite nice when I looked at them several years ago.
has a link to the lecture notes. There are some really funny asides in it. One of my favorites "... anyone who says that is wrong, and you should make fun of them until they cry".
Also, If you want to dig even deeper into discrete math/ combinatorics, the value of building up a wee bit of mathematical basics in other areas of math. Complex Analysis, real analysis (at the level of at least baby rudin, and perhaps even up to functional analysis), maybe some probability up to its measure theory formulation level, and at least a smidge of abstract algebra. Then you can do stuff like look at the combinatorics of random processes (great for analyzing randomized algorithms) and look at cool problems like percolation.
theres probably other things I should suggest, but the point is discrete math is accessible without that much of a background, but is also rewards you for enriching that mathematics background with some amazingly beautiful stuff thats 1) awesome and fun 2) useful.
Mathematical Thinking: Problem-Solving and Proofs.
John P. D'Angelo, Douglas B. West.
Available at Amazon.
This is supposed to be an introduction to mathematical proofs. As such it is not restricted to discrete mathematics. But it does a very good job for discrete mathematics. You would also see some proof in real analysis; but you can focus only on the discrete part ignoring this.