原作名: Introduction to Algorithms
作者: [美] Thomas H.Cormen / Charles E.Leiserson / Ronald L.Rivest / Clifford Stein
译者: 潘金贵 等
出版社: 机械工业出版社
出版年: 2006-9
页数: 754
定价: 85.00元
装帧: 平装16开
丛书: 计算机科学丛书
ISBN: 9787111187776
作者: [美] Thomas H.Cormen / Charles E.Leiserson / Ronald L.Rivest / Clifford Stein
译者: 潘金贵 等
出版社: 机械工业出版社
出版年: 2006-9
页数: 754
定价: 85.00元
装帧: 平装16开
丛书: 计算机科学丛书
ISBN: 9787111187776
内容简介 · · · · · ·
这本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。
作者简介 · · · · · ·
Thomas H.Cormen
达特茅斯学院计算机科学系副教授
Charles E.Leiserson
麻省理工学院计算机科学与电气工程系教授
Ronald L.Rivest
麻省理工学院计算机科学系Andrew与Erna Viterbi具名教授
Clifford Stein
哥伦比亚大学工业工程与运筹学副教授
达特茅斯学院计算机科学系副教授
Charles E.Leiserson
麻省理工学院计算机科学与电气工程系教授
Ronald L.Rivest
麻省理工学院计算机科学系Andrew与Erna Viterbi具名教授
Clifford Stein
哥伦比亚大学工业工程与运筹学副教授
目录 · · · · · ·
出版者的话
专家指导委员会
译者序
前言
第一部分 基础知识
引言
第1章 算法在计算中的作用
1.1 算法
1.2 作为一种技术的算法
第2章 算法入门
2.1 插入排序
2.2 算法分析
2.3 算法设计
2.3.1 分治法
2.3.2 分治法分析
第3章 函数的增长
3.1 渐近记号
3.2 标准记号和常用函数
第4章 传归式
4.1 代换法
4.2 递归树方法
4.3 主方法
4.4 主定理的证明
4.4.1 取正合幂时的证明
4.4.2 上取整函数和下取整函数
第5章 概率分析和随机算法
5.1 雇用问题
5.2 指示器随机变量
5.3 随机算法
5.4 概率分析和指示器随机变量的进一步使用
5.4.1 生日悖论
5.4.2 球与盒子
5.4.3 序列
· · · · · · (收起)
专家指导委员会
译者序
前言
第一部分 基础知识
引言
第1章 算法在计算中的作用
1.1 算法
1.2 作为一种技术的算法
第2章 算法入门
2.1 插入排序
2.2 算法分析
2.3 算法设计
2.3.1 分治法
2.3.2 分治法分析
第3章 函数的增长
3.1 渐近记号
3.2 标准记号和常用函数
第4章 传归式
4.1 代换法
4.2 递归树方法
4.3 主方法
4.4 主定理的证明
4.4.1 取正合幂时的证明
4.4.2 上取整函数和下取整函数
第5章 概率分析和随机算法
5.1 雇用问题
5.2 指示器随机变量
5.3 随机算法
5.4 概率分析和指示器随机变量的进一步使用
5.4.1 生日悖论
5.4.2 球与盒子
5.4.3 序列
· · · · · · (收起)
豆瓣成员常用的标签(共339个) · · · · · ·
丛书信息
计算机科学丛书 (共51册),
这套丛书还有
《计算理论导引》,《信息安全工程》,《编程原本》,《机器学习导论》,《Python科学计算》 等。
喜欢读"算法导论"的人也喜欢 · · · · · ·
按有用程度 按页码先后 最新笔记
-
第557页
第32章 字符串匹配问题是指从一个较长字符串中找到一个和较短字符串完全相同的子串,输出所以符合条件的位移. 直觉上,所有确定性算法的时间复杂度的下限在O(n).n为长串长度.因为至少需要把长串中的所有字符遍历一遍得到结果.最后的KMP算法也确实达到了这个下限.说明在确定性算法中,不可能再有一个算法对此算法有明显性能提高了. 最简单的朴素算法是,将字符串中的每一个字符和模式中的第一个字符比较,如果不同,... (更多)第32章 字符串匹配问题是指从一个较长字符串中找到一个和较短字符串完全相同的子串,输出所以符合条件的位移. 直觉上,所有确定性算法的时间复杂度的下限在O(n).n为长串长度.因为至少需要把长串中的所有字符遍历一遍得到结果.最后的KMP算法也确实达到了这个下限.说明在确定性算法中,不可能再有一个算法对此算法有明显性能提高了. 最简单的朴素算法是,将字符串中的每一个字符和模式中的第一个字符比较,如果不同,比较字符串第二个字符.如果相同,则比较模式中的第二个字符,直到完全匹配.这种方式的时间复杂度为O((n - m + 1)m).其中m是模式串长度,n是字符串长度. 书中的第二个算法是kabin-karp算法.该算法的核心思想是,将模式串转化为一个基数为d的数字.其中d等于字母表中字母的个数.这样以来,模式串就变成了一个数字,而匹配字符串就变成了(n - m + 1)个数字.只需要比较(n - m + 1)次就可以得到结果.当然这里需要一些额外的预处理时间.计算这个d进制的数字需要O(m)的时间.虽然这个算法最坏情况下时间复杂度和上面的相同,实际使用中效果要好许多. 算法性能的真正提高总是伴随着冗余数据的去消.这一步的优化将机器的性能发挥到最大.因为普通的机器一次可以将两个2^32以内的数字比较大小.而上面的朴素算法每次只比较一个很小的数字. 举例说明,字符串为232332.模式串为236.朴素算法首先比较2和2,然后3和3,然后2和6不同,不匹配.而kabin-karp算法则是比较236和232不同.因为机器有能力一次就比较这么大的数字. 那是不是说,比如机器字长为8,当模式串的值到256的时候就达到性能顶峰了呢?不是的.因为我们发现,全部所有可能的数字出现的可能性是比较低的,就本例而言,三字组从000到256每个都出现在长字串中,概率是比较小的.这说明8位的字长,可以表示更多的数字.比如我们将数字除以2来比较,那么上例中第二步比较时,长字串中值为323,模式串为236.6是偶数,3不是.所以不匹配,无论323前面两位是什么数字.当然这种方式误差也比较大,比如236是偶数,第一个232也是. 这是因为除以2这个选择实在是太糟糕了.一般情况下都会选择一个素数.通过合理计算可以找到一个最优的数字.突然想到哈代曾经说,从实用主义的角度来看,他一生的价值为零.唏呈不已. 通过合适的选择数值,机器和数字两方面都可以达到最好性能.那还有性能提高的空间吗?有的. 编程中有一种很常用的方式是用时间来换空间,或者相反,用空间来时间.有限自动机的方法就是这样一种方法,它用空间来换取时间上的性能提高.不过如果单纯的交换不能叫性能提高.这种方式还利用了另外一个信息论中的原理:一件事物出现的概率越大,它包含的信息量越小.那么在一个有限长度的模式串中,它和所有等长的字符串的比较结果就只有有限个.而且,在比较字串前面取消一个字符,后面添加一个字符,这样的结果变化集也是有限的. 也就是说,在很长很长的匹配过程中,出现的不同的匹配情况只有很少的有限种.频繁出现的情况包含的信息量小,我们就可以在计算机上用更少的空间来表示它.而不是每次出现都重新表示. 这么做了以后,似乎已经没有任何可以提高的空间了.knuth,morris和pratt在1977年发表了一篇文章<fast pattern matching in strings>.再次爆表. 我们知道,匹配算法已经不可能再提高了.所以KMP算法是对有限状态机中预处理算法进行的明显优化. 不过看了这个算法之后,我不敢相信,这几个作者要把这个算法放在最后讲解.因为这个思路我自己一开始都隐隐有了.这个优化再次减少了冗余信息.它把有效信息保留,而不是每次比较以后都丢弃,而这些辅助的信息的数目又是有限的. 它的思路是,在比较了若干个字符匹配以后,如果下一个字符不匹配,则前面匹配的字符是有用的信息.即如果后面的字符不同,可以直接跳过. 比如,模式串ababaca.匹配到ababaabc..时,前面5个字符匹配,但第6个字符不匹配.那我们可以提前计算到,向后移一位,babaabc不可能匹配,因为前面第一个字符就不匹配.所以可以直接去匹配abaabc... 我们来计算模式ababababca.如果仅有一个匹配,那么下一次后移一位.即pie(1)=1.如果仅匹配两位,那么下一次后移两位.因为后移一位是不可能匹配的.所以pie(2)=2.如果仅匹配三位,则后移三位.pie(3)=3.依次类推... 代码后面给...//by dilfish at yantai #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define IDXLEN (10000) int idx = 0; unsigned long int naiveidx[IDXLEN] = {0}; unsigned long int kmpidx[IDXLEN] = {0}; //check the two ways result int check_idx(void) { int i,flag = 0; for(i = 0;i < idx;i ++) { if(naiveidx[i] != kmpidx[i]) { flag = 1; break; } } if(flag == 1) printf("error1\n"); else printf("%d matches\n",idx); return 0; } //make chars in [a,e] int make_string(unsigned char *ptr,unsigned long int num) { unsigned long int i; for(i = 0;i < num;i ++) ptr[i] = (ptr[i] % 5) + 'a'; return 0; } //random numbers unsigned long int generate_random(void *ptr,unsigned long int n) { int fd,ret,slice; char buffer[100] = {0}; unsigned long int num = 0; fd = open("/dev/urandom",O_RDONLY); if(fd < 0) return 0; while(num < n) { if(n - num >= 100) slice = 100; else slice = n - num; ret = read(fd,ptr + num,slice); if(ret < 0) break; num += ret; } close(fd); return num; } //... int* compute_prefix_function(const unsigned char *p,int m) { int q,*pie = (int*)malloc(m * sizeof(int)); int k = 0; bzero(pie,m * sizeof(int)); pie[0] = 0; for(q = 1;q < m;q ++) { while(k > 0 && p[k] != p[q]) k = pie[k]; if(p[k] == p[q]) k ++; pie[q] = k; } return pie; } //powered by Introduction to Algorithms int kmp(const unsigned char *str,const unsigned char *pattern) { int i,n,m,*pie,q = 0; n = strlen(str); m = strlen(pattern); pie = compute_prefix_function(pattern,m); idx = 0; for(i = 0;i < n;i ++) { while(q > 0 && pattern[q] != str[i]) q = pie[q - 1]; if(pattern[q] == str[i]) q ++; if(q == m) { if(idx < IDXLEN) { kmpidx[idx] = i - m + 1; idx ++; } q = pie[q - 1]; } } free(pie); return 0; } //... int naive(const unsigned char *str,const unsigned char *pattern) { int i,j = 0; int n,m; n = strlen(str); m = strlen(pattern); idx = 0; for(i = 0;i < n - m + 1;i ++) { while(str[i + j] == pattern[j] && j < m) j ++; if(j == m) if(idx < IDXLEN) { naiveidx[idx] = i; idx ++; } j = 0; } return 0; } int main(int argc,char **argv) { #define NUM (1000000) unsigned char str[NUM + 1] = {0}; unsigned char pattern[] = "aba"; struct timeval tns,tne,tks,tke; generate_random(str,NUM); make_string(str,NUM); str[NUM] = 0; #undef NUM gettimeofday(&tns,NULL); naive(str,pattern); gettimeofday(&tne,NULL); gettimeofday(&tks,NULL); kmp(str,pattern); gettimeofday(&tke,NULL); printf("%lu,%lu\n",tns.tv_sec,tns.tv_usec); printf("%lu,%lu\n",tne.tv_sec,tne.tv_usec); printf("%lu,%lu\n",tks.tv_sec,tks.tv_usec); printf("%lu,%lu\n",tke.tv_sec,tke.tv_usec); check_idx(); return 0; }(收起)2011-08-06 14:31:23 1回应
-
附录 B.5 树
keep_it_real (No fear.No distractions.)
最近钻研CLRS,以求在数据结构与算法方面更进一步学习,着实发现国外教材的严谨,全面,严奶奶着实不及。也发现前路漫漫,其修远兮,我必须上下而求索。也发现了一些中外教材定义上不一致的地方,尤以树这个方面比较突出。 一些差别: 1.深度,高度的定义 在严教材中,对深度和高度有如下定义(P120): 结点的层次从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第l层,则其子树的根就在第l+1层。......树.. (更多)最近钻研CLRS,以求在数据结构与算法方面更进一步学习,着实发现国外教材的严谨,全面,严奶奶着实不及。也发现前路漫漫,其修远兮,我必须上下而求索。也发现了一些中外教材定义上不一致的地方,尤以树这个方面比较突出。一些差别:1.深度,高度的定义在严教材中,对深度和高度有如下定义(P120): 结点的层次从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第l层,则其子树的根就在第l+1层。......树中结点的最大层次称为树的深度或高度。而在CLRS中,却有不同的定义(附录B.5.2,P672): 从根r到结点x的路径长度称为x在T中的深度。结点在树中的高度是从结点向下到某个叶结点最长简单路径中边的条数。而树的高度也等于树中结点的最大深度。严版的定义深度和高度等价,作为树的属性。而CLRS中深度与高度“互补”其和为树的深度(高度),对于树,也有高度的属性。2.满二叉树与完全二叉树的定义严教材中满二叉树定义如下(P124): 一棵深度为k且有2^k - 1个结点的二叉树称为满二叉树。而在CLRS中,则有严重的差别(附录B.5.3 P672): 满二叉树:每个结点或者是叶结点,或度数为2,不存在度为1的结点。对于完全二叉树,严教材定义为(P124): 可对满二叉树的结点进行编号,约定从根结点起,从左向右,从上至下。深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一 对应时,称之为完全二叉树。(备注写道此定义版本众多,本书以此为准)。CLRS中则为(附录B.5.3 P673): 完全二叉树是所有的叶子结点都有相同深度,且所有内部结点度都为2.在Wikipedia中,完全二叉树与国内定义一致,与CLRS中不同,如下: A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.Wikipedia对perfect binary tree(完美二叉树)定义与国内的满二叉树相同,即:A perfect binary tree is a full binary tree in which all leaves are at the same depth or same level, and in which every parent has two children.[1] (This is ambiguously also called a complete binary tree.)CLRS英文版中对完全k叉树定义为:A complete k-ary tree is a k-ary tree in which all leaves have the same depth and all internal nodes have degree k.对于这些差别,其实:然而,许多这些差别是由于翻译问题造成的,请听我道来:在Wikipedia中,完全二叉树与国内定义一致,如下: A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.Wikipedia对perfect binary tree(完美二叉树)定义与国内的满二叉树相同,即: A perfect binary tree is a full binary tree in which all leaves are at the same depth or same level, and in which every parent has two children.[1] (This is ambiguously also called a complete binary tree.)CLRS英文版中对完全k叉树定义为: A complete k-ary tree is a k-ary tree in which all leaves have the same depth and all internal nodes have degree k.CLRS的译者们对complete的翻译没有考虑道英文定义中本来存在的歧义还有国内约定俗成的定义的忽视,造成了这样的混乱。国内的定义中满二叉树即为perfect binary tree,其翻译与full binary tree相近,wikipedia中对full binary tree的定义与CLRS中一致,即: A full binary tree (sometimes proper binary tree or 2-tree or strictly binary tree) is a tree in which every node other than the leaves has two children.Sometimes a full tree is ambiguously defined as a perfect tree.但CLRS直接将 full binary tree翻译为满二叉树,与国内约定俗成的满二叉树(perfect binary tree)相冲突。这同样是忽略了国外定义存在的争议和国内约定俗成的说法而进行翻译。总结一下对应关系:国内 国外完全二叉树<--->a complete binary tree满二叉树 <--->a perfect binary tree(a complete binary tree [ambiguously])无对应名称,即全部结点度数要么为2,要么为0的二叉树<--->a full binary tree(sometimes called a perfect binary tree[ambiguously])我想说的: 物理学与计算机科学都与数学有着最紧密的关系。但与物理学基于客观存在的、不随主观意志改变的宇宙不同,计算机科学是关于我们千千万万的程序员、计算机科学家、黑客们创造的新的世界运行规律的科学,这些规律,具体表现为形形色色的协议、算法,是我们人类制定的。所以争议一直会存在。许多没有实质差别的争议,如大端法与小端法,如从0开始计数和从1开始,只是一个标准问题。 CLRS是一部庞大的书,英文版有近1000页,翻译的难度与工作量可想而知。但也希望译者们能充分考虑到英文定义中本来存在的争议和国内相关约定俗成的说法,为一份标准献一份力量。 从中也能看出国内教材往往立意较浅,从实用角度介绍了许多重要的数据结构,严教材充斥着略显蹩脚的C代码,语言也有些晦涩,也是国内大学的氛围所致,但作为入门级读物已经是非常不错,它的练习册也很好。而CLRS则从数学的根基开始力图构建一个涉及广泛的重要的结构和算法的高楼大厦,从实际效果看,他成功达到了他的目标。他严谨,稳重,甚至稍有笨重。希望对结构与算法,对计算机科学有心趣的同学能够跟我一起学习。在此推荐一个豆列:http://book.douban.com/doulist/229594/ 希望对你有所帮助。 (收起)2012-01-27 13:47:57 回应
-
第八章 线性时间排序
问题1:决策树是满二叉树? 中文版第97页,讲到一棵决策树是一棵满二叉树,查了查数据结构的书,满二叉树的定义是指深度为k且有2^k-1个节点的二叉树(严蔚敏《数据结构 C语言版》,按照导论上对深度的定义,应该修正为2^(k+1)-1)。从导论上所配的图8-1来说,显然这并不是满二叉树,所以感觉导论这点好像说的不对。 在导论上提出决策树模型时有个约定,假设所有输入元素不同。其实决策树模型也包含了输入序列中某些输入... (更多)问题1:决策树是满二叉树? 中文版第97页,讲到一棵决策树是一棵满二叉树,查了查数据结构的书,满二叉树的定义是指深度为k且有2^k-1个节点的二叉树(严蔚敏《数据结构 C语言版》,按照导论上对深度的定义,应该修正为2^(k+1)-1)。从导论上所配的图8-1来说,显然这并不是满二叉树,所以感觉导论这点好像说的不对。 在导论上提出决策树模型时有个约定,假设所有输入元素不同。其实决策树模型也包含了输入序列中某些输入值或者全部输入值相等的情况。问题2: 决策树在同等输入规模下,是否因比较排序算法而异? 对于不同的排序算法,我一开始觉得决策树的结构应该不一样。nlgn只是一个比较优的比较次数下界,对于某些效率不高的诸如冒泡、插入等算法,比较次数是n^2次,相应的决策树的高度也会升高。 但是,决策树会不会本身就是一个满足最少比较次数的结构?毕竟,这个模型的提出就是为了找到一个比较次数的下界,模型的提出忽略了诸如元素在比较后的移动、比较的循环控制的信息,即,决策树展示的是比较排序算法在给定输入规模下的最小比较次数。因此我比较倾向于后一种理解,即给定输入规模下决策树的结构是确定的。问题3: 课后习题8.1—3,不会做。 对网络上看的答案表示不太能理解,一般都是根据定理8.1得出,但是问题是,定理中的h指的是决策树的(最大)深度,但是怎样说明n!种输入至少有一半都保持在h的深度?此题目解答暂定。问题4: 课后习题8.1-4,关于最后题目给出的提示的一点思考 题目最后给了提示,一直不太明白其意义。后来在参考了答案的情况下才了解,题中给的n/k个子序列并非相互独立(尽管有条件::每个子序列的元素都小于后继子序列元素,大于前驱子序列元素)可以认为第i+1个子序列的决策树是以第i个子序列的决策树为基础的(这时第i个子序列的比较已经完毕),应该从一共(至少)有(k!)^(n/k)个叶节点入手。 如果n/k个子序列相互独立,那么问题就变成了对n/k个长度为k的元素分别进行比较,再将比较次数相加就可以了。这样根据定理8.1-4,可得出比较次数应该是不少于(n/k)(klgk) = nlgk。虽然结果是一样的,但是问题的背景是不同的。 (收起)2011-11-25 20:52:15 回应
书评 · · · · · · (共51条) 我来评论这本书
热门评论 最新评论
有保留的推荐
-
- etone 我对《算法导论CLRS》的态度一直是有所保留的。虽然早在国内的时候,这本书一直被推崇为经典。但我那时就觉得它对算法的描述不好。一段费解的伪码,加上一大段费口舌的解释。我觉得本可以做得更好。 后来知道,这是典型的美国本科生用书,美国的本科教材,大抵很罗嗦,都是厚重的大部头书。教授们生怕稍有简略,学生们就不懂;而美国...... (59回应)2008-03-06 150/167有用来自 高等教育出版社2002版
讲义和视频都可以在MIT的网站上下
-
- BarkMere 大家可以上MIT的OCW站看看 http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm 另外还有第3版的笔记和PPT http://ocw.mit.edu/...... (22回应)2009-08-22 90/94有用
从头到尾读完了,想说的绝不止这些
-
- kowizards(Temet nosce) 我读算法导论的目标: 书上的内容全部看懂(附录除外,已经为这些基础知识专门看了一大厚本的《离 散数学》,所以只看了几道从前没思考过的题,),习题(excersice)和每章末的 思考题(problem)全部尝试独立完成,即使不能做出,也一定要从网上找到答案。 实际完成的内容: 书上内容全部看完且看懂(当然...... (14回应)2010-04-07 53/59有用
推荐搞软件开发的都读读
-
- ghosert(我不读书,书读我) 我自己花了3个月差4天的业余时间读了大约575页,最后一个章节 selected topics 略过了,后面的 appendix 也略过了,前面二十六章略过了几个小节,个人觉得无伤大雅的地方。 体会就是,确实不错。比较注重算法证明和逻辑推导,某种程度上更像是在读数学教材,但是所需要的数学知识又并不全都太艰深,所以本科...... (6回应)2010-10-08 9/9有用来自 The MIT Press2001版
初学者2
-
- hwj19881119 又看了一点点,发现果然还是有点深,作为一名初学者把握不能啊,看来恐怕要看第二遍了,这种经典著作果然还是需要多看几遍的,一朝一夕是掌握不了的,不过凡是深奥的书,一般来说总是要看很久的,虽然有很多语法不需要自己深究了,但是,果然还是想要自己写一下。......2011-11-24
初学者
-
- hwj19881119 作为一名初学者,不是很好的说明,不过感觉上可以给我很多启发,不是用很复杂的代码来进行说明,而是通过给出比较重要的伪代码,来推动理解,虽然对于初学者有点吃力,不过我觉得这种学习和思考的方法很重要。相比自己以前读过的一些国内教材,感觉很多国内教材山寨而且不靠谱,但是算法导论的不少重要知识点,让我受益匪浅。......2011-11-23
"算法导论"的论坛 · · · · · ·
| 完美哈希的应用场景 | 来自幻想廃人 | 2 回应 | 2011-08-21 |
| 直接去听作者讲的课吧! | 来自小马 | 2011-10-22 | |
| 刚开始看,有没有人愿意一起学习,有问题互相讨论? | 来自白轻扬 | 14 回应 | 2011-10-20 |
| 求电子版地址地址地址地址~~~ | 来自杨小冬。 | 2010-03-11 | |
| 50元。 | 来自[已注销] | 2009-07-17 |
> 浏览更多话题
这本书的其他版本 · · · · · · ( 全部11 )
- The MIT Press版 2001-9-1 / 253人读过
- 高等教育出版社版 2002-5 / 762人读过 / 有售
- The MIT Press版 2009-7-31 / 55人读过 / 有售
- The MIT Press版 2009-09-30 / 3人读过
以下豆列推荐 · · · · · · (全部)
- 豆瓣评分>9的书(100人以上) (阿獠)
- 负责任推荐:算法学习经典 (atyuwen)
- 我的编程之路 (风中纸页)
- 程序员最应该读的图书(中译版) (hongqn)
- InfoQ编辑们的推荐书目 (kimi)
谁读这本书?
喜欢这本书的人常去的小组 · · · · · ·

- 算法与数据结构 (4531)

- Python编程 (18997)

- Vim (6193)

- 计算机科学 Computer Scie... (6013)

- LISP (2009)

- 程序员书屋 (6484)

- C++及编程 (5000)

- 程序员(不看公告发豆油的... (4662)
喜欢这本书的人关注的活动 · · · · · ·
订阅关于算法导论的评论:
feed: rss 2.0













