基本概念
数据:数据是信息的载体,对客观事物的字符表示。
数据元素:数据的基本单位,通常作为一个整体进行考虑和处理。
数据项: 一个数据元素由多个数据项组成,数据项是数据元素不可分割的最小单位。
数据对象:性质相同的数据元素的集合。
数据结构:数据元素相互之间存在一种或多种特定关系的数据元素集合。
数据结构这门课着重关注的是数据元素之间的关系,和对这些数据元素的操作,而不关心具体的数据项内容。
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构定义中的“关系”指的是逻辑关系,即逻辑结构,与实现无关。
数据结构包括三方面的内容:逻辑结构、存储结构、数据的运算。
数据的逻辑结构是从面向实际问题的角度出发的,只采用抽象表达方式,独立于存储结构;
而数据的存储结构是逻辑结构在计算机上的映射,它不能独立于逻辑结构而存在。
注意:
1)数据的运算包括定义和实现,定义是针对逻辑结构的,实现是针对存储结构的。
2)区分数据结构和逻辑结构
- 顺序表、哈希表、单链表是数据结构。既描述逻辑结构,又描述存储结构和数据运算。
- 有序表仅描述元素之间的逻辑关系,属于逻辑结构。
3)循环队列是顺序表,属于数据结构;而栈是ADT,只表示逻辑结构。
4)链式存储设计时,各个不同结点的存储空间可以不连续,但结点内的存储单元地址必须连续。
5)广义表是广义线性结构,不是线性结构。
数据类型
1)原子类型
2)结构类型
3)抽象数据类型(ADT)
抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象、数据关系、基本操作)这样的三元组来表示,从而构成一个完整的数据结构定义。
如何表示
二元组
B =(D,S)
B:表示该数据结构的名称
D:表示数据结构中的数据元素集合
S:表示数据结构中的数据元素之间的关系
Bank = (D,S)
D={张三,李四,王五}
S={<张三,李四>,<李四,王五>}
ADT(三元组)
ADT在二元组的基础上增加了“基本操作”。
算法
算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
程序 = 数据结构 + 算法
算法的五个特性
- 有穷性:一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
- 确定性:算法中每一条指定必须有确切的含义,读者理解时不会产生二义性。并且在任何条件下,算法只有惟一的一条执行路径,即对于相同的输入只能得出相同的输出。
- 可行性:一个算法是能行的。即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
- 输入:一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
- 输出:一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。
注意:算法必须是有穷的,而程序可以是无穷的。
算法设计的要求
- 正确性:算法能够满足具体问题的需求。
- 可读性:算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解。
- 健壮性:当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
- 效率与低存储量需求:效率指的是算法执行的时间。存储量需求指算法执行过程中所需要的最大存储空间。
算法效率的度量
1)事后统计法
2)事前统计法
时间复杂度
常<对<幂<指<阶
求和定理:假设T1(n)和T2(n)是程序段P1、P2的执行时间,并且T1(n)= O(f(n)), T2(n)=O(g(n)),那么
总执行时间复杂度是T1(n)+T2(n)= O(MAX(f(n),g(n)))。(多个并列循环)。
求积定理:假设T1(n)和T2(n)是程序段P1、P2的执行时间,并且T1(n)= O(f(n)), T2(n)=O(g(n)),那么
总执行时间复杂度是T1(n)*T2(n)= O(f(n)*g(n))。(多层嵌套循环·)
1) 顺序执行的代码只会影响常数项,可以忽略
2)只需挑选循环中的一个基本操作分析它的执行次数与n的关系即可。
3)如果有多层嵌套循环,只需关注最深层循环循环了几次。
最坏时间复杂度:最坏情况下算法的时间复杂度
最好时间复杂度:最好情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
时间复杂度是指最坏时间复杂度,只关注最高此项,只有常数项记作1。
空间复杂度
算法存储包含:输入数据所占的空间、程序本身所占的空间和临时变量所占的空间。
算法空间复杂度 S(n) = O(f(n))
算法原地工作指算法所需的辅助空间为常量,S(n)= O(1)。
空间复杂度,只需关注存储空间大小与问题规模相关的变量。