数据结构与算法

数据结构与算法

数据与数据之间的结构主要有三种:线性结构、树结构、图结构,这三个也是数据结构的基本结构
1、 线性结构:结构中的数据元素之间存在着一对一的线性关系。除第一个和最后一个数据元素外,每个数据元素只有一个前驱和一个后继数据元素
2、 树结构:结构中的数据元素之间存在着一对多的层次关系。除根节点外,每个数据元素只有一个前驱数据元素,可有0个或若干个后继数据元素
3、 图结构:结构中的数据元素之间存在着多对多的任意关系。每个数据元素可有0个或若干个前驱数据元素和0个或若干个后继数据元素
运算集合(基本算法):讨论数据结构的目的是为了在计算机中实现所需的操作施加于数据源数字上的一种操作,构成了数据的运算集合,所以运算集合是数据结构很重要的组成部分,
算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
(一)算法的概念和特性
算法是对特定问题求解步骤的一种描述,它是指令的有限序列。做任何事情都必须事先想好进行的步骤,然后按部就班地进行,才不会发生错误,计算机解决问题也是如此。对于一些常用的算法应该熟记,比如求阶乘、求素数、求是否闰年等算法,在解决实际问题时,可参考已有的类似算法,按照业务逻辑设计出符合自己的算法。
一个算法应该具有以下五个重要特性。
⑴ 有穷性
一个算法应包含有限个操作步骤。即一个算法在执行若干个步骤之后应该能够结束,而且每一步都在有限时间内完成。
⑵ 确定性
算法中的每一步都必须有确切的含义,不能产生二义性。
⑶ 可行性
算法中的每一个步骤都应该是能有效地执行,并得到确定的结果。
⑷ 输入
所谓输入,是指在算法执行时,从外界取得必要的数据。计算机运行程序的目的是为了进行数据处理,在大多数情况下,这些数据需要通过输入得到。有些情况下,数据已经包含在算法中,算法执行时不需要任何数据,所以一个算法可以有零个或多个输入。
⑸ 输出
一个算法有一个或多个输出,这是算法进行数据处理后的结果。没有输出的算法是毫无意义的。
算法的这些特性可以约束程序设计人员正确地书写算法,并使之能够正确无误地执行,达到求解问题的预期效果。
(二)算法设计的要求
算法设计的好坏关乎程序的执行效率,算法的设计必须满足下列四个要求。
⑴ 正确性
正确性的含义是算法对于一切合法的输入数据都能够得出满足要求的结果,事实上要验证算法的正确性是极为困难的,因为通常情况下合法的输入数据量太大,用穷举法逐一验证是不现实的。所谓的算法正确性是指算法达到了测试要求。
⑵ 可读性
算法的可读性是指人对算法阅读理解的难易程度,可读性高的算法便于交流,有利于算法的调试和修改。通常增加算法的可读性是在书写算法时采用按缩进格式书写、分模块书写等方法可增加算法的可读性。
⑶ 健壮性
对于非法的输入数据,算法能给出相应的响应,而不是产生不可预料的后果。
⑷ 效率与低存储量需求
效率指的是算法的执行时间。对于解决同一问题的多个算法,执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间。存储量需求越小的算法效率越高。
(三)算法的分析
解决一个问题可以有多种算法,那么该怎样判断它们的优劣呢?判断算法优劣的标准很多,这里不做深入讨论,但一个算法除了正确性必须保证外,一个主要指标是它的效率。
⑴ 算法效率的度量
算法执行的时间是其对应的程序在计算机上运行所消耗的时间。程序在计算机上运行所需时间与下列因素有关:
① 算法本身选用的策略;
② 书写程序的语言;
③ 编译产生的代码质量;
④ 机器执行指令的速度;
⑤ 问题的规模。
第①条是算法好坏的根本,第②③条要看具体的软件支持,第④条要看硬件的性能。度量一个算法的效率应抛开具体机器的软、硬件环境,而书写程序的语言、编译产生的机器代码质量、机器执行指令的速度都属于软硬件环境。所以抛开计算机软硬件相关的因素,一个程序的运行时间,仅依赖于算法的好坏和问题的规模。
对于一个特定算法只考虑算法本身的效率,而算法自身的执行效率是问题规模的函数。对于同一个问题,选用不同的策略就对应不同的算法,不同的算法对应有各自的问题规模函数,根据这些函数就可以比较算法的优劣。算法的效率包括时间与空间两个方面,分别称为时间复杂度和空间复杂度。
⑵ 算法的时间复杂度
一个算法的执行时间大致上等于其所有语句执行时间的总和,对于语句的执行时间是指该条语句的执行次数和执行一次所需时间的乘积。语句执行一次实际所需的具体时间是与机器的速度、编译程序质量、输入数据等密切相关,与算法设计的好坏无关。所以,可用算法中语句的执行次数来度量一个算法的效率。
首先定义算法中一条语句的语句频度,语句频度是指语句在一个算法中重复执行的次数。以下给出了两个n×n阶矩阵相乘算法中的各条语句以及每条语句的语句频度。
语句 语句频度
for(i=0;i< n;i++) n+1
for (j=0;j<n;j++) n2+n
{
c[i][j]=0; n2
for (k=0;k< n; k++) n3+n2
c[i][j]=c[i][j]+a[i][k]*b[k][j]; n3
}
算法中所有语句的总执行次数为Tn=2n3+3n2+2n+1, 即语句总的执行次数是问题的规模n的函数f(n)(Tn= f(n))。进一步地简化,可用Tn表达式中n的最高次幂来度量算法执行时间的数量级,即算法的时间复杂度,记做:
T(n)=O(f(n))
上式是Tn= f(n)中忽略其系数的n的最高幂次项,它表示随问题规模n的增大算法的执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。如上算法的时间复杂度T(n)=O(n3)。
算法中所有语句的总执行次数Tn是问题规模n的函数,即Tn= f(n),其中 n的最高次幂项与算法中称作原操作的语句的语句频度对应,原操作是算法中实现基本运算的操作,在上面的算法中的原操作是c[i][j]=c[i][j]+a[i][k]*b[k][j]。一般情况下原操作由最深层循环内的语句实现。
T(n)随n的增大而增大,增长得越慢,其算法的时间复杂度越低。下列三个程序段中分别给出了原操作count++的三个不同数量级的时间复杂度。
① count++ ;
其时间复杂度为O(1),称之为常量阶时间复杂度。
② for (i=1; i<= n; i++)
count++;
其时间复杂度为O(n),是线性阶时间复杂度。
③ for (i=1; i<= n; i++)
for(j=1;j<= n; j++)
count++;
其时间复杂度为O(n2),平方阶时间复杂度。
此外,算法能呈现的时间复杂度还有:对数阶O(log2n),指数阶O(2n)等。
(3)算法的空间复杂度
采用空间复杂度作为算法所需存储空间的量度,记作:
S(n)=O(f (n))
其中n为问题的规模。
程序执行时,除了需存储本身所用的指令,常数,变量和输入数据以外,还需要一些对数据进行操作的辅助存储空间。
其中对于输入数据所占的具体存储量只取决于问题本身,与算法无关,这样只需要分析该算法在实现时所需要的辅助空间单元数就可以了。
算法的执行时间和存储空间的耗费是一对矛盾体,即算法执行的高效通常是以增加存储空间为代价的,反之亦然。不过,就一般情况而言,常常以算法执行时间做为算法优劣的主要衡量指标。
以上部分内容源于老师所发文档

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值