Dear Jeff: Here is a first review of your manuscript for you to mull over. The choice of "good huge book" or "small excellent book" is really up to you. The huge book (or largish, anyway) would be more in line with what people are used to teaching out of, so in that sense would compete better with CLR and other such books -- and if it caught on could really make a lot of money for all concerned. But it would be a lot of work and something of a gamble. It sounds as if the smaller book you already have planned could have a solid market, mostly as a supplementary text, as long as it weren't too expensive (I would go for a $25-30 paperback). In either case, it's clear you've identified the right area of dissatisfaction with the current texts. I do suggest you consider the reviewer's suggestion about adding at least some discussion of data structures. I'm expecting a couple more reviews by early August and will forward them as they come in. Best regards, Lauren Lauren Cowles Cambridge University Press ********************* Reader A Jeff Edmonds. Thinking About Algorithms Abstractly. This is a very good set of notes and I think that with enough effort it could be turned into a very good textbook. I have some concerns about how well it could compete with less well-presented but more comprehensive texts already available. Here's what I like about the manuscript: 1. It has the best presentation I've ever seen of how people who build algorithms think about them. Unlike many algorithms books (e.g. Sedgewick's various textbooks, CLR) that are organized around a large collection of finished algorithms, Edmonds's manuscript concentrates on general algorithm design techniques and brings in specific algorithms only as examples of these general techniques. Edmonds is also not afraid to give examples of when techniques don't work, and when some techniques do work but not as well as they can with additional tweaking, or as well as some other technique might. The difference is a bit like the difference between studying carpentry by looking at houses and by looking at hammers. 2. Correctness proofs are handled very well. The manuscript manages to avoid both fanatical formalism and the approach formalism often encourages of sweeping correctness under the rug because it's too hard to deal with. By emphasizing the structure of correctness arguments and using explicit invariants, the manuscript again does a good job of presenting how real algorithm designers think. 3. Complexity of algorithms is handled well, emphasizing how complexity computations interact with the design and structure of algorithms over brute calculation itself. I particularly like the ``Adding Made Easy'' theorems, although it would be nice to have a proof and a better (and more strongly emphasized) description of what range of functions they work for. 4. The description of dynamic programming in particular is very thorough. If the rest of the book can be brought up to this level of detail it will be very strong. 5. Though I can't evaluate the missing chapters, I like the fact that the author plans to cover linear programming and amortization. 6. The author is a strong researcher in the area and it's clear that he brings all of his knowledge of current work to writing the notes--- for example, the comment that algorithms researcher have only recently managed to prove superlinear lower bounds is based on new work from last year. I am confident that he would continue to bring this very fresh perspective to a longer textbook. Here's what I worry about when reading the manuscript: 1. The main competition for this book is going to be encyclopedic algorithms tomes like CLR or Sedgewick's new multi-volume series. Though I like the approach of the manuscript better than the approach of these other books, an issue for the students is how good a toolbox the book will give them. I suspect that a typical CS student reads exactly one algorithms textbook in her life, and if that book is missing some topic, she'll never learn about it. So while this book will likely do a great job of teaching people to invent wheels, it may not do a very good job of pointing to pre-invented wheels. I don't want the book to turn into another cookbook, since we already have enough of those. But I think it would be handy if in addition to the chapters already described in the table of contents there were a few chapters at the end on application of existing algorithms. One example of a such a chapter might be a chapter on solving problems using graph algorithms. This could look at the questions of how to pull a graph out of a problem that at first glance doesn't look like a graph problem, how to translate the problem into one one has seen before, how to recognize NP-hard graph problems, and so forth. I'd imagine that most of the algorithms that would be used here (e.g. shortest paths, minimum spanning tree, network flows and cuts) would have been presented earlier, but it would still be useful to bring them together with some examples of how one attacks a problem that may be vulnerable to many known tools. Similarly, a chapter specifically on combinatorial optimization problems could do the same sort of pulling-together for network-flows, linear programming, dynamic programming, and some of the NP-hardness results. There are also areas of algorithm design that at the moment aren't touched on (and possibly shouldn't be). The biggest area missing is probably parallel algorithms. It's not clear how well a section on parallel algorithms could be fit in with the rest, but it might be worth putting something in. 2. The manuscript appears to make fairly strong assumptions about the background of students coming into the course. This makes sense for course notes, since the author knows what the prerequisites are for SC/COSC 3101 and can adjust his material to match. But if the book is to be used elsewhere there are some gaps that may need to be filled in. One glaring hole is that the manuscript doesn't talk about data structures much as an explicit topic. I assume that the students taking the author's course have had a fairly thorough data structures course before. However it may be limiting to leave data structures out, especially since (a) a student coming to this book may not have seen much algorithm treatment of data structures (analysis of performance and correctness), even if he's had a here's-where-to-put-the-pointers course before; and (b) designing an algorithm to use a data structure well would fit so well at the end of the section on iterative algorithms--- a data structure is just the knight in armor that defends and preserves a complicated invariant that the algorithm needs to keep going. On the other side, the manuscript appears to assume that the students don't have much discrete math background. I noticed for example that it scrupulously avoids algorithms based on finite fields and similar mathematical tools. This is not necessarily a problem, since many students don't bring these tools to their first algorithms course, and the basic idea of algorithm design can be lost if one is trying to prove that some value is or isn't a quadratic residue, but it does exclude pretty much anything about cryptography and related topics like pseudorandom generators and the design of hash functions. 3. The litany of friends, little birds, higher powers, and so forth sometimes comes off as a little twee. This isn't necessarily a problem, but there is a danger with adopting user-friendly jargon that it just becomes more jargon, incompatible with what everybody else uses--- and after the first few times you hear it there isn't really all that much difference between friend and subroutine. Finally, the big question: would I adopt this book? It's hard to say. I'm currently using CLR, which though a bit dated and clearly not as well presented as the manuscript has the advantage of being relatively comprehensive. I could certainly imagine adopting something similar to the current version (with some fleshing out in the missing chapters of course) as a supplement to a book like CLR, since I think it does a much better job of presenting what it covers, but I'd be leery of replacing CLR with it outright unless it covers much more ground than it does now. I have great confidence that the author could produce a good huge book, so I suppose the question is whether he would rather stick with an excellent small one, and whether that excellent small book would be excellent enough to use on its own even if it means leaving some material out of the course.