一.初识数据结构

1.什么是数据结构

1.1 数据结构概述

**数据(data)**是指能输入计算机并能被计算机程序识别和处理的符号。我们可以将数据分为两 大类,一类是整数、小数等数值数据,另一类是文字、声音和图像等非数值数据。在生活中,学生 的成绩、身高和体重等是数据,学生的照片、指纹和语音指令等也都是数据。
**数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体来进行考虑和处理。例如可以将数据库表的一行记录看为数据元素。
数据元素由任意多个
数据项(data item)**组成,数据项是构成数据元素不可分割的最小单位, 性质相同的数据元素通常具有相同个数和相同类型的数据项组成。在不同的应用场合中,我们把数据元素又称为元素、结点、顶点等等。例如数据库表的每个字段看作数据项。
**数据对象(data object)**是性质相同的数据元素的集合是数据的子集。可以将每个表都看作一个数据对象。
image.png
**数据结构(data structure)**就是指相互之间存在一种或多种特定关系的数据元素的集合。或者说,数据结构是带结构的数据元素集合。在任何问题中,数据元素之间都不是孤立存在的,它们之 间存在着某种关系,数据元素相互之间的关系我们就称之为结构(structure)。 按照视点不同,数据结构分为数据的逻辑结构和数据的存储结构。

1.2 数据的逻辑结构

数据的逻辑结构反映的是数据元素之间的逻辑关系,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关
按照四类的基础逻辑结构划分,数据的逻辑结构包括:
(1) 集合结构:数据结构中的元素之间除了在“同属一个集合”的关系外,别无其它关系;
(2) 线性结构:数据结构中的元素存在“一对一”的线性关系,例如冰糖葫芦;
(3) 树形结构:数据结构中的元素存在“一对多”的层次关系,例如公司组织架构;
(4) 图形结构或网状结构:数据结构中的元素存在“多对多”的任意关系,例如地图。
image.png
按照线性和非线性划分,数据的逻辑结构包括:
(1) 线性结构
在线性结构中,有且仅有一个开始和终端结点,并且所有节点都最多有一个直接前驱和一个直接后继。也就是,数据元素之间存在“一对一”的关系。 常见的线性结构有:数组、链表、队列、栈等
(2) 非线性结构
简单地说,非线性结构就是表中各个结点之间具有多个对应关系(即一对多关系和多对多关系), 在非线性结构的一个结点可能有多个直接前驱结点和多个直接后继结点。
常见的非线性结构有:二维数组、多维数组、树结构和图结构等。

1.3 数据的物理结构

数据的逻辑结构在计算机存储空间中的存放形式称为数据的物理结构,或称为数据的存储结构。
常见的存储结构有:顺序存储结构、链式存储结构、索引存储结构和散列存储结构。
**顺序存储结构 **用一组连续的存储空间单元来依次的存储数据元素,数据元素之间的逻辑关系由存储位置表示。例如:在 java 中,数组采用的就是顺序存储结构。
**链式存储结构 **用一组任意的存储单元来存储数据元素,通过保存地址的方式找到相关联的数据元素,数据元 素之间的逻辑关系用引用(指针)来表示。例如:数据结构中链表采用的就是链式存储结构
**索引存储结构 **除建立存储结点信息外,还建立附加的索引表来标识结点的地址。例如:图书目录、字典的目 录、通讯目录等等。
**散列存储结构 **根据结点的关键字直计算出该结点的存储地址。例如java 集合中的 HashSet 和HashMap 采用的都是散列存储结构,一种神奇的结构,添加、查询速度快。
**逻辑结构和物理结构总结 **逻辑结构是从具体问题抽象出来的数据模型,是面向问题的,反应了数据结构的关联方式或邻接关系;物理结构,指的就是逻辑结构在计算机中的存储形式,是面向计算机的,其目标是将数据及逻辑关系存储到计算机中。

2.什么是算法

