一.数据结构的定义
- 数据元素:数据的基本单位
- 数据项:具有独立含义的数据最小单位
- 数据对象:性质相同的数据元素的集合
- 数据结构:所有数据元素以及数据元素之间的关系(相邻关系or邻接关系)
- 数据结构分为逻辑结构和物理结构(存储结构)
- 数据在计算机内存中的表示是指数据的存储空间
- 数据结构被形式化定义为二元组(D,S),其中D是指有限集合的数据元素,S是指有限集合中数据元素的逻辑关系
- 逻辑结构(面向用户)可分为集合,线性结构,树形结构,图形结构
- 存储结构(面向程序员)可分为顺序存储结构(便于元素的查找,随机存取,eg.数组)、链式存储结构(便于元素的插入和删除,eg.链表)、哈希存储结构(只存储元素的数据,不存储元素的逻辑关系)、索引存储结构(查找效率高,但需建立索引表,增加空间开销)
- 逻辑结构是唯一的,但它可能对应着多种存储结构,即同一逻辑结构可以对应多种存储结构
- 数据类型:一组性质相同的值的集合和定义在此集合上的一组操作的总称
- 数据结构主要指数据的逻辑结构,与计算机的存储和处理无关
二.算法及其描述
- 算法:指令的有限序列,对特定问题求解步骤的一种描述
- 算法的特性:有穷性、确定性(相同的输入只能有相同的输出,不能有二义性)、可行性、有输入、有输出
- 程序:使用某种计算机语言对一个算法的具体实现
- 算法VS程序:算法必须满足有穷性,程序不一定满足有穷性,算法也可以直接用计算机程序来描述
- 算法设计满足条件:正确性(正确执行预想规定的功能和性能要求)、可使用性、可读性、健壮性(具有很好的容错性)、高效率和低存储量需求
- &(引用):若想要改变变量的数值或函数运行结果需要返回的需使用引用型参数,调用则无需使用
//值传递,不改变main函数中变量的值
void swap1(int x,int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
}
改进方法一:指针
void swap2(int *x,int *y)
{
int tmp;
tmp=*x; //相应地址的值发生改变
*x=*y;
*y=tmp;
}
改进方法二:引用型参数
void swap3(int &x,int &y)
{
int tmp;
tmp=x;
x=y; //使用引用型参数,x、y和main函数中的变量共享存储空间,使变量的值可以更改
y=tmp;
}
- 算法分析的目的:改进算法,提高代码执行效率
- 衡量算法时间性能:事后统计法(必须执行程序且存在很多因素掩盖了算法的本质)、事前估算法(只依赖于问题的规模)
- 频度:算法所有原操作的执行次数
int i,j,n;
for(i=0;i<n;i++) //频度为n+1
{
for(j=0;j<n;j++) //频度为n*(n+1)
{
c[i][j]=a[i][j]+b[i][j] //频度为n^2
}
}
//T(n)=n^2+n(n+1)+n+1
//时间复杂度为n^2,时间复杂度为频度一种趋势
- 常数阶:原操作执行次数与问题规模n无关
- 时间复杂度关系表:O(1)<O(log2n<O(n)<O(nlog2n)<O(n^2)<O(n^3)<O(2的n次方)<O(n!)
- 空间复杂度:对一个算法在运行过程中临时占用的存储空间大小的量度;若临时空间相对于问题规模为常数,即O(1),则称为原地工作算法或就地工作算法