——前言——
一、基本概念
1、数据:描述客观事物属性的符号集合。
2、数据元素:是数据的基本单位,通常作为一个整体进行考量和处理。
3、数据项:是构成数据元素不可分割的最小单位,一个数据元素有若干个数据项组成。
4、数据对象:具有相同性质的数据元素的集合,是数据的一个子集。
5、数据结构:是相互作用之间存在一种或多张特定关系的数据元素的集合
6、数据类型:是一个值的集合和定义在此集合上的一组操作的总称。
7、抽象数据类型(ADT):是抽象数据组织及与之相关的操作。定义一个ADT就是定义一种数据结构——”逻辑结构+数据的运算”
--扩:
①原子类型;其值不可再分的数据类型。
如:bool类型{值的范围:true、false;可进行操作:与、或、非....}
int类型{-2147483648~ 2147483647;可进行操作:加、减、乘、除、模运算..}
②结构类型;其值可以在分解为若干成分(分量)的数据类型。
如: struct Coordinate
{
int x;//横坐标
int y;//纵坐标
};
——数据结构——
一、三要素
(1)逻辑结构
: 数据间的关系
1、集合(无关系);
2、线性结构(一一对应)
3、树性结构(一对多);
4、图结构(多对多)
--扩:队列(先进先出/后进后出)、栈(后进先出/先进后出)、字符串是特殊的线性结构
(2)数据的运算
: 针对某种逻辑结构,结合实际需求,定义基本运算。
(3)物理结构(存储结构)
: 如何用计算机实现这种数据结构。
1、顺序存储:逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。
2、链式存储:逻辑上相邻的元素在物理上可以不相邻。
3、散列存储(哈希存储):根据元素的关键字直接计算出该元素的存储地址。
4、索引存储:在存储元素信息的同时,还建立附加索引表,在索引表的每一项称为索引项,索引项的一般形式(关键字,地址)
二、算法
程序=数据结构+算法
(1)算法的定义
: 对特定问题求解步骤的一种描述,是指令的有限序列,其中每条指令表示一个或多个操作。
(2)算法的特性
1、有穷性:算法步骤有穷。得出结果的时间有穷。
2、确定性:相同的输入只能得到相同的输出。
3、可行性:描述的操作都可以通过已经实现的基本运算执行有限次来实现。
4、输入:有0个或多个输入
5、输出:有一个或多个输出
(3)"好"的算法的特性
1、正确性:算法能正确解决问题。
2、可读性:加注释,算法具有良好的可读性,帮助人们理解。
3、健壮性:输入非法数据时,算法能恰当做出反应或进行处理。
4、高效率:时间复杂度低.
5、低存储需求:空间复杂度低.
三、算法的效率
(1)时间复杂度
1、时间开销T(n)与问题规模n的关系表达式中,用数量级O(n)取阶数最高的部分。
如: T(n)=3n+1 ——> O(n)=n;
T(n)=2*n^2+1000 ——> O(n)=n^2
2、多个时间开销T(n)相加时——取最大的一个;相乘时——取乘积
3、O(1)<O(log2 n)<O(n)<O(n*log2 n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n) ——常数幂指阶
4、3种复杂度——最好情况、最坏情况、平均情况
(2)空间复杂度
1、空间 / 内存开销S(n)与问题规模n的关系:
①问题规模与空间无关时:O(1)
②问题规模与空间有关时:原理与时间复杂度类似
--函数定义时,有空间开销;
如:void fruits(int n)
{
int orrange[n][n];//声明一个二维数组
int apple[n];//声明一个一维数组
}
--空间复杂度:S(n)=O(n^2)+O(n)=O(n^2),即S(n)=O(n^2)
--函数调用时,同样有空间开销。
如:void funcation(n) //定义函数
{
if(n=1)
{
n=1;
}
else
{
n*funcation(n-1);
}
}
int main()
{
funcation(5); //函数调用
}
--空间复杂度:S(n)=O(n)