【数据结构与算法】数据结构绪论

前言

程序 = 数据结构 + 算法
数据结构: 如何用数据正确地描述现实世界的问题,并存入计算机。
算法: 如何高效地处理这些数据,以解决实际问题。


一、数据结构的基本概念

·数据: 数据是信息的载体、符号的集合,能描述客观事物。数据能被计算机识别,并且被计算机程序处理。

·数据元素: 是组成数据的基本单位,在计算机中通常作为整体进行考虑和处理。

·数据项: 构成数据元素的不可分割的最小单位,一个数据元素可由若干个数据项组成。

·数据对象: 数据对象是具有相同性值的数据元素的集合,是数据的一个子集。

·数据结构: 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

举例理解:
1.学校里的好多类型的表:数据
2.单独的一张成绩单表:数据对象
3.成绩单中每一行有姓名、课程、班级、成绩:数据元素
4.成绩单中每一行的每一个表格姓名等都是一个个的数据项

二、数据结构的三要素

1.数据的逻辑结构

逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。

逻辑结构分为以下四种:
(1)集合结构: 集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。(类似于数学中的集合)
(2)线性结构: 结构中的数据元素之间只存在一对一的关系,除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。(如 排队取号)
(3)树形结构: 结构中数据元素之间存在一对多的层次关系。(如 思维导图)
(4)图状结构: 数据元素之间是多对多的关系。(如 道路信息)

2.数据的存储结构(物理结构)

存储结构(物理结构):是指数据的逻辑结构在计算机中的存储形式。

存储结构包括:
1.顺序存储:把逻辑上相邻的元素存储在物理位置也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
2.链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。
3.索引存储:在存储元素信息的同时,还建立附加的索引表,索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。
4.散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。

3.数据的运算

·数据的运算包括运算的定义和实现。
·运算的定义是针对逻辑结构指出运算的功能。
·运算的实现是针对存储结构的,指出运算的具体操作步骤。

三、数据类型和抽象数据类型

1.数据类型是一个值的集合和定义在此集合上的一组操作的总称。
例:
(1)原子类型。其值不可再分的数据类型。如bool 和int 类型。
(2)结构类型。其值可以再分解为若干成分(分量)的数据类型(例如:结构体)。
2.
抽象是指抽出事物具有的普遍性的本质。
抽象数据类型(Abstract Data Type,ADT):一个数学模型及定义在该模型上的一组操作。体现了程序设计中问题分解、抽象和信息隐藏的特性。

四、算法的基本概念

1.什么是算法

算法是对特定问题求解步骤的一种描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

2.算法的特性

(1)有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
(2)确定性:算法中每条指令必须有确定的含义,对于相同的输入只能得到相同的输出。
(3)可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
(4)输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
(5)输出:一个算法有一个多个输出,这些输出是与输入有着某种特定关系的量。

3.算法设计的要求

(1)正确性:算法应能够正确的求解问题。
(2)可读性:算法应具有良好的可读性,以帮助人们理解。
(3)健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名奇妙地输出结果。
(4 )时间效率高和储存量低:花的时间少即:时间复杂度低。不费内存即:空间复杂度低。

4.算法效率的度量方法

(1)事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器
对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
(2)事前统计方法:在计算机程序编 制前,依据统计方法对算法进行估算。


避免在处理大规模问题时出现效率低下,耗费较多资源,所以引入了算法复杂度,算法复杂度可以来衡量算法的效率和算法的可行性,可以帮助选择出最优的算法来解决问题;

五、算法的时间复杂度

1.时间复杂度的概念:

         在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知
道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,而且每个人的机器不同,网络等因素的影响,不同时间地点所测出来的时间都不同,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

实际中在计算时间复杂度时,并不是要计算出精确的执行的次数,而是只需要计算出大概次数,抓大头,这种表示方法叫大O渐近表示法。

2.大O渐进表示法:
大O符号:是用于描述函数渐进行为的数学符号。
推导大O阶方法:
(1)用常数1取代运行时间中的所有加法常数。
(2)再修改后的的运行次数函数中,只保留最高阶项。
(3)如果最高阶项存在且系数不是1,则去除与这个项相乘的系数。

有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)

常用技巧:
加法规则:O(f(n)) + O(g(n) ) = O(max ( f(n),g(n) ) )
乘法规则:O(f(n)) * O(g(n) ) = O( f(n) * g(n) )
“常对幂指阶”:
在这里插入图片描述

常用的时间复杂度如下表所示:
在这里插入图片描述

六、算法的空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外临时占用存储空间大小的量度 。

空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值