时间复杂度---我又要想起初中数学老师的脸了xxxxx
时间复杂度:
常用的时间复杂度有:常数级,对数级,线性级 线性对数级 平方级,立方级别,多项式级别,指数级别,阶乘级别
这里我们主要探讨对数级,线性级,平方级,指数级---为什么不讨论其他的?别的我也不会啊--- 囧
f(x) ε O(n*n):这里指的是f这个函数的增长速度 不会以后n*n快 这里的x指的是特定的输入
用n来估算x的范围大小
我们先写一段代码。QAQ:
- def exp1(a,b):
- ans =1
- while(b>0):
- ans *=a
- b -=1
- return ans
这个方法是求 a的b次方的值 ?那么如果b=10 做了多少次操作呢 3b+2 也就是32次 那么我们可以得出
f(x) ε O(3b+2) 但是2好像是不会变的,当数值变大时2就没有意思 所以f(x) ε O(3b) 当然他就是线性的 我们都写错O(n) ----这就是所谓的线性级
我们在来看看下面的代码:
- def exp2(a,b):
- if b == 1:
- return a
- else:return a*exp2(a ,b-1)
- print exp2(2,3)
这里我们用的是递归,同样的我们来看看这个函数执行数跟参数的关系:
t(b) = 3+t(b-1) --->t(b) = 3+3+t(b-2) 我们找到规律就是 t(b) = 3*k+t(b-k) --这里的k 是我们添加的参数
我们知道当b-k=1 的时候就结束了 那么 k = b-1 上述方程式:结果为 3b-2 那么 f(x) ε O(3b-2)也是线性的
那么接着看下面的代码:
- def exp3(a,b):
- if b == 1:
- return a
- if (b/2)*2 ==b:
- return exp3(a*a,b/2)
- else:
- return a*exp2(a ,b-1)
我们在这里做了小小的性能优化 ,如果我们求的是 偶数次方 我们知道 a的4次方等于 a*a的平方
t(b)= 6+t(b/2)--->6+6+t(b/2*2)--->6+6+6+t(b/2*2*2)---6*k+t(b/2的k次方) 我们知道当b/2的k次方=1的时候结束 那么k = log2 b 也就是 O(log)--这里就是对数级
接下来我们看看轻松的
- def exp4(a,b):
- x = 0
- for i in range(a):
- for i range(b):
- x+=1
- return x
很明显 t(b)=(a*b) 也就是O(a*b)---平方级
最后我们来看下指数级: 也许是你最不想看到的情况:
- def Towers(size,fromStack,toStack,spareStack):
- if size == 1:
- print "Move disk from ",fromStack, "to" ,toStack
- else:
- Towers(size-1,fromStack,spareStack,toStack)
- Towers(1,fromStack,toStack,spareStack)
- Towers(size-1,spareStack,toStack,fromStack)
t(b) = 3+2*t(b-1)--->3+3*2+4*t(b-2)-->1*3+2*3+4*3+8*(b-3)
--->3(1+2+4+...2^k-1) +2^k*(b-k)---->O(2^n)
时间复杂度---我又要想起初中数学老师的脸了xxxxx的更多相关文章
- D唐纳德和他的数学老师(华师网络赛)(二分匹配,最大流)
Time limit per test: 1.0 seconds Memory limit: 256 megabytes 唐纳德是一个数学天才.有一天,他的数学老师决定为难一下他.他跟唐纳德说:「现在 ...
- 海边直播目标2017全国初中数学竞赛班课堂测试题解答-The Final
1. 设函数 $f(x) = 2^x(ax^2 + bx + c)$ 满足等式 $f(x+1) - f(x) = 2^x\cdot x^2$, 求 $f(1)$. 解答: 由 $f(x) = 2^x( ...
- 用初中数学知识撸一个canvas环形进度条
周末好,今天给大家带来一款接地气的环形进度条组件vue-awesome-progress.近日被设计小姐姐要求实现这么一个环形进度条效果,大体由四部分组成,分别是底色圆环,进度弧,环内文字,进度圆点. ...
- canvas基础[一]探究出初中数学知识
何时用SVG何时用canvas SVG 矢量图,视觉清晰,文件小 <svg viewBox="0 0 100 100"> <circle cx="50& ...
- 十分简明易懂的FFT(快速傅里叶变换)
https://blog.csdn.net/enjoy_pascal/article/details/81478582 FFT前言快速傅里叶变换 (fast Fourier transform),即利 ...
- 程序员的成长与规划 | 送签名书啦 | StuQ专访foruok
StuQ(InfoQ的朋友)对我做了一次专访,下面是原文. 福利:送一本签名版<你好哇,程序员>,参与方式在文末.
- 对于JAVA课程的期望
对于JAVA课程的期望 我对于JAVA这门课程最初的了解可能来自于学长学姐的描述,或者是选课指南上简单的课程名称,那个时候的JAVA,对我来说遥远而又陌生,显得那么高大上,但是一转眼自己马上就要结束大 ...
- [51NOD1087]1 10 100 1000(规律,二分)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1087 用高中的数列知识就可以推出公式,不难发现f(n)=f(n ...
- 四则运算 SPEC 20160911
本文档随时可能修改,并且没有另行通知. 请确保每一次在开始修改你的代码前,读标题中的日期,如果晚于你上次阅读, 请重读一次. 教师节你去探望初中数学老师,她感叹你当年真是个优秀学生啊,从来不报怨作 业 ...
随机推荐
- 嵌入式Linux驱动学习之路(八)创建最小的根文件系统
busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...
- [No00000E]PPT快捷键大全 PowerPoint2013/2010/2007/2003常用快捷
熟练掌握PowerPoint快捷键可以让我们更快速的制作PPT模板,大大的节约时间成本.想提高工作效率吗?请熟悉PowerPoint快捷键吧!想成为高手吗?请先了解PPT快捷键吧!想制作出一个优秀的P ...
- jquery的ready方法(DOM是否加载完)详解与使用
jquery的ready方法(准备DOM触发)还是比较复杂的,我们先看流程图:
- TFS命令tf:undo(强制签入签出文件)
由于修改计算机名称或不同电脑上操作忘记签入,则需要强制签入文件 具体步骤如下: 1.在命令行中输入"cd C:\Program Files\Microsoft Visual Studio ...
- AFNetworking 基本使用
AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其他方法为基础的. 下面这个例子是用来处理json请求的 3如何选择AFNetwork ...
- 未能正确加载包“Microsoft.Data.Entity.Design.Package.MicrosoftDataEntityDesignPackage
本文出处:http://blog.sina.com.cn/s/blog_6fe3efa301016i64.html vs 2005 ,vs 2008, vs 2010,安装后有时出现这个错误(我的机器 ...
- Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...
- MySQL分表(Partition)学习研究报告
最近在开发一个新的项目,可能会产生大数据量,需要对部分表进行分表操作,故来研究学习MySQL的分表功能. 由于实验报告已经写成Exlce文件了,各位看过就直接下载吧:MySQL分表分析报告.xls 以 ...
- Construct Binary Tree from Preorder and Inorder Traversal
Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...
- Linux system函数详解
system 功能:system()函数调用"/bin/sh -c command"执行特定的命令,阻塞当前进程直到command命令执行完毕 原型 int system(cons ...