时间复杂度和空间复杂度3

让编程改变世界

Change the world by program


函数调用的时间复杂度分析

如果我们把问题再实际化一点,大家是否能自己正确的分析出来呢? 我们来看下边这个例子: [codesyntax lang="c"]

int i, j;
for(i=0; i < n; i++)
{function(i);
}
void function(int count)
{printf(“%d”, count);
}

[/codesyntax]   函数体是打印这个参数,这很好理解。function函数的时间复杂度是O(1),所以整体的时间复杂度就是循环的次数O(n)。 假如function是下面这样,又该如何呢: [codesyntax lang="c"]

void function(int count)
{int j;for(j=count; j < n; j++) {printf(“%d”, j);}
}

[/codesyntax]   事实上,这和之前我们讲解平方阶的时候举的第二个例子一样:function内部的循环次数随count的增加(接近n)而减少,所以根据游戏攻略算法的时间复杂度为O(n^2)。 接着使出杀手锏,给鱼油们一个挑战的机会! 尝试自己分析以下程序的时间复杂度: [codesyntax lang="c"]

n++;
function(n);for(i=0; i < n; i++)
{function(i);
}for(i=0; i < n; i++)
{for(j=i; j < n; j++) {printf(“%d”, j);}
}void function(int count)
{int j;for(j=count; j < n; j++) {printf(“%d”, j);}
}

[/codesyntax]

常见的时间复杂度

[caption id="attachment_743" align="aligncenter" width="680"] 常见的时间复杂度[/caption]     [caption id="attachment_744" align="aligncenter" width="400"] 常见的时间复杂度[/caption] [caption id="attachment_745" align="aligncenter" width="400"] 常见的时间复杂度[/caption]   常用的时间复杂度所耗费的时间从小到大依次是:O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)   O(1),O(logn),O(n),O(n^2)我们前边已经给大家举例谈过了,至于O(nlogn)我们将会在今后的课程中介绍。 而像O(n^3)之后的这些,由于n值的增大都会使得结果大得难以想象,我们没必要去讨论它们。

最坏情况与平均情况

从心理学角度讲,每个人对将来要发生的事情都会有一个预期。 譬如看半杯水,有人会说:哇哦,还有半杯哦!但有人就会失望的说:天,只有半杯了。 一般人常出于一种对未来失败的担忧,而在预期的时候趋向做最坏打算。这样,即使最糟糕的结果出现,当事人也有了心理准备,比较容易接受结果,假如结局并未出现最坏的状况,这也会使人更加快乐,瞧,事情发展的还不错嘛!嗯,这是典型的自慰手法。   算法的分析也是类似,我们查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置,那么时间复杂度为O(n)。   平均运行时间是期望的运行时间,最坏运行时间是一种保证。 在应用中,这是一种最重要的需求,通常除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

算法的空间复杂度

我们在写代码时,完全可以用空间来换去时间。 举个例子说,要判断某年是不是闰年,你可能会花一点心思来写一个算法,每给一个年份,就可以通过这个算法计算得到是否闰年的结果。 另外一种方法是,事先建立一个有2050个元素的数组,然后把所有的年份按下标的数字对应,如果是闰年,则此数组元素的值是1,如果不是元素的值则为0。   这样,所谓的判断某一年是否为闰年就变成了查找这个数组某一个元素的值的问题。 第一种方法相比起第二种来说很明显非常节省空间,但每一次查询都需要经过一系列的计算才能知道是否为闰年。 第二种方法虽然需要在内存里存储2050个元素的数组,但是每次查询只需要一次索引判断即可。   这就是通过一笔空间上的开销来换取计算时间开销的小技巧。到底哪一种方法好?其实还是要看你用在什么地方。 算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。   通常,我们都是用“时间复杂度”来指运行时间的需求,是用“空间复杂度”指空间需求。 当直接要让我们求“复杂度”时,通常指的是时间复杂度。 显然对时间复杂度的追求更是属于算法的潮流! [buy]?获得所有教学视频、课件、源代码等资源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LQKHPGGMWGOF']视频下载[/Downlink] [Downlink href='http://urlxf.qq.com/?Jf2yYzy']备胎下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2012/09/18/3846255.html

