*逻辑结构类型
1、集合关系
特点:
就是元素与元素之间任何的除了在一个集合内的关系以外,别无其他逻辑关系,是最松散的,不受任何制约的关系。
2、线性关系
特点:
一对一,除了开始元素和终端元素以外,每一个元素都有且只有一个开始元素与终端元素,并且各各 元素的开始元素和终端元素都不相同。
3、树形结构
特点:
一对多,开始元素唯一,终端元素不唯一。除终端元素以外,每个元素有一个或多个后继元素;除开始元素外,每个元素有且仅有一个前趋元素。
4、图形结构
特点:
多对多,所有元素都可能有多个前趋元素和多个后继元素。
*存储结构类型
1、顺序存储结构
2、链式存储结构
3、索引存储结构
4、哈希(散列)存储结构
*数据类型和抽象数据类型
1、数据类型
数据类型:是一个值的集合和定义再次集合上的一组操作的总称。
例如:在C/C++中int就是整型数据类型。值的集合是-32768 ~ 32767。一组操作是+、-、*、/等操作。
2、抽象数据类型
抽象数据类型:指的是从求解问题的数学模型中抽象出来的数据结构和运算(抽象运算),而不考虑计算机的具体实现。
抽象数据类型 (ADT)= 逻辑结构 + 抽象运算
*数据结构解决问题的一般步骤
*算法描述及分析
数据元素的关系有逻辑关系和物理关系,之间的运算有基于逻辑结构的运算描述和基于存储结构的运算实现。
算法:基于存储结构的运算实现的这一部分。
算法分析基础
算法的占用资源分为:CPU时间和内存空间两个部分。(可以理解为时间性能分析和空间性能分析)。
算法分析目的:分析算法的时空效率以便改进算法性能。
算法的时间复杂度分析
一个算法是由控制结构和原操作构成的。算法执行时间取决于两者的综合效果。
算法分析方式:
1、事后分析统计方法:编写算法对应程序,统计其执行时间。(由于各种因素,例如IDE的不同,语言不同等因素,不能用绝对执行时间进行比较。)
2、事前估算分析方法:撇开各种因素,认为算法的执行时间是问题规模n的函数。
分析算法的执行时间:
1、求出算法所有原操作的执行次数(频度),它是问题规模n的函数,用T(n)表示。
2、算法执行大致时间 = 原操作所需的时间 X T(n)。所以T(n)与算法执行的时间成正比,所以用T(n)来表示算法的执行时间。
3、比较不同算法的T(n)大小得出算法执行时间的好坏。
例子:
#define MAX 20 //定义最大的方阶
void matrixadd(int n,int A[MAX][MAX],int B[MAX][MAX],int C[MAX][MAX])
{int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
C[i][j]=A[i][j]+B[i][j];
}
}
}
求上面这段算法的执行时间。
解:首先第一个for循环它的循环体执行n次,但它实际上的频度是(n+1)次(由于最后一次的判断不符合进入循环条件也算一次)。
第二个for循环它的频度是n(n+1),
最里面的那以步骤执行的频次是n^2
所有的频度之和T(n)=2n^(2)+2n+1
算法的执行时间用时间复杂度来表示
算法中执行时间T(n)是问题规模n的某个函数 f (n),
记作:T(n) = O(f(n))
记号O用来表示随问题规模n的增大算法执行时间的增长率和f(n)的增长率相同。也就是趋势分析。
O的形式定义为 T(n) = O(f(n)) 表示存在一个正的常熟M,使得当n >= n0 时都满足:
I T(n) I <= M If(n)I
f(n)是T(n)的上界,由于上界有很多的可能,通常取最接近的上界,即紧凑上界
可以写成:当n->∞ 时,lim T(n) / f(n) =M
总之如果你看不懂的话呢,就记住求出T(n)的最高阶,忽略其低阶和常系数,就行了。
例如 T(n) = 2n^2 + 2n +1 = O(n^2)
一般地:
1、一个没有循环的算法的执行时间与问题规模n无关,记作O(1),也称作常数阶。
2、一个只有一重循环的算法的执行时间与问题规模n的增长呈线性增大关系,记作O(n),也称作线性阶。
3、其余常用的算法时间复杂度还有平方阶O(n^2)、立方阶、对数阶、指数阶等。
各种不同算法时间复杂度的关系如下:
简化的算法时间复杂度分析
算法中的基本操作一般时最深层的循环内的原操作。
算法执行大致时间 = 基本操作所需时间 X 其运算次数。
所以,通过转化可以在算法分析时,计算T(n)时仅仅考虑基本操作的运算次数。
例如:
count = 0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
它的时间复杂度为多少?
解:
由于第一个for循环它是指数型的递增,所以你要求它做了几次,用对数就可了,所以是log2n,
内部的for运行了n次,通过分步乘法你应该知道了它的时间复杂度是O(nlog2n)。
算法空间复杂度分析
空间复杂度:用于量度一个算法在运行过程中临时占用的存储空间大小。
一般也作为问题规模n的函数,采用数量级形式描述,记作:S(n) = O(n)。
若一个算法的空间复杂度为O(1),则称此算法为原地工作或就地工作算法。