以下内容来源于《数据结构》一书,由笔者阅读整理而成,如有描述不当的地方,还望各位博友指出。
编写解决实际问题的程序的一般过程:
(1)、如何用数据形式描述问题,即由问题抽象出一个适当的数学模型;
(2)、问题所涉及的数据量大小及数据之间的关系;
(3)、如何在计算机中存储数据结构及体现数据之间的关系;
(4)、处理问题时所需要对数据作何种运算;
(5)、所编写的程序性能是否良好。
一、数据结构及其概念
1、基本概念
数据:客观事物的表示符号。在计算机科学中指的是所有输入到计算机中,并被计算机程序处理的符号的总称;
数据元素:数据的基本单位。在程序中通常作为一个整体来进行考虑和处理;
数据项:数据的最小单位,是对客观事物某一方面特性的数据描述。一个数据元素可由若干个数据项组成;
数据对象:是性质形同的数据元素的集合,是数据的一个子集;
数据结构:相互之间具有一定联系的数据元素的集合。元素之间的相互联系称为逻辑结构。
数据元素之间的逻辑结构有四种基本类型:
(1)、集合:同属于一个集合,无其他关系;
(2)、线性结构:一对一的关系;
(3)、树型结构:一对多的关系;
(4)、图状或网状结构:多对多的关系。
数据结构的形式定义:
Data-Structure=(D,S)
其中,D是数据元素的有限集,S是D上关系的有限集。
2、数据结构的存储方式
顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构。
链式存储结构:在每一个数据元素中增加一个存放另一个数据元素地址的指针,用该指针来表示数据元素之间的逻辑结构。
数据的逻辑结构和无力结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
在C语言中,用一维数组表示顺序存储结构,用结构体类型表示链式存储结构。
3、数据结构的运算
(1)、建立(Create)一个数据结构
(2)、消除(Destroy)一个数据机构
(3)、从一个数据结构中删除(Delete)一个数据元素
(4)、把一个数据元素插入(Insert)到一个数据结构中
(5)、对一个数据结构进行访问(Access)
(6)、对一个数据结构中的数据元素进行修改(Modify)
(7)、对一个数据结构进行排序(Sort)
(8)、对一个数据结构进行查找(Search)
二、算法分析初步
1、算法定义
算法是对特定问题求解方法的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
2、算法的特性
(1)、有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷的时间内完成;
(2)、确定性:算法中的每一个指令必须有确切的含义。不存在二义性,且算法只有一个入口和出口;
(3)、可行性:一个算法是能行的。即算法描述的操作可以通过已实现的基本运算执行有限次来实现;
(4)、输入:一个算法有零个或多个输入;
(5)、输出:一个算法有一个或多个输出。
3、算法设计的要求
(1)、正确性:算法应满足具体需求;
(2)、可读性:算法应容易供人阅读和交流。可读性好的算法有助于对算法的理解和修改;
(3)、健壮性:算法应具有容错处理;
(4)、通用性:算法的处理结果对一般的数据集合都成立;
(5)、效率与存储量需求:效率指的是算法执行的时间,存储量指的是算法执行过程中所需要的最大存储空间。
4、算法的时间复杂度
算法中,基本操作重复执行的次数时问题规模n的某个函数,其时间量度记作T(n)=O(f(n)),称作时间复杂度。通常,用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。
表示时间复杂度的阶有:
O(1) 常量时间阶
O(n) 线性时间阶
O(log n) 对数时间阶
O(n^k) K次方时间阶
例1:
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
c[i][j]=0;
for(k=1;k<=n;k++){
c[i][j] = a[i][k]*b[k][j];
}
}
}
//三重循环,每个循环从1到n,总次数为n*n*n = n^3
//因此,时间复杂度为T(n)=O(n^3)
例2:
{++x;s=0}
//语句频度为1
//因此,时间复杂度为O(1)
例3:
for(i=0;i<=n;i++){
++x;
s+=x;
}
//语句频度2n
//因此,时间复杂度为O(n)
例4:
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
++x;
s+=x;
}
}
//语句频度2n^2
//因此,时间复杂度为O(n^2)
一个时间复杂度为O(1)的算法,它的基本运算执行的次数时固定的,因此,总的时间由一个常数来界定。而一个算法复杂度为O(n^2)的算法,则由一个二次多项式来界定。
5、算法的空间复杂度
空间复杂度指算法编写成程序后,在计算机中运行时所需存储空间大小的度量。记作:S(n)=O(f(n)),其中,n是问题规模。
该存储空间一般包含三个方面:
(1)、指令常数变量所占用的存储空间;
(2)、输入数据所占用的存储空间;
(3)、辅助存储空间。
一般,算法的空间复杂度指的是辅助空间。
(1)、一维数组a[n]:空间复杂度O(n)
(2)、二维数组a[n][m]:空间复杂度O(n*m)