时间复杂度和空间复杂度3 - 数据结构和算法05相关推荐

  1. 【数据结构和算法05】 红-黑树(转发)

    2019独角兽企业重金招聘Python工程师标准>>> [数据结构和算法05] 红-黑树(看完包懂~) 置顶 2016年04月13日 15:50:25 eson_15 阅读数:526 ...

  2. python 栈_Python数据结构与算法05:基本结构:栈的应用之括号匹配

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为7分钟. 算法流程 括号匹配情况介绍 我们经常会遇到类似(9-1)*(8+7)/(4-2).print(& ...

  3. 数据结构与算法 -- 时间复杂度

    数据结构与算法看完了,回过头来在看时间复杂度,对它们的效率做个比较吧. 一.时间复杂度介绍 1.时间复杂度定义 参看:数据结构-算法-时间复杂度计算 在进行算法分析,语句总得执行次数 T(n) 是关于 ...

  4. day001:数据结构和算法-时间频度和时间复杂度

    1.初识数据结构和算法 简单认识中:ArrayList的查询快点,插入慢.LinkedList查询慢,插入快.但是结论是将数据的大小为基础前提,相对的. -1^n 计算问题 编程问题:求(-1)^0 ...

  5. 算法:算法概述【时间复杂度、空间复杂度】

    一.算法定义 算法:为了实现业务目的的各种方法和思路就是算法.同样的数据,同样的目的, 不同的算法,不同的方法和思路,效率就会不同 算法是一种独立的存在 , 它并不依附于代码 , 代码只是实现算法思想 ...

  6. 时间复杂度和空间复杂度计算(数据结构C语言实现1)

    写在前面 数据结构C语言系列,和博主一起学习简单的数据结构和算法,都是利用C语言实现,很基础,相信大家都能够学会,都有所收获.记得点赞,收获. 目录 写在前面 本节目标 基本概念 **常见算法的时间复 ...

  7. 【数据结构】时间复杂度和空间复杂度

    文章目录 前言 1. 什么是数据结构 2. 什么是算法 正文 1. 算法效率 1.1 如何衡量一个算法的优劣 1.2 算法的复杂度 2. 时间复杂度 2.1 定义 2.2 计算 2.3 大O的渐进表示 ...

  8. 关于算法的时间复杂度和空间复杂度的总结

    一.算法的概念   算法(Algorithm)是将一组输入转化为一组输出的一系列计算步骤,其中每个步骤必须能在有限时间内完成.算法是用来解决一类计算问题的,注意是一类问题,而不是一个特定的问题. 二. ...

  9. <时间复杂度和空间复杂度计算>《数据结构(C语言版)》

    人总得接受平凡和遗憾,但那不是一直自甘堕落的理由.显贵出身也好,泥腿子出身也罢,人生一世,你不仅为自己而活,你还承担着家族崛起的使命,是承上启下的一代,往大了说,也是国家.社会的一份子,总得做些有意义 ...

最新文章

  1. 康泰瑞影推高性能3D/4D超声可视化方案
  2. Python爬虫对json数据解析爬取
  3. 计算机生活工作原理,计算机基本工作原理是什么?
  4. 分布式集群的Session问题
  5. 6个月达不到25.6万年薪AI工程师,进不了大厂全额退款
  6. mysql+yes数据类型,怎样修改mysql列的数据类型?
  7. Linux常用命令(知道啦就赶紧收藏吧)
  8. Java学习笔记5-2——多线程
  9. 浅谈OpenCL之 应用程序总体步骤思路
  10. ole db 访问接口 sqlncli 无法启动分布式事务_分布式事务,看这篇就够了
  11. antimalware service executable占用内存_解决 vue 项目运行过程中内存泄漏问题
  12. JS—触摸事件、手势事件
  13. 毕业设计 基于java的贴吧论坛_java毕业设计_springboot框架的论坛贴吧
  14. Linux 系统中如何恢复已删除的文件?
  15. 手机版浏览器f12_小科普 | 如何用浏览器的F12装逼?
  16. 我的工作随手记(一)
  17. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)
  18. 自己编写自动同步脚本
  19. 什么是环境变量?环境变量配置,jdk8的path环境变量配置,各个版本下jdk结构的变化以及环境变量配置的阐述,java命令执行三个不同目录下的java.exe说明
  20. Zuul Filter的小坑

热门文章

  1. 美国公司欲联合大电脑商阻止绿坝推广
  2. 4.3.8 DHCP协议
  3. vscode折叠/展开所有区域代码快捷键
  4. C++实现遍历链表一次求出中间的节点
  5. RS232与RS485的功能与区别!
  6. MySQL中REGEXP正则查询同一个字段模糊搜索
  7. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...
  8. 微信企业号开启回调模式--php
  9. [转]Display PDF within web browser using MVC3
  10. Mysql无限重启问题可能原因