数据结构复习

写在最前:

写文章的初衷只是为了复习与记录自己的成长,笔者本人也还是学生,文章中难免会出现许多问题与错误,文章内容仅供参考,有不足的地方还请大家多多包涵并指正,谢谢~

第一章:绪论

1.1 数据结构的基础概念

数据(data)是指描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。

数据元素(data element),也称结点,是组成数据的基本单位,是数据集合的个体。在计算机中通常作为一个整体进行考虑和处理。一个数据元素可由一个或多个数据项组成,数据项(data item)是有独立含义的最小单位,此时的数据元素通常称为记录(record)。

数据对象(data object)是指性质相同的数据元素的集合,是数据的一个子集。

数据结构(data structure)是指相互之间存在一种或多种特定关系的数据元素集合,应包括数据元素集合及元素间关系的集合,即数据的组织形式。

数据类型(data type)是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。数据类型中定义了两个集合,即该类型的取值范围以及该类型中可允许使用的一组运算。

抽象数据类型(abstract data type,ADT):定义了一个数据对象、数据对象中各元素间的结构关系以及一组处理数据的操作。

ADT包括定义和实现两方面,其中定义是独立于实现的。定义仅给出一个ADT的逻辑特性,不必考虑如何在计算机中实现。

抽象数据类型最重要的特点是数据抽象和信息隐蔽

抽象的本质是抽取反映问题的本质点,而忽略非本质的细节,这是从事计算机研究的重要方法。

ADT包括数据对象、数据元素间的结构关系、操作三个部分,其定义格式可以有多种,本复习文章中采用的格式如下:

ADT<ADT名>

|数据对象:<数据对象的定义>

结构关系:<结构关系的定义>

基本操作:<基本操作的定义>

|ADT<ADT名>

1.2 数据结构的内容

数据元素间的相互关系具体应包括三个方面:数据的逻辑结构、数据的存储结构和数据的运算集合

数据的逻辑结构是指数据元素之间逻辑关系描述,根据元素之间关系的不同特性,通常有下列四类基本结构:

集合结构:结构中的数据元素之间除了属于同一集合的关系外,无任何其他关系。

线性结构:结构中的数据元素之间存在着一对一的线性关系

树状结构:结构中的数据元素之间存在着一对多的层次关系

图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系

如图为四类基本数据结构示意图:

由于集合中关系只有属于或不属于这种简单的属于关系,可以用其他的结构代替它,故数据的四类基本逻辑结构可概括如下:

存储结构(又称物理结构)是逻辑结构在计算机中的存储映像,包括数据元素映像和关系映像,它是逻辑结构在计算机中的实现,包括数据元素的表示和关系的表示。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像(顺序存储结构)非顺序映像(非顺序存储结构)

运算集合:讨论数据结构的目的是为了在计算机中实现操作,因此在结构上的运算集合是很重要的部分。数据结构就是研究一类数据的表示及其相关的运算操作,如增、删、改就是数据的操作集合。

综上所述,数据结构的内容可归纳为三个部分:逻辑结构、存储结构和运算集合。即:按某种逻辑关系组织起来的一批数据,按一定的映像方式把它们存放在计算机的存储器中,并在这些数据上定义一个运算的集合,这些事数据结构的基本内容。

1.3 算法

算法+数据结构=程序

算法(algorithm)是规则的有限集合,是为解决特定问题而规定的一系列操作。

算法的特性:

①有限性:有限步骤之内正常结束,不能形成无穷循环

②确定性:算法中的每一个步骤必须有确定含义,无二义性,即有唯一执行路径

③可行性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成

④输入:有多个或0个输入

⑤输出:至少有一个或多个输出

在算法的五大特性中,最基本的是有限性、确定性可行性这三个特性。

算法设计的要求(基本特征):正确性、可读性、健壮性(鲁棒性)、高效率低存储量(高效低耗)

1.4 算法性能评价

评价算法性能的标准主要从算法执行时间占用存储空间两方面考虑,即算法执行所需的时间和存储空间来判断一个算法的优劣。

性能评价:对问题规模与该算法在运行时所占用空间与所耗费时间给出一个数量关系的评价。

数量关系评价体现在时间上,及算法经编程实现后在计算机中运行所耗费的时间

