<p>Of course, plenty of introductory resources are available and it is impossible to be objective here. So what follows is merely my biased choice.</p>

<p>I would definitely start with reading something on algorithms and on discrete mathematics (possibly in parallel). Here, I would recommend the following books:</p>

<ul>
<li><a href="http://rads.stackoverflow.com/amzn/click/0262033844" rel="noreferrer">Introduction to Algorithms, by Cormen, Leiserson, Rivest and Stein</a></li>
<li><a href="http://rads.stackoverflow.com/amzn/click/0201000296" rel="noreferrer">The Design and Analysis of Computer Algorithms, by Aho, Hopcroft and Ullman</a></li>
<li><a href="http://rads.stackoverflow.com/amzn/click/0198570422" rel="noreferrer">Invitation to Discrete Mathematics, by Matoušek and Nešetřil</a></li>
</ul>

<p>The first book mentioned is one of the most widely known resources on algorithms, suitable as an introductory resource. The second book is little bit older and more theoretical, however imho still valuable. The third book is (in my opinion) an excellent and readable introduction to various parts of discrete mathematics. </p>

<p>Later, I would recommend to focus on formal languages and automata theory. Here, my choice is the following book:</p>

<ul>
<li><a href="http://rads.stackoverflow.com/amzn/click/0321455363" rel="noreferrer">Introduction to Automata Theory, Languages, and Computation, by Hopcroft Ullman and Motwani</a></li>
</ul>

<p>You might also like to consult the Sipser's book mentioned in one of the comments.</p>

<p>Of course, if you have some background, there may not be a need for you to thoroughly study these textbooks. However, it is imho necessary to have a stable grounding in the above mentioned subjects before proceeding any further. Thus, it may be sensible for you to consult the above mentioned resources and focus on the material that you find new and/or interesting.</p>

<p>After mastering these preliminaries, there are plenty of choices where to continue. In my opinion, you should definitely study some complexity theory. Here, I would recommend the following book:</p>

<ul>
<li><a href="http://rads.stackoverflow.com/amzn/click/0201530821" rel="noreferrer">Computational Complexity, by Papadimitriou</a></li>
</ul>

<p>You also might be interested in some slightly more advanced (or, let us say, intermediate) mathematical methods used in the analysis of algorithms. Here, the following resource is considered to be classic:</p>

<ul>
<li><a href="http://rads.stackoverflow.com/amzn/click/0201558025" rel="noreferrer">Concrete Mathematics, by Graham, Knuth and Patashnik</a></li>
</ul>

<p>Some basics of optimization (especially linear programming) are a must for computer scientists. Here, I would recommend the following gentle introduction:</p>

<ul>
<li><a href="http://rads.stackoverflow.com/amzn/click/3540306978" rel="noreferrer">Understanding and Using Linear Programming, by Matoušek and Gärtner</a></li>
</ul>

<p>A well written (and not very demanding) introduction to randomized algorithms is the following:</p>

<ul>
<li><a href="http://books.google.sk/books/about/Design_and_Analysis_of_Randomized_Algori.html?id=EfuMfn8T5_oC&amp;redir_esc=y" rel="noreferrer">Design and Analysis of Randomized Algorithms, by Hromkovič</a></li>
</ul>

<p>Finally, some nice books on advanced algorithms and/or computation theory include:</p>

<ul>
<li><a href="http://rads.stackoverflow.com/amzn/click/0387976876" rel="noreferrer">The Design and Analysis of Algorithms, by Kozen</a></li>
<li><a href="http://rads.stackoverflow.com/amzn/click/1846282977" rel="noreferrer">Theory of Computation, by Kozen</a></li>
<li><a href="http://rads.stackoverflow.com/amzn/click/3540441344" rel="noreferrer">Algorithmics for Hard Problems, by Hromkovič</a></li>
<li><a href="http://rads.stackoverflow.com/amzn/click/3540654313" rel="noreferrer">Complexity and Approximation, by Ausiello et al.</a></li>
<li><a href="http://rads.stackoverflow.com/amzn/click/0521474655" rel="noreferrer">Randomized Algorithms, by Motwani and Raghavan</a></li>
</ul>

<p>However, I would suggest reading these only after thoroughly mastering those mentioned above.</p>

<p>This is not a complete list, however. Many other excellent resources are available. The selection I have made is based on my personal bias. Moreover, I have included only resources focused on the "algorithmic part" of theoretical computer science. That is, the selection I have made is not only incomplete, but also very narrow.</p>

