国内关于数据结构的教材,不可不提严蔚敏的《数据结构-C语言实现》这本书。想必科班出身的,尤以考研族甚为熟悉。可谓国内权威教材。本人刚考完研,其内容自然是读过不下3遍。其内容非常基础,乃是介绍了数据结构的基本内容,作为广大程序员的入门教材,却也足够。语言许多地方有些晦涩,但认真推敲也无较大瑕疵。本人也看过耿国华版本的《数据结构》,与前者差别不大,语言更加亲和,但深度广度不及严版。
最近钻研CLRS,以求在数据结构与算法方面更进一步学习,着实发现国外教材的严谨,全面,严奶奶着实不及。也发现前路漫漫,其修远兮,我必须上下而求索。也发现了一些中外教材定义上不一致的地方,尤以树这个方面比较突出。
一些差别:
1.深度,高度的定义
在严教材中,对深度和高度有如下定义(P120):
结点的层次从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第l层,则其子树的根就在第l+1层。......树中结点的最大层次称为树的深度或高度。
而在CLRS中,却有不同的定义(附录B.5.2,P672):
从根r到结点x的路径长度称为x在T中的深度。结点在树中的高度是从结点向下到某个叶结点最长简单路径中边的条数。而树的高度也等于树中结点的最大深度。
严版的定义深度和高度等价,作为树的属性。而CLRS中深度与高度“互补”其和为树的深度(高度),对于树,也有高度的属性。
如右图:
如严版定义,根结点A的层次为1,B、C层次为2,以此类推,而二叉树的深度(高度)为5.
若如CLRS中定义,根结点A的深度为0,高度为4,而树的高度为4.
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叉树定义为:
CLRS中的完全二叉树定义与严版的满二叉树定义实质相同,都是指这样一棵二叉树:
但严版的完全二叉树与CLRS中的满二叉树则大有不同,前者可为:
这在CLRS中,则不是满二叉树,更不是完全二叉树。
对于上图,在CLRS定义中,均为满二叉树,但在严版教材中,只有右边的可称为完全二叉树。
对于这些差别,其实:
然而,许多这些差别是由于翻译问题造成的,请听我道来:
在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/ 希望对你有所帮助。
分享到:
相关推荐
在中国市场,由于其独特的监管环境和市场动态,模型可能需要额外考虑诸如信用风险、流动性风险以及中国特色的市场规定等因素。 总的来说,“CB.zip”中的“CB.txt”文件提供了对中国可转债定价的深入理解和实践应用...
"易语言"是一种中国特色的编程语言,设计目标是让编程变得简单、直观。在这个压缩包文件"易语言源码60万条数据用超级列表框快速(小于1秒)显示.rar"中,我们关注的核心知识点是如何使用易语言来实现一个高效的数据...
3. 树型结构:介绍树的概念、二叉树及其遍历方法,以及树和二叉树的应用,如二叉搜索树、平衡树等。 4. 图论基础:图的定义、图的存储结构(邻接矩阵、邻接表)、图的遍历算法(深度优先搜索、广度优先搜索)。 5....
清华大学作为中国顶级的教育机构,其在计算机科学领域的教学资源深受业界认可。"清华片数据结构演示系统"显然是为了帮助学习者更直观、深入地理解数据结构的工作原理而设计的一个教学工具。 该系统可能包含各种数据...
《剑指Offer》中包含大量关于算法和数据结构的题目,如二叉树、链表、栈、队列、图等。这些题目可以帮助读者提升解决问题的能力,熟练运用各种算法。 8. **深度学习与计算机图形学**: 虽然不是C++的核心内容,但...
在易语言这个中国本土化的编程环境中,学习和理解数据结构的重要性不言而喻。易语言版的数据结构大全源码提供了一个极好的平台,帮助初学者深入理解和实践这些概念。 易语言作为一款面向对象的、以中文编程为特色的...
易语言是一种中国本土的、以中文编程为特色的编程语言,它倡导“易学易用”的理念,使编程更加贴近中文使用者的理解。在易语言中实现二叉堆,开发者需要理解并掌握以下知识点: 1. **数据结构**:首先要了解二叉树...
机械工业出版社出版的中文版,保留了原书的特色,同时针对中文读者进行了适当的翻译和解释,使得教材内容更加适合中国读者学习。 在数据结构与算法分析的研究与教学中,Java语言因其面向对象的特性,以及强大的标准...
2. 数据结构:链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、哈希表等,这些数据结构在解决复杂问题时起到关键作用。 3. 字符串处理:字符串是编程中常用的数据类型,涉及到的操作有拼接、比较、查找子串等...
易语言是一种中国本土开发的编程语言,它以中文编程为特色,旨在降低编程难度,让更多人能够参与编程。 在图像管理器的源码中,我们通常会看到以下几个核心知识点: 1. 图像文件格式处理:图片管理器需要支持多种...
剑指Offer的题目通常更加偏向于面试场景,涵盖了一些经典的面试题,如二叉树、链表、数组、字符串等方面的题目,对求职者在算法和数据结构上的理解有着较高的要求。 **面试题** “面试题”分栏可能是LeetCode中...
4. **POJ(Programming Online Judge)** - POJ是中国较早的在线编程竞赛平台,主要支持C、C++和Java,题库广泛,包括ACM/ICPC竞赛题目,是竞赛编程者的热门选择。 **三、C语言在OJ中的应用** C语言是一种底层、...