• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ZzLOVECs
博客园    首页    新随笔    联系   管理    订阅  订阅

数据结构-第一章-绪论

目录
  • 1-1 内容简介
  • 1-2 基本概念和术语
  • 1-3 算法和算法分析
    • 时间复杂度分析
    • 空间复杂度分析

程序 = 数据结构 + 算法
——题记

1-1 内容简介

flowchart LR A[基本内容] --> B[数据结构的基本概念] A --> C[基本数据结构] A --> D[基本数据处理技术] C --> C1[线性] C --> C2[非线性] C1 --> c1[线性表] C1 --> c2[栈和队列] C1 --> c3[串] C1 --> c4[数组和广义表] C2 --> c5[树] C2 --> c6[图] D -->d1[查找] D --> d2[排序]

1-2 基本概念和术语

数据:能被输入计算机并被计算机处理的各种符号的集合。
数据元素:数据的基本单位,通常作为一个整体处理。(集合的个体)
数据对象:性质相同的数据元素的集合。(集合的子集)
数据项:数据的最小单位。
数据结构:数据元素之间的关系。
逻辑结构:数据元素之间的逻辑关系。
存储结构:数据元素及其关系在计算机存储器中的结构。

逻辑结构:集合、线性结构、树状结构、网结构。
存储结构:顺序存储、非顺序(链接)存储。

数据类型= 值的集合 + 值集合上的一组操作
抽象数据类型 = 数学模型 + 模型上的一组操作(对数据结构逻辑上的定义),可用(D,S,P)三元组,即(对象,关系,操作)进行形式定义。

基本操作定义格式说明:
1.参数表:
赋值参数:只提供输入值
引用参数:以&打头,可提供输入值,且返回操作结果
2.初始条件:if(...) return ERROR;
3.操作结果: return OK;

用C语言实现抽象数据类型的定义:

typedef struct{ //复数
	float real;
	float imag;
}Complex;
void assign(Conplex *a,float real,float imag);
void add(...) //略

1-3 算法和算法分析

算法:指令的有限序列。
特性:
1.有穷性:有穷步、有穷时间内完成
2.确定性:任何条件下只有唯一一条执行路径
3.可行性:算法描述的操作可以通过已实现的基本操作执行有限次实现
4. 0个或多个输入;1个或多个输出
正确(结果)、可读(人)、健壮(非法OUT)、高效(时、空)

时间复杂度分析

算法运行时间
= 一种简单操作所需时间 * 操作次数
= ∑ 每条语句频度(执行次数) * 执行一次所需时间

由于每条语句执行一次所需要的时间与算法无关,可假设执行每条语句所需要的时间均为单位时间
从而只需要分析算法频度之和,举例如下:

//计算两个n*n矩阵相乘
for(int i = 1; i <= n; i++) // n+1次
	for(int j = 1; j <= n; j++){ // n(n+1)次
		c[i][j] = 0; // n*n次
		for(int k = 0; k < n; k++) // n*n*(n+1)次
			c[i][j] = c[i][j] + a[i][k] * b[k][j]; // n*n*n次
	}

则算法时间消耗T(n) = 2n3 + 3n2 + 2n + 1,显然这是一个关于n的函数。为了方便比较不同算法的时间效率,可以仅比较数量级。

引入辅助函数f(n),如果T(n)与f(n)是同阶函数(即n趋于无穷大时,T(n)/f(n)极限为常数c(≠0)),记作T(n) = O(f(n))。称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
定义:算法中基本语句重复执行次数是问题规模n的某个函数f(n),算法的时间量度为T(n) = O(f(n))

从而对于上例中的算法,时间复杂度为O(n3)。

基本语句:
1.重复执行次数与算法执行时间成正比
2.对算法运行时间“贡献”最大
3.执行次数最多
问题规模:具体问题具体分析。例如树中n为结点个数,图中n为顶点数或边数。

下面是一个简化计算小窍门:

定理1:若f(n) = amnm+......+a1n+a0是m次多项式,则T(n) = O(nm)(am≠0)

分析时间复杂度的基本方法:

  1. 找出语句频度最大的语句
  2. 计算基本语句的频度得到f(n)
  3. 取其数量级

下面是一个稍复杂的例子:

i=1;  
while(i<=n)
	i*=2; //语句1

关键是找出执行次数x与n的关系,并表示成n的函数
设语句1执行x次,则由循环条件有 2x <= n,即 x <= log2 n
故取f(n)= log2 n

常见的时间复杂度关系:
O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < O(2n) < O(n!)

值得指出的是,有的情况下,算法中基本操作重复执行次数会随输入数据集不同而不同,故算法时间复杂度可细分为最坏、平均、最好时间复杂度。一般考虑最坏时间复杂度,以保证算法实际运行时间不会比它更长。

对于复杂的算法,可以将它拆分为几个容易估算的部分,然后利用大O运算法则计算时间复杂度:

加法规则:T(n) = T1(n) + T2(n) = O (max(f1(n),f2(n)))
乘法规则:T(n) = T1(n)*T2(n) = O (f1(n)*f2(n))

空间复杂度分析

空间复杂度:S(n) = O(f(n))
算法占据的空间 = 算法本身占据的空间(输入输出、指令、常数、变量...)+所需要的辅助空间(main)

posted on 2026-06-18 21:44  ZzLOVECs  阅读(7)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3