数据结构概念

基本概念和术语

数据:是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。声音数据、图像数据等

两个前提:

可以输入计算机中

能被计算机程序处理


数据元素:组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也称为记录

数据项:一个数据元素可以由若干个数据项组成

比如人这样的数据元素,可以有眼,鼻,手,脚等数据项

数据项是数据不可分的最小单位


数据对象:性质相同的数据元素的集合,是数据的子集

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合


逻辑结构和物理结构

逻辑结构:指对象中数据元素之间的相互关系

1)集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。

2)线性结构:线性结构中的数据元素之间是一对一的关系。

3)树形结构:树形结构中的数据元素之间存在一种一对多层次关系

4)图形结构:图形结构的数据元素是多对多


物理结构:指数据的逻辑结构在计算机中存储形式

1)顺序存储结构

数据元素存放在地址连续的存储单元里,其数据间逻辑关系和物理关系是一致

2)链式存储结构

数据元素存放在任意的存储单元,这组单元可以是连续的,也可以是不可连续。


抽象数据类型

数据类型:指一组的性质相同的值集合及定义在此集合上一些操作的总称。

C语言中,按照取值的不同,数据类型可以分为两类:

1)原子类型:不可以分解的基本类型,包括整型、实型、字符型等

2)结构类型:若干类型组合而成,是可以再分解的


抽象是指取出事物具有的普遍性的本质

抽象数据类型(Abstract Data Type,ADT):指一个数学模型及定义在该模型上的一组操作

ADT		抽象数据类型型名
Data
		数据元素之间逻辑关系的定义
Operation
		操作1
			初始条件
			操作结果描述
		操作2
			...
endADT


算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作

算法特性

1)输入输出

算法具有零个或多个输入,至少有一个或多个输出。

2)有穷性

算法在执行有限的步骤之后,自动结束而不会出现无线循环,并且每一个步骤在可接受的时间内完成

3)确定性

算法的每一步骤都具有确定的含义,不会出现二义性

4)可行性

算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。


算法设计的要求

1)正确性 2)可读性3)健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果

4)时间效率高和存储量低


算法效率的度量方法

1)事后统计方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的运行时间进行比较,从而确定算法效率的高低

2)事前分析估算方法:在计算机编制钱,一依据统计方法对算法进行估算

算法采取的策略、方法(算法好坏的)

编译产生的代码质量(软件支持)

问题的输入规模

机器执行指令的速度(硬件性能)

抛开其它因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模


输入规模的度量

一个事实:问题规模越大,算法运行时间越长。

 将算法输入规模n为时间效率的参数。

把基本操作(最重要的操作)次数作为算法运行时间的度量单位。


在某个特定计算机上的某个算法程序的运行时间
T(n)≈c*C(n)    c为基本操作的执行时间 C(n)为基本操作次数
算法的最优、最差和平均效率


分析非递归算法效率的通用方案
1. 决定用哪个(哪些)参数作为输入规模的度量
2. 找出算法的基本操作(作为一规律,它总是位于算法的最内层循环中)。
3.检查基本操作的执行次数是否只依赖输入规模。如果它还依赖一些其他的特性(位置等),则最差效率、平均效率以及最优效率(如果必要)需要分别研究。
4.建立一个算法基本操作执行次数的求和表达式。
5.利用求和运算的标公式和法则来建立一个操作次数的闭合公式,或者至少确定它的增长次数。


例1 考虑从n个元素的列表中查找元素最大值的问题. 假设列表是用数组实现的。

MaxElement(A[0..n-1])
         //求给定数组中最大元素的值
        //输入:实数数组A[0..n-1]
        //输出:A中最大元素的值
        maxval←A[0]
        for i←1 to n-1 do
              if A[i]>maxval
                  maxval←A[i]
         return maxval

1)输入规模的度量:数组元素的个数n

2)找出算法基本操作:比较

3)检查基本操作的执行次数是否只依赖输入规模:比较次数相同

4)建立一个算法基本操作执行次数的求和表达式:

把C(n)记作比较运算的执行次数, 
由于该算法每执行一次循环就会做一次比较,并且对于循环变量i在1和n-1(包含在内)中的每个值都会做一次循环,所以,我们得到C(n)的下列求和表达式:


例2 元素惟一性问题:验证给定数组中的元素是否全部惟一。

UniqueElements(A[0..n-1])
//输入:数组A[0..n-1]
//输出:如果A中的元素全部惟一,返回“true”
//            否则,返回“false”.
 for i←0 to n-2 do
     for j←i+1 to n-1 do
         if A[i]=A[j] return false
Return true


1)输入规模的度量:数组元素的个数n

2)找出算法基本操作:比较

3)检查基本操作的执行次数是否只依赖输入规模:n?相同元素?及其位置?

最差效率:
某个数组Cworst(n)所做的比较数比其它数组都多。
有哪两种类型?
不包括相同元素
最后两个元素是唯一一对相同元素

4)建立一个算法基本操作执行次数的求和表达式:



分析递归算法效率的通用方案
1)决定用哪个(哪些)参数作为输入规模的度量。
2)找出算法的基本操作。
3)检查一下,对于相同规模的不同输入,基本操作的执行次数是否不同。如果不同,则必须对最差效率、平均效率以及最优效率作单独研究。
4)对于算法基本操作的执行次数,建立一个递推关系以及相应的初始条件。
5)解这个递推式,或者至少确定它有解的增长次数。

对于任意非负整数n,计算阶乘函数F(n)=n!的值。
       当n≥1时,F(n)=F(n-1)·n
       且0!=1
算法  F(n)
      //输入:非负整数n
      if n=0 return 1
         else return F(n-1)*n


用n本身来指出算法的输入规模
该算法的基本操作是乘法,它的执行次数记作M(n),思考应该如何构造表达式?



递推关系的一些求解方法

1 前向替代法
x(n)=2x(n-1)+1
x(1)=1  x(2)=3  x(3)=7  x(4)=15
找规律:x(n)=2n-1

2 反向替代法
M(n)=M(n-1)+1
        =M(n-2)+1+1
        =M(n-3)+1+1+1
        …
        =M(n-i)+i
        …
        =M(n-n)+n
        =M(0)+n
        =n

3 二阶常系数线性递推式
形式:ax(n)+bx(n-1)+cx(n-2)=f(n)
a,b,c是实数,a不为0
f(n)=0 齐次递推式


算法分析中的常见递推类型

减一法:
T(n)=T(n-1)+f(n)
减常因子:
T(n)=T(n/b)+f(n)
分治法:
T(n)=aT(n/b)+f(n)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值