<p>And I have to mention that learning some more advanced math would be very helpful for you. My general advice is: the more mathematics you know, the better. It is more and more obvious that there is not any mathematics absolutely irrelevant to computer science.</p>

CC BY-SA 3.0
2013-08-05T06:07:27.617Z
2013-08-05T06:07:27.617Z
042
<p>I am an undergraduate student of Computer Science and am very interested in learning the theoretical part of it all.</p>

<p>Unfortunately, none of the subjects we have in our UG program give us an insight of theoretical part of Computer Science.
We do have the subjects <em>Automata</em> and <em>Graph Theory</em>, but our syllabus is very limited.</p>

<p>I have been looking for resources to learn the theory of computer science from the base up, for quite some time now.
I have already tried reading papers, completed MOOCs.</p>

<p>Somehow, I am always dissatisfied with the material. It is either too complicated (I don't even understand the notation used) or too trivial (teaching bits and bytes).</p>

<p>Could someone please provide me with some resources to learn theoretical computer science.
If possible, sort it in the order in which I should read it, so that the majority of prerequisites of the nth entry in the list, are covered in the preceding n-1 entries.</p>

<p>Please keep in mind:</p>

<ul>
<li>I am really interested in learning it.</li>
<li>I have a decent background in programming, and have worked with several programming languages.</li>
<li>This is not a <em>What videos/papers/books should everyone watch/read</em> question. I am simply looking for some introductory resources, which are neither too obvious, nor too complicated.</li>
</ul>

<p>I have had 3 semesters of College level Maths.
Also, I have studied the material provided by ocw.mit.edu, for the courses: <em>18.03</em>, <em>18.062J</em> and <em>18.400J</em> mentioned at <a href="http://math.mit.edu/academics/undergrad/major/course18C/" rel="noreferrer">http://math.mit.edu/academics/undergrad/major/course18C/</a></p>

<p>Thanks a lot.</p>

CC BY-SA 3.0
2013-08-01T02:46:19.863Z
Your question is interesting. However, you forgot to mention one very important thing: What is your math background?
Nobody
CC BY-SA 3.0
2013-08-01T03:09:47.173Z
[This page](http://courses.engr.illinois.edu/cs473/fa2012/resources.html) from my algorithms course site may be helpful.  See especially the review resources at the bottom of the page.
Jeffε
CC BY-SA 3.0
2013-08-01T11:14:43.057Z
In your edited question, I would suggest you to provide little more details. E.g. 18.062J (Mathematics for Computer Science) and what textbook/material were used in the class. Did you look at JeffE's page?
Nobody
CC BY-SA 3.0
2013-08-01T12:14:23.343Z
Definitely this must be in your bookcase: [M. Sipser, Introduction to the Theory of Computation](http://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X/ref=sr_1_1?s=books&ie=UTF8&qid=1375358947)
Marzio De Biasi
CC BY-SA 3.0
2013-08-02T06:11:26.200Z
I think this question is off-topic here. Please check [help/on-topic]. This question is more suitable for [cs.se].
Kaveh
CC BY-SA 3.0
2013-08-04T06:10:37.340Z
You could also try this book of David Harel:
http://www.amazon.com/Algorithmics-Spirit-Computing-David-Harel/dp/0321117840

It gives a "bird's eye" view of TCS, without delving into too much technical details. From there, you can continue to whatever attracts you more.
Or Meir
CC BY-SA 3.0
2013-08-16T06:16:26.173Z
@Dilworth, I don't see any research orientation in this question, it is simply a student who wants to learn more. This is not an outreach site for undergraduates. Typical questions by undergraduate students are off-topic on this site and that is very explicit in the definition of cstheory's scope, see [help/on-topic]. Such questions should be posted on [cs.se] which was partly created for answering this type of questions.
Kaveh
CC BY-SA 3.0
2013-08-16T17:54:48.647Z
@Dilworth, and as I said, this is not a formality: you should understand that this is not a general forum, it is a Q&A site with a particular scope. Out-reach to undergraduate students who might become interested in grad school is not a goal here. Typical questions by undergraduate students are _explicitly_ off-topic. If you want an analogy, this site if research, for teaching please use [cs.se]. Also, it is important how a question is phrased, it indicates if the question is in our scope or not.
Kaveh
CC BY-SA 3.0
2013-08-16T18:12:35.250Z
@Dilworth, I think it is typical, my student do ask such questions. I wanted to clarify for you why I wrote this question is off-topic. There are many other things one can do with the goal of advancing TCS research but that will not make them appropriate on this site. The main purpose of this site is for researchers to help each other and not teaching undergraduates.
Kaveh
CC BY-SA 3.0
2013-08-17T06:08:33.453Z
@Dilworth, too much dramatization. If a student knocks on a professors door during a research meeting to ask a question like this his question will be politely denied and he would be asked to drop by during an office hour. Same here. The appropriate place to ask this question is [cs.se]. (I don't think Noam's post is relevant here.)
Kaveh
CC BY-SA 3.0
2013-08-17T14:55:56.180Z
@Dilworth, I think you don't understand the topic of Noam's post (which is not surprising since you are new here). It is OK for you to have whatever opinion you want to have about how this site _should be_ but as a moderator I have to explain the scope as it _is_. Undergraduate level questions are not welcome on this site.
Kaveh
<advice-request>
Looking for learning resources
Pragy Agarwal
# Looking for learning resources

(Asked by: username_0 on 2013-08-01)

I am an undergraduate student of Computer Science and am very interested in learning the theoretical part of it all.

Unfortunately, none of the subjects we have in our UG program give us an insight of theoretical part of Computer Science.
We do have the subjects *Automata* and *Graph Theory*, but our syllabus is very limited.

I have been looking for resources to learn the theory of computer science from the base up, for quite some time now.
I have already tried reading papers, completed MOOCs.

Somehow, I am always dissatisfied with the material. It is either too complicated (I don't even understand the notation used) or too trivial (teaching bits and bytes).

Could someone please provide me with some resources to learn theoretical computer science.
If possible, sort it in the order in which I should read it, so that the majority of prerequisites of the nth entry in the list, are covered in the preceding n-1 entries.

Please keep in mind:

* I am really interested in learning it.
* I have a decent background in programming, and have worked with several programming languages.
* This is not a *What videos/papers/books should everyone watch/read* question. I am simply looking for some introductory resources, which are neither too obvious, nor too complicated.

I have had 3 semesters of College level Maths.
Also, I have studied the material provided by ocw.mit.edu, for the courses: *18.03*, *18.062J* and *18.400J* mentioned at <http://math.mit.edu/academics/undergrad/major/course18C/>

Thanks a lot.

**Tags:** advice-request
> **Comments:**
> **username_1**: Your question is interesting. However, you forgot to mention one very important thing: What is your math background?  
> **username_2**: [This page](http://courses.engr.illinois.edu/cs473/fa2012/resources.html) from my algorithms course site may be helpful.  See especially the review resources at the bottom of the page.  
> **username_1**: In your edited question, I would suggest you to provide little more details. E.g. 18.062J (Mathematics for Computer Science) and what textbook/material were used in the class. Did you look at JeffE's page?  
> **username_3**: Definitely this must be in your bookcase: [M. Sipser, Introduction to the Theory of Computation](http://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X/ref=sr_1_1?s=books&ie=UTF8&qid=1375358947)  
> **username_4**: I think this question is off-topic here. Please check [help/on-topic]. This question is more suitable for [cs.se].  
> **username_5**: You could also try this book of David Harel: http://www.amazon.com/Algorithmics-Spirit-Computing-David-Harel/dp/0321117840  It gives a "bird's eye" view of TCS, without delving into too much technical details. From there, you can continue to whatever attracts you more.  
> **username_4**: @Dilworth, I don't see any research orientation in this question, it is simply a student who wants to learn more. This is not an outreach site for undergraduates. Typical questions by undergraduate students are off-topic on this site and that is very explicit in the definition of cstheory's scope, see [help/on-topic]. Such questions should be posted on [cs.se] which was partly created for answering this type of questions.  
> **username_4**: @Dilworth, and as I said, this is not a formality: you should understand that this is not a general forum, it is a Q&A site with a particular scope. Out-reach to undergraduate students who might become interested in grad school is not a goal here. Typical questions by undergraduate students are _explicitly_ off-topic. If you want an analogy, this site if research, for teaching please use [cs.se]. Also, it is important how a question is phrased, it indicates if the question is in our scope or not.  
> **username_4**: @Dilworth, I think it is typical, my student do ask such questions. I wanted to clarify for you why I wrote this question is off-topic. There are many other things one can do with the goal of advancing TCS research but that will not make them appropriate on this site. The main purpose of this site is for researchers to help each other and not teaching undergraduates.  
> **username_4**: @Dilworth, too much dramatization. If a student knocks on a professors door during a research meeting to ask a question like this his question will be politely denied and he would be asked to drop by during an office hour. Same here. The appropriate place to ask this question is [cs.se]. (I don't think Noam's post is relevant here.)  
> **username_4**: @Dilworth, I think you don't understand the topic of Noam's post (which is not surprising since you are new here). It is OK for you to have whatever opinion you want to have about how this site _should be_ but as a moderator I have to explain the scope as it _is_. Undergraduate level questions are not welcome on this site.  

---

## 1 answers

### Answer by username_6 on 2013-08-05. Score: 5 | Accepted answer

Of course, plenty of introductory resources are available and it is impossible to be objective here. So what follows is merely my biased choice.

I would definitely start with reading something on algorithms and on discrete mathematics (possibly in parallel). Here, I would recommend the following books:

* [Introduction to Algorithms, by Cormen, Leiserson, Rivest and Stein](http://rads.stackoverflow.com/amzn/click/0262033844)
* [The Design and Analysis of Computer Algorithms, by Aho, Hopcroft and Ullman](http://rads.stackoverflow.com/amzn/click/0201000296)
* [Invitation to Discrete Mathematics, by Matoušek and Nešetřil](http://rads.stackoverflow.com/amzn/click/0198570422)

The first book mentioned is one of the most widely known resources on algorithms, suitable as an introductory resource. The second book is little bit older and more theoretical, however imho still valuable. The third book is (in my opinion) an excellent and readable introduction to various parts of discrete mathematics.

Later, I would recommend to focus on formal languages and automata theory. Here, my choice is the following book:

* [Introduction to Automata Theory, Languages, and Computation, by Hopcroft Ullman and Motwani](http://rads.stackoverflow.com/amzn/click/0321455363)

You might also like to consult the Sipser's book mentioned in one of the comments.

Of course, if you have some background, there may not be a need for you to thoroughly study these textbooks. However, it is imho necessary to have a stable grounding in the above mentioned subjects before proceeding any further. Thus, it may be sensible for you to consult the above mentioned resources and focus on the material that you find new and/or interesting.

After mastering these preliminaries, there are plenty of choices where to continue. In my opinion, you should definitely study some complexity theory. Here, I would recommend the following book:

* [Computational Complexity, by Papadimitriou](http://rads.stackoverflow.com/amzn/click/0201530821)

You also might be interested in some slightly more advanced (or, let us say, intermediate) mathematical methods used in the analysis of algorithms. Here, the following resource is considered to be classic:

* [Concrete Mathematics, by Graham, Knuth and Patashnik](http://rads.stackoverflow.com/amzn/click/0201558025)

Some basics of optimization (especially linear programming) are a must for computer scientists. Here, I would recommend the following gentle introduction:

* [Understanding and Using Linear Programming, by Matoušek and Gärtner](http://rads.stackoverflow.com/amzn/click/3540306978)

A well written (and not very demanding) introduction to randomized algorithms is the following:

* [Design and Analysis of Randomized Algorithms, by Hromkovič](http://books.google.sk/books/about/Design_and_Analysis_of_Randomized_Algori.html?id=EfuMfn8T5_oC&redir_esc=y)

Finally, some nice books on advanced algorithms and/or computation theory include:

* [The Design and Analysis of Algorithms, by Kozen](http://rads.stackoverflow.com/amzn/click/0387976876)
* [Theory of Computation, by Kozen](http://rads.stackoverflow.com/amzn/click/1846282977)
* [Algorithmics for Hard Problems, by Hromkovič](http://rads.stackoverflow.com/amzn/click/3540441344)
* [Complexity and Approximation, by Ausiello et al.](http://rads.stackoverflow.com/amzn/click/3540654313)
* [Randomized Algorithms, by Motwani and Raghavan](http://rads.stackoverflow.com/amzn/click/0521474655)

However, I would suggest reading these only after thoroughly mastering those mentioned above.

This is not a complete list, however. Many other excellent resources are available. The selection I have made is based on my personal bias. Moreover, I have included only resources focused on the "algorithmic part" of theoretical computer science. That is, the selection I have made is not only incomplete, but also very narrow.

And I have to mention that learning some more advanced math would be very helpful for you. My general advice is: the more mathematics you know, the better. It is more and more obvious that there is not any mathematics absolutely irrelevant to computer science.


---

