前言
——数据结构,这门课程主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法的分析和评价。不少同学即将接触这样门课程,跟着我们一起带你学好数据结构!
数据结构基础
数据结构是介于数学、计算机硬件和软件之间的一门核心课程,看看他们的联系
基本概念和术语
- 数据(Data):是信息的载体,能够被计算机识别、存储和加工处理。
- 数据元素(Data Element):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
一个数据元素可由若干个数据项(Data Item)组成。数据项是数据的不可分割的最小单位。 - 数据对象(Data Object):是相同性质的数据元素的集合,是数据集合的一个子集。
- 数据结构(Data Structure):是相互之间存在一种或多种特定关系的数据元素的集合。
- 数据结构的形式定义为一个二元组: Data_Structure =(D,R)
其中,D是数据元素的有限集,R是D上关系的有限集。
数据结构包括数据的逻辑结构、数据的存储结构和数据运算3个方面。
逻辑结构
数据元素之间的相互关系称为逻辑结构,通常分为四类基本结构
- 集合 :结构中的数据元素除了同属于一种类型外,别无其它关系。
- 线性结构 :结构中的数据元素之间存在一对一的关系。
- 树型结构 :结构中的数据元素之间存在一对多的关系。
- 图状结构或网状结构 :结构中的数据元素之间存在多对多的关系。
存储结构
数据元素及逻辑关系在计算机内的表示方法称为存储结构,有一下两种基本方式
- 顺序存储结构:把逻辑上相邻的元素存储在物理位置相邻的存储单元中。顺序存储结构是一种最基本的存储表示方法。
- 链式存储结构:在每一个数据元素中增加一个存放地址的指针,用此指针来表示数据元素之间的逻辑关系。
数据的运算
数据运算是定义在数据的逻辑结构之上的,每一种逻辑结构都有一个运算的集合。
数据的运算主要有修改、插入、删除、查找、排序。
算法的五大特性
- 有穷性: 一个算法必须在执行有穷步之后结束,且每步都可在有限时间内完成。
- 确定性:算法中的每一步,必须有确切的含义,不能有二义性
- 可行性:算法中描述的每一步操作都可以通过已有的基本操作执行有限次实现
- 输入:一个算法应该有零个或多个输入
- 输出:一个算法应该有一个或多个输出
时间复杂度
- 时间复杂度是指,算法运行从开始到结束所需要的时间,通常用时间复杂度与空间复杂度来评价算法的优劣。
- 算法所需的时间 = 每条语句的执行时间之和。
每条语句的执行时间 = 语句执行次数(也称为频度)*执行一次该语句所需时间
例:求两个N阶方阵的乘积C=A*B的算法
#define N 100
void MatrixMultiply(int A[N][N],int B[N][N],int C[N][N])
{
for(i=0;i<N; i++) // n+1
for(j=0;j<N;j++) // n(n+1)
{ C[i][j]=0; // n²
for(k=0;k<N;k++) // n²(n+1)
C[i][j]=C[i][j]+A[i][k]*B[k][j]; // n³
}
}
上述算法的执行时间(即语句的频度之和)是 T(n)=2n³+3n²+2n+1;它是方阵阶数n立方的函数。
赋值语句
{++x; s=0;}
- 将x自增看成是基本操作,则语句频度为1,即时间复杂度为O(1)
- 如果将s=0也看成是基本操作,则语句频度为2,其时间复杂度仍为O(1),即常量阶。
简单循环
for(i=1;i <=n;++i)
{++x;s+=x;}
- 基本运算频度为:n 其时间复杂度为:O(n)
- 即时间复杂度为线性阶。
双重循环
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{++x;s+=x;}
基本运算频度为:n²;其时间复杂度为:O(n²),即时间复杂度为平方阶
空间复杂度
算法所需存储空间的度量,记作: S(n)=O(f(n))
其中n为问题的规模(或大小)
小结
- 掌握数据结构的基本概念
- 逻辑结构与存储结构的区别
- 抽象数据类型
- 算法和算法分析
本次数据结构课程的第一章 内容分享就到这里了,掌握好以上内容便能助你学好数据结构这一课程,后续我们还会给大家带来其他章节内容,如果在学习中遇到问题欢迎在官方qq群留言交流