数量关系评价体现在空间上,及算法经编程实现后在计算机中运行所耗费的存储量

问题规模:算法性能与问题规模相关。问题规模是问题大小的本质表示,对不同的问题其表现形式不同,算法求解问题的输入量称为问题的规模,一般用整数表示

1.5 时间复杂度及空间复杂度

算法耗费的时间:一个算法的执行时间是指算法中所有语句执行时间的总和。每条语句的执行时间等于该条语句的执行次数乘以执行一次所需实际时间。

语句频度:指该语句在一个算法中重复执行的次数,一个算法的时间耗费就是该算法中所有语句频度之和。

算法的时间复杂度T(n):算法的时间复杂度是算法的时间度量,对于算法分析,关心的是算法中,语句总的执行次数f(n)是问题规模n的函数,进而分析f(n)随n的变化情况并确定T(n)的数量级。用"O"来表示数量级,则

T(n)=O(f(n))

它表示随问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

由于算法执行的实际机器时间难以精确统计,因此主要考虑用算法时间复杂度的数量级(即算法的渐进时间复杂度)来评价一个算法的时间性能。

数据结构中常用的时间复杂度频率计数有以下7种:

O(1)常数型,O(n)线性型,O(n²)平方型,O(n³)立方型,

O(2ⁿ)指数型,O(log₂n)对数型,O(nlog₂n)二维型

算法的空间性能分析:

一般情况下,一个程序在机器上执行时,除了需要存储本身所用的指令、常数、变量和输入数据以外,还需要对一些数据进行操作的辅助存储空间。其中,对于输入数据所占用的具体存储量取决于问题本身,与算法无关,这样只需要分析该算法在实现时所需要的辅助空间单元个数即可。

一个算法的占用空间是指算法世纪占用的辅助空间总和

算法的空间复杂度S(n)定义为该算法所耗费的存储空间的数量级,它是问题规模n的函数,记作

S(n)=O(f(n))

若算法执行时所需要的辅助空间相对于输入量而言是一个常数,则称这个算法为原地工作,辅助空间为O(1)

算法性能的选择:

要想使一个算法既占用存储空间少,又运行时间短,而且其他性能也好,这是很难做到的。原因是上述要求有时相互抵触:要节约算法的执行时间往往要以牺牲更多的空间为代价,而为了节省空间可能要耗费更多的计算时间。因此,只能根据具体情况进行取舍。以下是一些建议:

①若该程序使用次数较少,则力求算法简单易懂

②对于反复使用的程序,应尽可能选用快速的算法

③若待解决的问题数据量极大,计算机的存储空间较小,则相应算法主要考虑如何节省空间

总结:

写在最后,

因本系列文章主要为复习,故重点关注数据结构概念知识与理论知识,涉及数据结构与高级语言表示、结构化程序设计与函数的模块化、算法描述规范与设计风格等内容就不再赘述,若读者需要学习数据结构完整知识请另参阅教材及相关线上课程,笔记仅作为参考,若读者发现内容有误请联系QQ:3549546727指正,谢谢!

1.1 单项选择题 1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程。 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法 2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是① 的有限集合,R是D上的② 有限集合。 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映象 C.存储 D.关系 3. 在数据结构中,从逻辑上可以把数据结构分成 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4. 算法分析的目的是① ,算法分析的两个主要方面是② 。 ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 ② A. 空间复杂性和时间复杂性 B. 正确性和简明性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 1.2 填空题(将正确的答案填在相应的空中) 1. 数据逻辑结构包括 、 、 和 四种类型,树形结构和图形结构合称为 。 2. 在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。 3. 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。 4. 在图形结构中,每个结点的前驱结点数和后续结点数可以 。 5. 线性结构中元素之间存在 关系,树形结构中元素之间存在 关系,图形结构中元素之间存在 关系。 6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。 7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0;j<n; j++) A[i][j]=0; 8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0; j<i; j++) A[i][j]=0; 9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) for (k=0;k<n;k++) s=s+B[i][j][k]; sum=s; 10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 int i=0,s=0; while (s<n) { i++; s+=i; //s=s+i } 11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 i=1; while (i<=n) i=i*2;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你代码有bug!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值