数据结构(二)

*逻辑结构类型

1、集合关系

特点:
就是元素与元素之间任何的除了在一个集合内的关系以外,别无其他逻辑关系,是最松散的,不受任何制约的关系。

2、线性关系

特点:
一对一,除了开始元素和终端元素以外,每一个元素都有且只有一个开始元素与终端元素,并且各各 元素的开始元素和终端元素都不相同。

3、树形结构

特点:
一对多,开始元素唯一,终端元素不唯一。除终端元素以外,每个元素有一个或多个后继元素;除开始元素外,每个元素有且仅有一个前趋元素。

4、图形结构

特点:
多对多,所有元素都可能有多个前趋元素和多个后继元素。

*存储结构类型

1、顺序存储结构
2、链式存储结构
3、索引存储结构
4、哈希(散列)存储结构

*数据类型和抽象数据类型

1、数据类型
数据类型:是一个值的集合和定义再次集合上的一组操作的总称。

例如:在C/C++中int就是整型数据类型。值的集合是-32768 ~ 32767。一组操作是+、-、*、/等操作。

2、抽象数据类型

抽象数据类型:指的是从求解问题的数学模型中抽象出来的数据结构和运算(抽象运算),而不考虑计算机的具体实现。

抽象数据类型 (ADT)= 逻辑结构 + 抽象运算

*数据结构解决问题的一般步骤

来自武汉大学李葆春老师的PPT

*算法描述及分析

数据元素的关系有逻辑关系和物理关系,之间的运算有基于逻辑结构的运算描述和基于存储结构的运算实现。

算法:基于存储结构的运算实现的这一部分。

算法分析基础
算法的占用资源分为: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)、立方阶、对数阶、指数阶等。

各种不同算法时间复杂度的关系如下:
来自武汉大学李葆春老师的PPT
简化的算法时间复杂度分析
算法中的基本操作一般时最深层的循环内的原操作。
算法执行大致时间 = 基本操作所需时间 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),则称此算法为原地工作或就地工作算法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值