‘壹’ 数据结构考试重点
第一章 数据结构基本概念
1、基本概念:理解什么是数据、数据对象、数据元素、数据结构、数据的逻辑结构与物理结构、逻辑结构与物理结构间的关系。
2、面向对象概念:理解什么是数据类型、抽象数据类型、数据抽象和信息隐蔽原则。了解什么是面向对象。由于目前关于这个问题有许多说法,我们采用了一种最流行的说法,即Coad与Yourdon 给出的定义:面向对象 = 对象 + 类 + 继承 + 通信。
要点:
·抽象数据类型的封装性
·面向对象系统结构的稳定性
·面向对象方法着眼点在于应用问题所涉及的对象
3、数据结构的抽象层次:理解用对象类表示的各种数据结构
4、算法与算法分析:理解算法的定义、算法的特性、算法的时间代价、算法的空间代价。
要点:·算法与程序的不同之处需要从算法的特性来解释
·算法的正确性是最主要的要求
·算法的可读性是必须考虑的
·程序的程序步数的计算与算法的事前估计
·程序的时间代价是指算法的渐进时间复杂性度量
第二章 数组
1、作为抽象数据类型的数组:数组的定义、数组的按行顺序存储与按列顺序存储
要点:
·数组元素的存放地址计算
2、顺序表:顺序表的定义、搜索、插入与删除
要点:
·顺序表搜索算法、平均比较次数的计算
·插入与删除算法、平均移动次数的计算
3、多项式:多项式的定义
4、字符串:字符串的定义及其操作的实现
要点:
·串重载操作的定义与实现
第三章 链接表
1、单链表:单链表定义、相应操作的实现、单链表的游标类。
要点:
·单链表的两种定义方式(复合方式与嵌套方式)
·单链表的搜索算法与插入、删除算法
·单链表的递归与迭代算法
2、循环链表:单链表与循环链表的异同
3、双向链表:双向链表的搜索、插入与删除算法、链表带表头结点的优点
4、多项式的链接表示
第四章 栈与队列
1、栈:栈的特性、栈的基本运算
要点:
·栈的数组实现、栈的链表实现
·栈满及栈空条件、抽象数据类型中的先决条件与后置条件
2、栈的应用:用后缀表示计算表达式,中缀表示改后缀表示
3、队列:队列的特性、队列的基本运算
要点:
·队列的数组实现:循环队列中队头与队尾指针的表示,队满及队空条件
·队列的链表实现:链式队列中的队头与队尾指针的表示、
4、双向队列:双向队列的插入与删除算法
5、优先级队列:优先级队列的插入与删除算法
第五章 递归与广义表
1、递归:递归的定义、递归的数据结构、递归问题用递归过程求解
要点:·链表是递归的数据结构,可用递归过程求解有关链表的问题
2、递归实现时栈的应用
要点:·递归的分层(树形)表示:递归树
·递归深度(递归树的深度)与递归工作栈的关系
·单向递归与尾递归的迭代实现
3、广义表:广义表定义、广义表长度、广义表深度、广义表表头、广义表表尾
要点:
·用图形表示广义表的存储结构
·广义表的递归算法
第六章 树与森林
1、树:树的定义、树的基本运算
要点:
·树的分层定义是递归的
·树中结点个数与高度的关系
2、二叉树:二叉树定义、二叉树的基本运算
要点:
·二叉树性质、二叉树中结点个数与高度的关系、不同种类的二叉树棵数
·完全二叉树的顺序存储、完全二叉树的双亲、子女和兄弟的位置
·二叉树的前序·中序·后序·层次遍历
·前序
·中序
·后序的线索化二叉树、前驱与后继的查找方法
3、霍夫曼树:霍夫曼树的构造方法、霍夫曼编码、带权路径长度的计算
4、树的存储:树的广义表表示、树的双亲表示、树与二叉树的对应关系、树的先根·中根·后根·层次遍历。
5、堆:堆的定义、堆的插入与删除算法
要点:
·形成堆时用到的向下调整算法及形成堆时比较次数的上界估计
·堆插入时用到的向上调整算法
第七章 集合与搜索
1、集合的概念:集合的基本运算、集合的存储表示
要点:
·用位数组表示集合时集合基本运算的实现
·用有序链表表示集合时集合基本运算的实现
2、并查集:并查集定义、并查集的三种基本运算的实现
3、基本搜索方法
要点:
·对一般表的顺序搜索算法(包括有监视哨和没有监视哨)
·对有序顺序表的顺序搜索算法、用判定树(即扩充二叉搜索树)描述搜索,以及平均搜索长度(成功与不成功)的计算。
·对有序顺序表的折半搜索算法、用判定树(即扩充二叉搜索树)描述搜索,以及平均搜索长度(成功与不成功)的计算。
4、二叉搜索树:
要点:
·动态搜索树与静态搜索树的特性
·二叉搜索树的定义、二叉搜索树上的搜索算法、二叉搜索树搜索时的平均搜索长度(成功与不成功)的计算。
·AVL树结点上的平衡因子、AVL树的平衡旋转方法
·高度为h的AVL树上的最少结点个数与最多结点个数
· AVL树的搜索方法、插入与删除方法
第八章 图
1、图:图的定义与图的存储表示
要点:
·邻接矩阵表示(通常是稀疏矩阵)
·邻接表与逆邻接表表示
·邻接多重表(十字链表)表示
2、深度优先遍历与广度优先遍历
要点:
·生成树与生成树林的定义
·深度优先搜索是个递归的过程,而广度优先搜索是个非递归的过程
·为防止重复访问已经访问过的顶点,需要设置一个访问标志数组visited
3、图的连通性
要点:
·深度优先搜索可以遍历一个连通分量上的所有顶点
·对非连通图进行遍历,可以建立一个生成森林
·对强连通图进行遍历,可能建立一个生成森林
·关节点的计算和以最少的边构成重连通图
4、最小生成树
要点:
·对于连通网络、可用不会构成环路的权值最小的n-1条边构成最小生成树
·会画出用Kruskal算法及Prim算法构造最小生成树的过程
5、单源最短路径
要点:
·采用逐步求解的方式求某一顶点到其他顶点的最短路径
·要求每条边的权值必须大于零
6、活动网络
要点:
·拓扑排序、关键路径、关键活动、AOE网
·拓扑排序将一个偏序图转化为一个全序图。
·为实现拓扑排序,要建立一个栈,将所有入度为零的顶点进栈
·关键路径的计算
第九章 排序
1、基本概念:关键码、初始关键码排列、关键码比较次数、数据移动次数、稳定性、附加存储、内部排序、外部排序
2、插入排序:
要点:
·当待排序的关键码序列已经基本有序时,用直接插入排序最快
3、选择排序:
要点:
·用直接选择排序在一个待排序区间中选出最小的数据时,与区间第一个数据对调,而不是顺次后移。这导致方法不稳定。
·当在n个数据(n很大)中选出最小的5 ~ 8个数据时,锦标赛排序最快
·锦标赛排序的算法中将待排序的数据个数n补足到2的k次幂2k-1<n≤2k
·在堆排序中将待排序的数据组织成完全二叉树的顺序存储。
4、交换排序:
要点:
·快速排序是一个递归的排序方法
·当待排序关键码序列已经基本有序时,快速排序显着变慢。
5、二路归并排序:
要点:
·归并排序可以递归执行
·归并排序需要较多的附加存储。可以采用一种"推拉法"(参见教科书上习题)实现归并排序,算法的时间复杂度为O (n)、空间复杂度为O(1)
·归并排序对待排序关键码的初始排列不敏感,排序速度较稳定
6、外排序
要点:
·多路平衡归并排序的过程、I/O缓冲区个数的配置
·外排序的时间分析、利用败者树进行多路平衡归并
·利用置换选择方法生成不等长的初始归并段
·最佳归并树的构造及WPL的计算
第十章 索引与散列
1、线性索引:
要点:
·密集索引、稀疏索引、索引表计算
·基于属性查找建立倒排索引、单元式倒排表
2、动态搜索树
要点:
·平衡的m路搜索树的定义、搜索算法
·B树的定义、B树与平衡的m路搜索树的关系
·B树的插入(包括结点分裂)、删除(包括结点调整与合并)方法
·B树中结点个数与高度的关系
·B+树的定义、搜索、插入与删除的方法
3、散列表
要点:
·散列函数的比较
·装填因子 a 与平均搜索长度的关系,平均搜索长度与表长m及表中已有数据对象个数n的关系
·解决地址冲突的(闭散列)线性探查法的运用,平均探查次数的计算
·线性探查法的删除问题、散列表类的设计中必须为各地址设置三个状态
·线性探查法中的聚集问题
·解决地址冲突的(闭散列)双散列法的运用,平均探查次数的计算
·双散列法中再散列函数的设计要求与表长m互质,为此m设计为质数较宜
·解决地址冲突的(闭散列)二次散列法的运用,平均探查次数的计算
·注意:二次散列法中装填因子 a 与表长m的设置
·解决地址冲突的(开散列)链地址法的运用,平均探查次数的计算
‘贰’ 张永的数据结构与算法与严蔚敏数据结构区别
摘要 一.算法
‘叁’ 求数据结构的分析方法
这个得靠自己。旁人无法指导。好好努力,对自己有点信心,坚持就是胜利
‘肆’ 快数据结构的重点是什么,各位大哥大姐,有学过数据结构的帮个忙吧,感谢万分!
重点中的重点是树,特别是树中的二叉树,其相关的算法最好掌握,还有其他章节的主要是栈,队列,串里面的主要是串的模式匹配,基本就这些
‘伍’ 数据结构与算法分析
本文出自:
www点54manong点com
请尊重原创,转载请注明出处,谢谢!
什么是数据结构,为什么要学习数据结构?数据结构是否是一门纯数学课程?它在专业课程体系中起什么样的作用?我们要怎么才能学好数据结构?… 相信同学们在刚开始《数据结构》这门课的学习时,心里有着类似前面几个问题的这样那样的疑问。希望下面的内容能帮助大家消除疑惑,下定决心坚持学好这门课:
1 学习数据数据结构的意义
数据结构是计算机科学与技术专业、计算机信息管理与应用专业,电子商务等专业的基础课,是十分重要的核心课程。所有的计算机系统软件和应用软件都要用到各种类型的数据结构。因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多复杂的课题。要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。打好“数据结构”这门课程的扎实基础,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程、编译原理、人工智能、图视学等都是十分有益的。
2 为什么要学习数据结构
在计算机发展的初期,人们使用计算机的目的主要是处理数值计算问题。当我们使用计算机来解决一个具体问题时,一般需要经过下列几个步骤:首先要从该具体问题抽象出一个适当的数学模型,然后设计或选择一个解此数学模型的算法,最后编出程序进行调试、测试,直至得到最终的解答。例如,求解梁架结构中应力的数学模型的线性方程组,可以使用迭代算法来求解。
由于当时所涉及的运算对象是简单的整型、实型或布尔类型数据,所以程序设计者的主要精力是集中于程序设计的技巧上,而无须重视数据结构。随着计算机应用领域的扩大和软、硬件的发展,非数值计算问题越来越显得重要。据统计,当今处理非数值计算性问题占用了85%以上的机器时间。这类问题涉及到的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。因此,解决这类问题的关键不再是数学分析和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。下面所列举的就是属于这一类的具体问题。
例1:图书馆信息检索系统。当我们根据书名查找某本书有关情况的时候;或者根据作者或某个出版社查找有关书籍的时候,或根据书刊号查找作者和出版社等有关情况的时候,只要我们建立了相关的数据结构,按照某种算法编写了相关程序,就可以实现计算机自动检索。由此,可以在图书馆信息检索系统中建立一张按书刊号顺序排列的图书信息表和分别按作者、书名、出版社顺序排列的索引表,如图1.1所示。由这四张表构成的文件便是图书信息检索的数学模型,计算机的主要操作便是按照某个特定要求(如给定书名)对图书馆藏书信息文件进行查询。
诸如此类的还有学生信息查询系统、商场商品管理系统、仓库物资管理系统等。在这类文档管理的数学模型中,计算机处理的对象之间通常存在着的是一种简单的线性关系,这类数学模型可称为线性的数据结构。
例2:八皇后问题。在八皇后问题中,处理过程不是根据某种确定的计算法则,而是利用试探和回溯的探索技术求解。为了求得合理布局,在计算机中要存储布局的当前状态。从最初的布局状态开始,一步步地进行试探,每试探一步形成一个新的状态,整个试探过程形成了一棵隐含的状态树。如图1.2所示(为了描述方便,将八皇后问题简化为四皇后问题)。回溯法求解过程实质上就是一个遍历状态树的过程。在这个问题中所出现的树也是一种数据结构,它可以应用在许多非数值计算的问题中。
例3:教学计划编排问题。一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些必须按规定的先后次序进行,有些则没有次序要求。即有些课程之间有先修和后续的关系,有些课程可以任意安排次序。这种各个课程之间的次序关系可用一个称作图的数据结构来表示,如图1.3所示。有向图中的每个顶点表示一门课程,如果从顶点vi到vj之间存在有向边<vi,vj>,则表示课程i必须先于课程j进行。由以上三个例子可见,描述这类非数值计算问题的数学模型不再是数学方程,而是诸如线性表、树、图之类的数据结构。因此,可以说数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
学习数据结构的目的是为了了解计算机处理对象的特性,将实际问题中所涉及的处理对象在计算机中表示出来并对它们进行处理。与此同时,通过算法训练来提高学生的思维能力,通过程序设计的技能训练来促进学生的综合应用能力和专业素质的提高。
3数据结构课程的内容
数据结构与数学、计算机硬件和软件有十分密切的关系,它是介于数学、计算机硬件和计算机软件之间的一门计算机专业的核心课程,是高级程序设计语言、操作系统、编译原理、数据库、人工智能、图视学等课程的基础。同时,数据结构技术也广泛应用于信息科学、系统工程、应用数学以及各种工程技术领域。
数据结构课程重在讨论软件开发过程中的方案设计阶段、同时设计编码和分析阶段的若干基本问题。此外,为了构造出好的数据结构及其实现,还需考虑数据结构及其实现的评价与选择。因此,数据结构的内容包括三个层次的五个“要素”,如图1.3所示。
数据结构的核心技术是分解与抽象。通过分解可以划分出数据的三个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。上述两个方面的结合使我们将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。熟练地掌握这两个过程是数据结构课程在专业技能培养方面的基本目标。
结束语:数据结构作为一门独立的课程在国外是从1968年才开始的,但在此之前其有关内容已散见于编译原理及操作系统之中。20世纪60年代中期,美国的一些大学开始设立有关课程,但当时的课程名称并不叫数据结构。1968年美国唐.欧.克努特教授开创了数据结构的最初体系,他所着的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的着作。从20世纪60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们越来越重视数据结构。从70年代中期到80年代,各种版本的数据结构着作相继出现。目前,数据结构的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型和面向对象的观点来讨论数据结构已成为一种新的趋势,越来越被人们所重视。
‘陆’ 数据结构的问题 求步骤和思路
1 学习方法
因为要准备这个话题, 所以我认真的思考了我的学习方法, 但是我觉得基本上我就是上课前看看书、上课时认真听课、 下课以后复习复习、当然还有做作业时很认真的去做。根本谈不上什么好方法, 不过我还是有一些话要送给大家。
我能行!
个人觉得这句话非常重要,不知道大家是怎样看待数据结构这门课的, 有多少人觉得数据结构很难呢看我知道还是有一些同学这样觉得的, 有时候我跟我的朋友讲要怎样学,讲了一大堆以后, 他就向我抱怨:我以前c++都没有学好, 数据结构更学不好了, 这哪跟哪的话啊,数据结构与c++没有什么关系,我想假如抱有这样的心态, 自己就不相信自己, 那是不可能学好的, 然后那些觉得数据结构很难的同学, 我想他们应该会很看重数据结构的吧, 然后就一天到晚捧着一本数据结构, 这样不会觉得很累吗看而且因为觉得很难, 就容易不相信自己, 学的效率也不会很好, 个人认为数据结构很好学, 很容易学, 或许这有点妄自菲薄吧, 但是因为我觉得很容易, 当然就会觉得自己没问题, 学得很轻松, 效果也还可以。大家都是从高考走过来的, 应该知道心态的重要性吧, 两种不同的心态, 完全就是两种不同的效果。 学了这么久数据结构了, 我们到底在学些什么呢看 不知道大家有没有想过, 那现在我们现在来归纳一下我们学习的内容吧, 其实学到现在我们也就学了几种普通的数据结构, 象二叉树, 树, 图,还有排序的问题, 前面的线性表和字符串也就是一些概念, 当然还有一个很重要的KMP算法, 然后在每种数据结构中我们也就是学到了若干处理的算法, 我想真正数起来也就是几十个算法吧。 学习数据结构也就是要掌握这几十种算法, 多简单。至于如何掌握每个算法呢, 我想就是多看看书, 重要的是能够理解。
我能独自完成作业!
这里我的定义和老师的不同, 老师是鼓励大家讨论的, 不过我发现还是有一些同学就是先问好别人算法,然后再自己写, 虽然这个不算抄袭作业, 但自己基本上没有一个思考问题的过程, 虽然要理解算法也会要思考很多, 但是因为没有自己独立的思考过程, 要自己写程序、 写算法的时候根本写不出来, 所以我想如果真的想学好数据结构的话, 最好是能够自己思考问题, 不要刚想了一会就觉得做不出来, 然后就去问其他人。其实老师给我们的作业还是基于我们的水平的, 我绝对相信我们自己能够独自想出算法, 虽有可能会比较长时间吧, 但是这样肯定会比问其他人学到更多的东西。当然我并不是说不要问同学, 有时候就是脑筋转不过来,一问别人就懂了, 当然问了别人不能只是我知道了这个算法, 还应该去想如何思考才能得到这个算法,这样水平会提高很多。
多实验!
这个就没有太多理由了, 我一直觉得编程是一门熟练科学, 多编程,水平肯定会提高, 最重要的是能够养成一种感觉,就是对程序对算法的敏感, 为什么那些牛人看一个算法一下子就看懂了看而自己要看很久才能弄懂, 而且弄懂了过了一阵子又忘记了看其实这个是因为牛人们以前看的程序很多, 编得也很多, 所以他们有了那种感觉,所以我觉得大家应该多看程序, 多写程序, 培养自己的感觉。
2 复习和考试的技巧
我想大家应该都有这样的感觉,就是觉得自己什么都掌握了, 但是在考试的时候就是会犯晕, 有时候一出考场就知道错在哪个了, 然后考完以后一对答案,发现其实考得很简单, 应该都是自己会做的, 这个就是与自己的复习和考试的技巧有关系了。
首先就是复习, 前面已经说过其实我们学的算法也就是几十个, 那么我们的任务也就是理解这几十个算法, 复习也就是要加深你的理解。如何理解算法, 然后理解到什么程度呢看 是能默出整个算法吗看其实不是这样的, 数据结构的考试有它的特点, 考过期中考试了, 大家应该都发现数据结构其实不要求你把整个算法背出来, 它注重考察你的理解, 那么怎么考察呢看其实也就是两种方式吧, 一种就是用实例, 就是给你一个例子, 要你用某个算法运行出结果, 我想这个期末考试的时候仍然会有很多这样的题目, 比如排序那块就很好出这样的题目,要复习这种题目我觉得很简单,就是每个算法都自己用例子去实践一下, 以不变应万变,我期中复习的时候就是这样去做的, 而且考试之前我就觉得那个并查集的题目就很有可能会考, 于是就自己出了几个例子,做了一下。另外一种考察方式就是算法填空和算法改错, 可能有一些同学觉得这种题目很难, 其实我们首先可以确定这两种题目肯定是与书上算法有关系的, 只要理解了书上的算法就可以了,有人觉得看完书以后什么都懂了, 而且要默也默得出来, 其实不是这样的,算法改错和填空主要是考察的细微处, 虽然你觉得你默得出来, 那是能够默出算法的主体部分, 很多细微的地方你就会很容易忽略。我想大家考过期中考以后应该都有这种感觉吧看那要怎样解决这种问题呢看 我觉得有两种方法, 一种就是自己去编程实现, 这种方法比较有意义,还能够提高编程水平, 另外一种就是用实例分析算法的每句话, 我认为这种方法是最有效的。
然后还有一种题目, 就是最后的写算法的题目, 我觉得这种题目还是很好解决的, 只要是能够自己做出作业的, 基本上都会很容易做出来,这也是为什么我前面觉得平时做作业应该自己独立思考的原因,同时做这种题目千万要小心, 尤其是题目简单的时候, 那肯定会有一些小地方要考虑清楚,一不小心就会被扣掉很多分, 这样很不值。
我觉得考试的时候没有太多要讲的, 只要复习好了, 考试的时候细心一点就可以了, 然后就是做一个题目开始就要尽量保证正确,如果觉得留在那里等后面做完了再来检查,这样错误还是很有可能检查不出来, 我期中考试的时候就基本上没有检查, 因为我做每个题目都是确保正确, 用的时间也挺多的, 然后也觉得没有检查的必要了。
一个学生学习数据结构的体会(转)
读《数据结构(C语言版)》(1)
今天开始认真读这本清华版的数据结构,严蔚敏和吴伟民编着。也许你会奇怪我为什么会选择这本C语言描述的数据结构书,现在的数据结构不都用面向对象语言描述吗看其实这本书不是我选的,而是我参加的机试指定的参考书。不过对于本书选用的语言,我倒有自己的看法。用C语言描述显然有很多不便,但是在一个充斥着用OO描述数据结构的世界里,从OO中抽身出来用C看待数据结构的思想,也许更能看清数据结构的本质。
好了,言归正传。在今天这第一篇文章里,我来探讨一下数据结构的基本概念。作者一开篇就归纳了计算机解题的一般步骤:逗首先要从具体问题抽象出一个适当的数学模型,然后设计一个解此数学模型的算法,最后编出程序,进行测试、调试直至得到最终解答。地我把它再进一步归纳一下,就是:抽象数学模型——设计算法——编写程序。这个思路非常重要,除了一些非常简单的问题,所有的程序设计都应该遵循这三个基本步骤。我们平时写程序常犯的错误是忽略第一个或第二个步骤,或者更甚者,前两个都忽略。
在设计数学模型的过程中,实际上就引出了数据结构的概念。本书中作者给出的定义是:逗简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。地国内的教材为了语言上的严谨常常把话说得很难懂。请大家注意这句话里的这几个关键词:1)非数值计算,这说明了数据结构这门学科的应用范围,如果你想解一个线性方程组,大概很难直接找到合适的数据结构;2)操作对象,也就是问题中的数据及其表示的形式;3)关系,即数据间的关系;4)操作,即针对数据的操作。
把以上的定义用公式写出来,就是
Data_Structure = (D, S)
其中D是数据元素的有限集,S是D上关系的有限集。所以在设计数据结构时,首要的任务就是找出要操作的数据,其次是挖掘出数据间的关系。这两步完成以后,数据的逻辑结构就定下来了。其中数据间的结构有以下几种:
集合,这和数学中的集合概念是一致的;
线性结构,即数据元素之间一对一的关系;
树形结构,即数据元素之间一对多的关系;
图状结构或网状结构,即数据元素之间多对多的关系。
然而只有逻辑结构是不够的,程序要能够运行,必须把数据的逻辑结构在计算机中表示出来,也就是设计物理结构。大多数高级语言都对数据的物理结构有较好支持,如各种数据类型。作者在解释数据类型的概念时说到:逗引入数据类型的目的,从硬件的角度看,是作为解释计算机内存中信息含义的一种手段,而对使用数据类型的用户来说,实现了信息的隐蔽,即将一切用户不必了解的细节都封装在类型中。地这个概括非常精辟,从中可以看出以后的OOP只是在更高层次上对信息的封装和隐蔽。
对数据类型进一步扩展,作者引出了抽象数据类型的概念。抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。在引入抽象数据类型后,使逻辑结构更加独立,从而让程序员可以更加专注于逻辑结构的设计。把抽象数据类型用公式表示出来,就是(D, S, P),其中D是数据对象,S是D上的关系集,P是对D的基本操作集。如果计算机解题一定要遵循一个通用的模式的话,上面这个式子就给出了答案。
读《数据结构(C语言版)》(2)
本节谈一谈算法分析和大O估算法(big-O notation)。算法效率的度量一般采用事前分析估算的方法,通常的做法是,逗从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度地。谈到这里时,作者引出了大O估算法。
在本书中,作者对大O估算法的介绍显得有些草率。一开始就冒出一个式子T(n) = O(n3),然后在本页最底下用小字介绍了所谓的逗"O"的形式定义地:若f(n)是正整数n的一个函数,则xn=O(f(n))表示存在一个正的常数M,使得当n≥n0时都满足|xn|≤M|f(n)|。也许是我数学基础太差,总之看到这个定义时我一头雾水。不知道为什么作者没有花一点篇幅介绍大O估算法的由来和定义。我google了一下,发现了这样的介绍:
Definition: A theoretical measure of the execution of an algorithm, usually the time or memory needed, given the problem size n, which is usually the number of items. Informally, saying some equation f(n) = O(g(n)) means it is less than some constant multiple of g(n). The notation is read, "f of n is big oh of g of n".
Formal Definition: f(n) = O(g(n)) means there are positive constants c and k, such that 0 ≤ f(n) ≤ cg(n) for all n ≥ k. The values of c and k must be fixed for the function f and must not depend on n.
Note: As an example, n2 + 3n + 4 is O(n2), since n2 + 3n + 4 < 2n2 for all n > 10. Strictly speaking, 3n + 4 is O(n2), too, but big-O notation is often misused to mean equal to rather than less than. The notion of "equal to" is expressed by Θ(n).
The importance of this measure can be seen in trying to decide whether an algorithm is adequate, but may just need a better implementation, or the algorithm will always be too slow on a big enough input. For instance, quicksort, which is O(n log n) on average, running on a small desktop computer can beat bubble sort, which is O(n2), running on a supercomputer if there are a lot of numbers to sort. To sort 1,000,000 numbers, the quicksort takes 20,000,000 steps on average, while the bubble sort takes 1,000,000,000,000 steps!
Any measure of execution must implicitly or explicitly refer to some computation model. Usually this is some notion of the limiting factor. For one problem or machine, the number of floating point multiplications may be the limiting factor, while for another, it may be the number of messages passed across a network. Other measures which may be important are compares, item moves, disk accesses, memory used, or elapsed ("wall clock") time.
(以上介绍来自:Paul E. Black, "big-O notation", from Dictionary of Algorithms and Data Structures, Paul E. Black, ed., NIST.)
另外,这个帖子也讨论了算法的时间复杂度估计,说得非常通俗易懂。
读《数据结构(C语言版)》(3)
【问题描述】
设计一个可进行复数运算的演示程序。
【基本要求】
实现下列六种基本运算:
由输入的实部和虚部生成一个复数;
两个复数求和;
两个复数求差;
两个复数求积;
从已知复数中分离出实部;
从已知复数中分离出虚部。
运算结果以相应的复数或实数的表示形式显示。
(全文见附件)
‘柒’ 数据结构中评价算法的两个重要指标是什么
数据结构中评价算法的两个重要指标是时间复杂度和空间复杂度。
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
1、时间复杂度:
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。
2、空间复杂度:
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
(7)数据结构事前分析估算法扩展阅读:
评估算法效率的方法:
1、事后统计方法
这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
2、事前分析估算方法
在计算机程序编写前,依据统计方法对算法进行估算。经过总结,可以发现一个高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:算法采用的策略、编译产生的代码质量、问题的输入规模、机器执行指令的速度。
参考资料来源:网络-算法