1 前言

上节我们介绍了数据结构的基本概念,这次我们来介绍一下算法,数据结构和算法也是类似的关系。好的算法能大大提高一个程序的运行效率,例如:高斯算法求1,2,3...n个连续数的和,高斯给了我们n*(n+1)/2的公式,比起一个个加起来效率高的多,可见好的算法不仅对于现实世界,对于程序世界也是极好的~

2 详述

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

2.1 算法的特性

·输入输出:具有零个或者多个输入,一个或者多个输出;

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

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

·可行性:算法的每一步都是可行的,每一步都能执行有限次数完成。

2.2 算法设计的要求

·正确性:算法应该至少具有输入,输出和加工处理无歧义性,能正确的反应问题的需求,能够得到问题的正确答案;

·可读性:便于阅读,理解和交流;

·健壮性:当输入不合法时候,算法也能做出相关的处理,而不是产生异常或者莫名其妙的结果;

·时间效率高和存储量低:算法设计应该尽量满足时间效率高和存储量低的需求。

2.3 算法效率的度量方法

2.3.1 事后统计方法

这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同的算法编制的程序进行时间比较,从而确定算法效率的高低。

缺陷:

·必须实现编制好程序,需要花费大量时间和精力;

·时间的比较依赖计算机硬件和软件等环境因素;

·算法测试数据设计困难,有时候需要大规模的测试数据。

所以我们一般不考虑这种统计方法

2.3.2 事前分析估算方法

在计算机程序编制前,依据统计方法对算法进行估算。

一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓的问题输入规模是指输入量的多少。

在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或者一系列的步骤。

2.4 函数的渐近增长

给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐近快要g(n)。

对于最高次项的指数大的,函数增长随着n的增长,结果也会变得增长特别快。

从上图看出来:判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应关注主项(最高阶项)的阶数。

2.5 时间复杂度

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:T(n)  = O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

这样用大写O()来体现算法时间复杂度的记法,成为大O记法。

一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

2.6 推导大O阶方法

2.6.1 常数阶

这个算法函数是f(n)=3,根据推导公式把3改为1,则为:O(1),成为常数阶。

2.6.2 线性阶

分析算法的复杂度,关键就是分析循环结构的运行情况。

int i;

for(i = 0;i < n;i++){

/*时间复杂度为O(1)的程序步骤序列*/

}

上面的代码时间复杂度为O(n)。因为循环体中的代码要执行n次。

2.6.3 对数阶

由于每次count乘以2之后,就距离n更近了一分。也就是说有多少个2相乘后大于n,则会退出循环。由2的x次方等于n,得到。所以这个循环的时间复杂度为O(logn)。

2.6.4 平方阶

外层循环复杂度为O(n),内部又循环了n次。所以这段代码的时间复杂度为。

2.7 常见的时间复杂度

时间复杂度的大小顺序依次为:

2.8 最坏情况与平局情况

最坏情况运行时间是一种保证,那就是运行时间不能再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

平均运行时间是所有情况中最优意义的,因为它是期望的平均时间。

2.9 算法空间复杂度

算法空间复杂度通过计算算法所需要的存储空间实现,算法空间复杂度计算公式记作:S(n) = O(f(n)),其中,n为问题规模,f(n)为语句关于n所占存储空间的函数。

若算法执行所需的辅助空间对于输入和输出量而言是一个常数,则称此算法为原地工作。空间复杂度为O(1)。

通常我们所说的复杂度指的都是时间复杂度。

3 结语

    以上是所有内容,希望对大家有所帮助。

转载于:https://www.cnblogs.com/melons/p/5791764.html

数据结构之算法初涉(2)相关推荐

  1. Python3-Cookbook总结 - 第一章:数据结构和算法

    第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. ...

  2. 推荐一个关于.NET平台数据结构和算法的好项目

    http://www.codeplex.com/NGenerics 这是一个类库,它提供了标准的.NET框架没有实现的通用的数据结构和算法.值得大家研究. 转载于:https://www.cnblog ...

  3. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  4. weiss数据结构和算法书的使用说明

    <数据结构与算法分析 C语言描述>Mark Allen Weiss著,冯舜玺译,机械工业出版社.Weiss教授的经典教材三部曲之一,其中的C语言描述版本,也就是本书,被称为20世纪最重要的 ...

  5. 数据结构和算法 -- 学习导图

    数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步 ...

  6. Java数据结构与算法(第四章栈和队列)

    2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...

  7. python数据结构与算法总结

    python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...

  8. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  9. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

最新文章

  1. 【集合论】容斥原理 ( 复杂示例 )
  2. c语言中%hu,%hx是什么意思
  3. elasticsearch手动创建和删除索引
  4. 私有属性和方法-子类对象不能直接访问
  5. 切面是异步还是同步操作‘_【 .NET Core 3.0 】框架之十 || AOP 切面思想
  6. Vue.js分页组件实现:diVuePagination
  7. 如何在Eclipse自带的嵌入式Maven和外部安装的Maven之间切换
  8. mysql创建新表失败_麻烦给我看一下为什么MySQL创建表格失败嘛
  9. Thinkphp 3.2中控制页面不缓存
  10. C++string类常用函数 c++中的string常用函数用法总结
  11. spring boot 1.4默认使用 hibernate validator
  12. mysql使用游标删除数据库_mysql 使用游标进行删除操作的存储过程
  13. 3-ESP8266 SDK开发基础入门篇--点亮一个灯
  14. mysql repair 索引_MySQ索引操作命令总结(创建、重建、查询和删除索引命令详解)...
  15. 用计算机模拟高空救援的过程是人工智能在,本科-人工智能复习题
  16. Vue select默认选中第一个
  17. 变更DirectX SDK版本-DirectX8升级DirectX9
  18. 视频流(自适应算法)
  19. JQ获取本地JSON文件中的数据 模拟分页效果 - 初学
  20. 二维码图片如何快速生成

热门文章

  1. mysql limitorderby
  2. flask v0.1 路由
  3. Oracle11g数据库快速安装
  4. python db api_dbapi · PyPI
  5. Windows Server 2012 R2 WSUS-5:组策略配置自动更新
  6. Maven学习总结(39)——Maven私服的搭建及使用deploy命令部署构建问题汇总
  7. 一个箱子的梦想_我的世界全自动甘蔗收割机,不用动手,轻松收获一箱子甘蔗...
  8. java singleton inner class_Java面向对象设计模式-单例模式
  9. 自定义注解完成数据库切库
  10. 将指定路径下的所有SVG文件导出成PNG等格式的图片(缩略图或原图大小)