数据结构 抽象数据类型的表示与实现

抽象数据类型的表示与实现

抽象数据类型如何实现

**抽象数据类型可以通过固有的数据类型(如整型等)来表示和实现。**即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作

类C语言精选了C语言的一个核心子集,同时做了若干扩充修改,增强了语言的描述功能, 以下是简要说明。
数据结构++C语言版++第2版_09

数据结构++C语言版++第2版_10

例:抽象数据类型“复数“的实现

抽象数据类型“复数“的实现

算法和算法分析

算法 (Algorithm)

定义

对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。

简而言之,算法就是解决问题的方法和步骤

描述

·自然语言:英语、中文

·流程图:传统流程图、NS流程图

·伪代码、类语言:类C语言

·程序代码:C语言程序、JAVA语言程序

算法与程序

算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
程序是用某种程序设计语言对算法的具体实现。

程序=数据结构+算法
·数据结构通过算法实现操作
·算法根据数据结构设计程序

特性

一个算法必须具有以下五个特性:

有穷性

一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。

确定性

对千每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。

可行性

算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。

输入

一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。

输出

一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。

算法设计的要求

正确性(Correctness)

在合理的数据输入下,能够在有限的运行时间内得到正确的结果。

算法转化为程序后要注意:

1、程序中不含语法错误;

2、程序对于几组输入数据能够得出满足要求的结果;

3、程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;

4、程序对于—切合法的输入数据都能得出满足要求的结果。

通常以第三层意义上的正确性作为衡量一个算法是否合格的标准

可读性(Readability)

一个好的算法,首先应便千人们理解和相互交流 , 其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法易千隐藏错误,且难千调试和修改。

健壮性(Robustness)

当输入非法数据时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。

处理出错的方法,不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理

高效性(Efficiency)

高效性包括时间空间两个方面。

时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标。

要求花费尽量少的时间和尽量低的存储需求

算法分析

目的

算法分析的目的是看算法实际是否可行,并且在同一问题存在多的算法时可进行性能上的比较,以便从中挑选出比较优的算法。

·一个好的算法首先要具备正确性,然后是健壮性、可读性,在几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来评判不同算法的优劣程度。

算法效率

主要从以下两个方面考虑:

1、时间效率:指的是算法所消耗的时间

2、空间效率:指的是算法执行过程中所消耗的存储空间

时间效率和空间效率有时候是矛盾的
算法时间效率的度量

算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。

两种度量方法
事后统计

将算法实现,测算其时间和空间开销。

缺点:编写程序实现算法将花费较多的时间和精力;所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣

事前分析

对算法所消耗资源的一种估算。

·一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需的时间与算法中进行的简单操作次数乘积。

算法运行时间 = 一个简单操作所需的时间 × 简单操作次数

即,算法中每条语句的执行时间之和

算法运行时间 = ∑每条语句的执行次数 × 该语句执行一次所需的时间
= ∑每条语句频度 × 该语句执行一次所需的时间

每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能速度以及编译的代码质量。是由机器本身软硬件环境决定的,它与算法无关。

所以,我们可假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了

这就可以独立于不同机器的软硬件环境来分析算法的时间性能了。

例如:求两个n×n阶矩阵的乘积算法。

for(i=l;i<=n;i++)                          //n+1次
  for (j=l; j<=n; j++)                    //n(n+1)次
    { 
      c[i][j] = 0 ;                       //n*n次
      for(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)为:
T ( n ) = 2 n 3 + 3 n 2 + 2 n + 1 T(n)=2n^3+3n^2+2n+1 T(n)=2n3+3n2+2n+1

算法时间复杂度的渐进表示法

为了便于比较不同算法的时间效率,我们仅比较它们的数量级(越大越不好)
若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(О是数量级的符号),简称时间复杂度

对于求解矩阵相乘问题,算法消耗时间:
T ( n ) = 2 n 3 + 3 n 2 + 2 n + 1 T(n)=2n^3+3n^2+2n+1 T(n)=2n3+3n2+2n+1

n → ∞ 时 , T ( n ) / n 3 → 2 , 这 表 示 n 充 分 大 时 , T ( m ) 与 n 2 是 同 阶 或 同 数 量 级 n →∞时,T(n)/n^3 →2,这表示n充分大时,T(m)与n2是同阶或同数量级 nT(n)/n32,nT(m)n2

引入大“O”记号,则T(n)可记作:
T ( n ) = O ( n 3 ) T(n)=O(n^3) T(n)=O(n3)
这就是求解矩阵相乘问题的算法的渐进时间复杂度

一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示。

算法时间复杂度定义

算法中基本语句重复执行的次数问题规模n的某个函数f(n),算法的时间量度记作:
T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐近时间复杂度

渐近时间复杂度
ps:

1、数学符号"O" 的严格定义为:若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)= O(f(n))表示存在正的常数C和n0, 使得当n≥n0时都满足0≤T(n)≤Cf(n)。

2、基本语句是算法中重复执行次数和算法的执行时间成正比的语句,对算法运行时间的贡献最大、执行次数最多。

3、问题规模:n越大算法的执行时间越长(n结合实际情况讨论)

排序:n为记录数
矩阵:n为矩阵的阶数
多项式:n为多项式的项数
集合:n为元素个数
树: n为树的结点个数
图: n为图的顶点数或边数
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值