目录
本博客根据《数据结构》(C语言版)—严蔚敏 编写总结(仅供学习参考)
一、绪论
1.1 数据结构讨论的范畴
数据结构讨论什么?
N.Wirth教授提出:Algorithm(算法) + Data Structures(数据结构) = Programs(程序设计 )
程序设计:为计算机处理问题编制一组指令集
计算机解题:计算机对某类信息进行某类处理
那么对此就有两个问题:
1.怎么样进行处理?(策略是什么) 算法
2.处理的信息怎么表示?(问题的数据模型是什么)数据结构
那么在这里举出两个例子:(链接到的百度百科,可以不看,就是这么个意思)
eg1:数值计算的程序设计问题:①结构静力分析计算——线性代数方程组
②全球天气预报——环流模式方程
eg2:非数值计算的程序设计问题:① 计算机对弈—算法:对弈的规则和策略
模型:棋盘、棋子怎么表示
②某某数据库管理——算法:项目?页面?如何管理?等
模型:表格和数据库
综合各种程序设计问题,抽取它具体的物理含义就可以得到数据模型
概括:
官方:数据结构描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中的表示和实现
1.2 基本概念(名词和术语)
一、数据
数据:所有能被输入到计算机中,而且可以被计算机处理的符号的集合
由此可以看出:数据是计算机操作对象的总称、也可以说是计算机处理信息的某种载体
是不是可以理解为:数据就是计算机的灵魂,我们玩原神的时候无论是手机还是鼠标,都是通过数据来操作到你的角色的
二、数据元素
数据元素:数据中的一个“个体”,数据结构中的基本单位
eg:原神角色(数据元素)
姓名 武器 神之眼 所属国度 出生日期 武器 年 月 日 (出生日期) 组合项
三、数据结构
数据结构:带结构的数据元素集合
eg:一个含12位数的十进制数可以用三个4位数的十进制数表示
5201,1120,1314 —— a1(5201), a2(1120), a3(1314) —— 大家可以猜一猜1120是谁呢
这里:a1、a2、a3有“次序”关系 <a1,a2>、<a2,a3>
5201,1120,1314 ≠ 5201,1314,1120
这就好比在说:A接W接外圈刮,接无情铁手接A接A打出血怒,接一刀斩 完美单杀
而换了个顺序就是:A接W接外圈刮,接一刀斩,接无情铁手接A接A打出血怒 被对面丝血反杀 很明显是不一样的吧
数据的逻辑结构:线性结构、树形结构、图/网状结构、集合结构
数据结构的形式定义:数据结构——二元组 Data_Structures = (D,S)
其中:D 数据元素的有限集 S是D上关系的有限集
四、数据的存储结构
存储结构:逻辑结构在存储器上的映像(表示)
五、数据元素的映像方法
用二进制位(bit)的位串表示数据元素
例如:
(321)= (501)= (101000001)
(十进制)(8进制) (二进制)
六、关系的映像方法(表示<x,y>的方法)
顺序映象:以存储位置的相邻表示后继关系y的存储位置和x的存储位置之间差一个常量C
而C是一个隐含值,整个存储结构中只含元素本身的信息
a1 C a2 C a3 C
链式映象:以附加信息(指针)表示后继关系
需要用一个和x在一起的附加信息指示y的存储位置
PS:在不同编程环境中,存储结构可能有不同描述方法
当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述
例如:以3个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型,定义长整数为:
typedef int Long_int[3]
七、数据类型
当用高级程序设计语言进行编写中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。
数据类型是一个值的集合和定义在此集合上的一组操作总称
三、抽象数据类型(ADT)
数学模型以及定义在此数学模型上的一组操作操作
ADT有两个重要特征:
数据抽象
用ADT描述实体时,强调本身特征,以及其所能完成的功能、以及它的外部用户接口(外界使用它的方法)
没错,这就是抽象(都能看出来这是王手小姐吧),甚至还有技能,其实还可以更简单
--------------------------------------------------------------------------------------------------------------------------
抽象数据类型复数:
数据对象:D = { e1,e2 | e1,e3∈RealSet }
数据关系:R1 = { <e1,e2> | e1是复数的实数部分,
| e2是复数的虚数部分 }
基本操作:InitCOmplex(&Z,v1,v2)、DestroyComplex(&Z)、GetReal(Z,&realPart)等
在使用时可以直接调用这些接口
数据封装
将实体的外部特征和内部实现细节分离,并且对外部用户隐藏内部实现的细节
抽象数据类型的描述方法
抽象数据可以用(D,S,P)三元组表示
D:数据对象 S是D上的关系集 P是对D的基本操作集
抽象数据类型的表示和实现
抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现
1.2 算法和算法的衡量
一、算法
算法是为了解决某类问题而规定的一个有限长的操作序列
算法是对特定问题求解步骤的一种描述,算法具有如下特性:有穷性、确定性、可行性、输入、输出
1、有穷性
对于任意一组合法输入,在执行有穷步骤之后一定能结束,也就是:算法中每个步骤都能在有限时间内完成
2、确定性
对于每种情况下所有执行操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径
3、可行性
算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现它
4、有输入
作为算法加工对象的量值,通常体现为算法中一组变量。有些输入量需要在算法执行过程中输入,而有的算法表面没有输入,实际上被嵌入算法中
5、有输出
它是一组与“输入”有确定关系的量,是算法进行信息加工后得到的结果,这种确定关系就是算法的功能
二、算法设计的原则
设计算法通常考虑一下目标:正确性,可读性,健壮性,高效率与低存储量需求
1、正确性
首先,算法应满足特定“规格说明”方式给出的需求。
其次,对算法是否“正确”理解分四个层次:
a. 程序中不含语法错误
b. 程序对于几组输入数据能够得到满足要求的结果
c. 程序对于精心选择的、典型、苛刻切带有刁难性的几组输入数据都能得到要求的结果
比如在提瓦特,如何用一支队伍同时满足:伤害、大世界体验、深渊都满足的队伍?
这时候要是有:拐 奶 主c 协同(以这个为模板可以理解为上面的东西)
d. 程序对一切合法的输入数据都能满足说明要求的结果
2、可读性
算法主要是为了人的阅读和交流,其次才是机器执行
晦涩难懂的程序容易隐藏较多的错误
3、健壮性
当输入数据非法时,算法也能适当做出反应或进行处理,而不会是产生莫名其妙的结果
4、高效率与低存储
三、算法的度量
-
时间复杂度
-
空间复杂度
-
衡量一个算法是否优秀,则主要从以下几点考虑:正确性,可读性,健壮性,时间复杂度,空间复杂度
*********************************************** 未完待续 ***********************************************