算法的定义从计算机的角度来讲,就是代码运行的步骤
**算法的五大特性 **
(1) 输入性:一个算法有 0 个或多个输入,以刻画运算对象的初始情况,所谓 0 个输入是指算法本 身定出了初始条件。
(2) 输出性:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫 无意义的。
(3) 可行性:算法是可行的,即算法中的每一条指令都是可以实现的,均能在有限时间内完成。
(4) 有穷性:算法执行的指令个数是有限的,必须能在执行有限个指令后终止。
(5) 确定性:算法对于特定的合法输入,对应的输出是唯一的。也就是,对于相同的输入肯定会得 出相同的结果输出
评价算法优劣的依据
同一问题可用不同的算法来解决,而一个算法的质量优劣将影响到算法乃至程序的效率。因此, 我们学习算法目的在于选择合适算法和改进算法,一个算法的评价主要从时间复杂度和空间复杂度 来考虑。
(1) 时间复杂度:评估执行程序所需的时间,可以估算出程序对处理器的使用程度。 作为程序员我们通常更关注时间复杂度,而且都是在重复计算时碰到的问题,计算机运行重复代码的次数越少,算法越优秀
(2) 空间复杂度:评估执行程序所需的存储空间,可以估算出程序对计算机内存的使用程度。
image.png

3.算法的时间复杂度

3.1 时间复杂度的计算

**时间频度的介绍 **一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费 时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为 T(n)。在时间频度 T(n)中,n 称为问题的规模,当 n 不断变化时,时间频度 T(n)也会不断变化。如果我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念
**时间复杂度的定义 **一般情况下,算法中基本操作重复执行的次数是问题规模 n 的某个函数,用 T(n)表示,若有某 个辅助函数 f(n),使得当 n 趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称 f(n)是 T(n) 的同数量级函数。记作 T(n)=O(f(n)),我们也称 O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
**时间复杂度的计算步骤 **
(1) 计算基本操作的执行次数 T(n) 在做算法分析时,一般默认考虑最坏的情况。
(2) 计算 T(n)的数量级 f(n)
求 T(n)的数量级 f(n),只需要将 T(n)做两个操作:(一)忽略常数项、低次幂项和最高次幂项 的系数。(二)f(n)=(T(n)的数量级)。例如,在 T(n)=4n^2+2n+2 中,T(n)的数量级函数 f(n)=n^2。 计算 T(n)的数量级 f(n),我们只要保证 T(n)中的最高次幂正确即可,可以忽略所有常数项、低 次幂项和最高次幂的系数。这样能够简化算法分析,将注意力集中在最重要的一点上:增长率。
(3) 用大 O 表示时间复杂度
当 n 趋近于无穷大时,如果 T(n)/f(n)的极限值为不等于零的常数,则称 f(n)是 T(n)的同数量级函 数。记作 T(n)=O(f(n))。例如,在 T(n)=4n^2+2n+2 中,就有 f(n)=n^2,使得 T(n)/f(n)的极限值为 4, 也就是得到时间复杂度为 O(n^2)。 切记,时间频度不相同时,但是时间复杂度有可能相同,如 T(n)=n^2+3n+4 与 T(n)=4n^2+2n+1 它们的时间频度不同,但时间复杂度相同,都为 O(n^2)

3.2 常见的时间复杂度介绍

常见的时间复杂度有:常数阶 O(1),对数阶 O(log2n),线性阶 O(n),线性对数阶 O(nlog2n), 平方阶 O(n^2),立方阶 O(n^3),指数阶 O(2^n)和阶乘阶 O(n!)。
常用的时间复杂度按照耗费的时间从小到大依次是:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)。
算法的时间复杂度是衡量一个算法好坏的重要指标。一般情况下,随着规模 n 的增大,T(n)的增长较慢的算法为最优算法

**3.3 最好、最坏和平均时间复杂度 **

**最好和最坏时间复杂度 **
最好情况时间复杂度就是在最理想的情况下,执行这段代码的时间复杂度。
最坏情况时间复杂度就是在最糟糕的情况下,执行这段代码的时间复杂度。
比如说循环一个数据组找1,如果1在第一位,那这个算法只要执行一次就行。如果在最后一位,那就要遍历到最后一位。
**最好、最坏和平均时间复杂度总结 **
算法中,如果不做特别的说明,我们讨论的时间复杂度均是最坏情况下的时间复杂度。这样做
的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的
运行时间不会比最坏情况更长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值