数据结构基础

在此强调一下数据结构的重要性,它是介于数学、计算机硬件和软件三者之间的一门核心课程,程序=算法+数据结构

1-1数据结构类型:

一、逻辑结构

1)线性结构
“线性”的数据结构:一对一的线性关系,如图书数目管理系统。
特殊的:队列与栈、字符串。
推广的:数组、广义表。

2)非线性结构
“树”的数据结构:一对多的层次关系,如计算机文件系统。
“图”的数据结构:多对多的网状关系,如网络工程图和网络通信图。
其中树包括树和二叉树,图包括有向图和无向图。
3)集合结构。

二、存储结构

1)顺序存储结构:数据从低地址向高地址存,借助C中数组类型描述。
2)链式存储结构:每个结点占用两个连续的存储单元,一个存放结点信息,另一个存方后继结点的首地址,借助C中的指针类型来描述。

1-2基本概念

数据:客观事物的符号表示,如整数和实数,字符串等。
数据元素:数据的基本单位,用于完整地描述一个对象。
数据项:数据元素的组成成员。
数据对象相同性质数据元素集合

1-3数据类型和抽象数据类型

1、数据类型(Date Type)是一个值的集合和定义在这个值集上的一组操作的总称。

2、抽象数据类型(ADT),一般指由用户定义的、表示应用问题的数学模型以及定义在这个模型上的一组操作的总称,具体包括:数据对象、数据对象上的关系的集合以及对数据对象的基本操作的集合。
其定义格式如下:
ADT 抽象数据类型名
{
数据对象<数据对象的定义>
数据关系<数据关系的定义>
基本操作<基本操作的定义>
}ADT 抽象数据类型名
基本操作的定义格式:
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
基本操作的两种参数:
赋值参数:只为操作提供输入值
引用参数:以"&"打头,可提供输入值和返回操作结果。
抽象数据类型的表示与实现:
(1)预定义常量及类型:

//函数结果状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status 是函数返回值类型,其值是函数结果状态代码。
typedef int Status;

(2)数据结构的表示(存储结构)用类型定义(typederf)描述;数据元素类型约定为ElemType,由用户在使用该数据类型时自行定义。
(3)基本操作的算法都用如下格式的函数来描述:

函数类型 函数名(函数参数表)
{
	//算法说明
	语句序列
}//函数名
	

当函数返回值为函数结果状态代码时,函数定义为Status类型。
(4)内存的动态分配与释放:
使用new和delete动态分配和释放内存空间:
分配空间 指针变量=new数据类型
释放空间 delete指针变量
(5)赋值语句:
串联赋值: 变量名1 = 变量名2 = … =变量名n = 表达式。
成组赋值:(变量名1,…变量名n) = (表达式1,… ,表达式n)
结构赋值:结构名1 = 结构名2;
结构名 = (值1,值2, … ,值n)
条件赋值: 变量名 = 条件表达式?表达式T:表达式F
交换赋值:变量名1<–>变量名2

1-4算法和算法分析:

一、算法的定义:为了解决某类问题而规定的一个有限长的操作序列。

二、算法的特性:有穷性、确定性、可行性、输入、输出。

三、评价算法优劣的基本标准:正确性、可读性、健壮性、高效性。

四、

算法的时间复杂度:

1、影响算法时间代价的最主要因素是问题规模(算法求解问题输入量的多少),一般用n表示,n越大,算法执行时间越长。

2、语句执行时间大致 = 重复执行次数(语句频度)和执行一次所需时间(分析时按单位时间)的乘积。

3、算法的时间复杂度的定义:

1)对于简单算法:直接计算所有语句频度之和。

2)对于复杂算法:只用“基本语句”(重复执行次数和算法的执行时间成正比的语句,它对算法的运行时间贡献最大)的执行次数来度量算法的工作量。

一个简单算法例子:求两个矩阵的乘积算法:

for(i=1;i<n;i++)      //频度为 n+1 
 for(j=1;j<n;j++)     //频度为 n*(n+1)
 {   
  c[i][j]=0;          //频度为 n^2 
  for(k=1;k<=n;k++)   //频度为 n^2*(n+1) 
  c[i][j]=c[i][j]+a[i][k]*b[k][i];//频度为 n^3 
 } 

其中所有语句频度之和是矩阵阶数n的函数,用f(n)表示

f(n)/n^3=C,即f(n)与n的三次方是同阶的,或者说数量级相同,数量级用“O"表示

算法的时间量度 T(n)=O(f(n)),算法执行时间的增长率与f(n)增长率相同。

4、分析算法时间复杂的基本方法:
找出语句频度最大的那条作为基本语句,计算其频度得到问题规模n的函数f(n)

5、非递归算法的时间复杂度分析举例:
1)常量阶:T(n)=O(1)
2) 线性阶:T(n)=O(n),线性对数阶:T(n)=O(n*log2(n));
3) 多项式阶:T(n)=O(n^k).
如平方阶:T(n)=O(n^2)
立方阶:T(n)=O(n^3)
4)对数阶:T(n)=O(log2(n))
5)指数阶:T(n)=O(2^n)
一般的,随n的增大,T(n)增长慢的算法为较优算法,显然指数阶效率极低,尽量选择多项式阶的算法。

当有若干循环时,算法的时间复杂度由最深层循环内的基本语句的频度f(n)决定

五、算法的空间复杂度:
1、定义:作为算法所需储存空间的量度。
S(n)=O(f(n));
注:一般情况下,鉴于运算空间较为充足,所以将算法的时间复杂度作为分析的重点。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值