两段函数,判断函数执行速度

func t1() int {
fmt.Println("hello world")
return 0
}

此段函数运行次数为2次,打印字符串一次,返回0值一次,T(n)估算值为:T(n)=2

  // i:=0 1次
// i<n n+1次
// i++ n次
// fmt n次
// return 1次
// 相加:1 + n + 1 + n + n+ 1 = 3n+3
func t2(n int) int {
for i := 0; i < n; i++ {
fmt.Println("hello world")
}
return 0
}

当n=2时此段代码运行次数为9次,i=0一次,i<2 3次,i++两次,打印两次,return一次,T(n)估算值为:T(n)=3N+3

T(n),T当输入为n时,某段代码的总执行次数,n输入数据的大小或者数量

简化的T(n)就是时间复杂度

调用一次函数t1,T(n)= 2 → 1 ,T(n)=常数,常数无论是什么值都估算为1

掉用一次函数t2,T(n)=3n+3 →,常数在时间复杂度估算为1,T(n)=n,因为对于程序来说运行时长最大的还是n,常数的运行时长的固定的

对于n的指数方程应该按照最高指数项来约

T(n)=5n^3+6666n^2+2333 约为T(n)=n^3,n^2的运行时常远远小于n^3的运行时长,对于T(n)来说影响程序运行时长最大的还是n^3的运行时长

表示时间复杂度需要在估值外面加上O

例如:

T(n)=O(1)
T(n)=O(n)
T(n)=O(n^3)

例题

  • 多重循环
func t3(n int) {
for i := 0; i < n; i++ { //执行次数为n
for j := 0; j < n; j++ { //执行次数为n
fmt.Println("你好@") //执行次数为1
}
}
// 整体执行次数为:n * n * 1 = n^2
}
  时间复杂度:O(n^2),公式为如果有a层循环,时间复杂度就是O(n^a)
  • 多重循环加上单循环
func t4(n int) {
for i := 0; i < n; i++ { //执行次数为n
for j := 0; j < n; j++ { //执行次数为n
fmt.Println("你好@") //执行次数为1
}
}
// 多重循环执行次数为n^2
for i := 0; i < n; i++ {
fmt.Println("你好!")
}
// 单循环执行次数为n
}
  整体时间复杂度为O(n^2),因为对程序整体时间复杂度影响最大的是n^2
  • 多重循环加上判断
func t4(n int) {
if n > 100 {
for i := 0; i < n; i++ { //执行次数为n
for j := 0; j < n; j++ { //执行次数为n
fmt.Println("你好@") //执行次数为1
}
}
} else {
// 多重循环执行次数为n^2
for i := 0; i < n; i++ {
fmt.Println("你好!")
}
}
// 单循环执行次数为n
}
  对于分情况运行的程序依旧是按照运行时间最长的分支来计算,所以此程序时间复杂度为O(n^2)
  • 循环嵌套
func t5(n int) {
for i := 0; i < n; i++ {
for j := i; j < n; j++ {
// i = 0 j = 0 循环次数为n-0次 i = 1 j = 1 循环次数为 n - 1 次 i = 2 j = 2 循环次数为 n - 2次 当i = n -1 时 j = n -1 循环次数为 n - (n - 1) 循环次数为1
fmt.Println(j, i)
}
} }
  整体时间复杂度公式为:

  T(n) = n + (n -1) + (n-2)...+(n - (n-2)) + (n-(n-1))+(n-(n-0))

       =n + n - 1 + n - 2 ... + 2 + 1 + 0

       =n + n + n +.....

       =n * n

       = n^2

  时间复杂度O(n^2)

logn算法

func t6(n int) {
for i := 0; i < n; i *= 2 {
fmt.Println("hello world")
}
}

根据单循环时间复杂度来类比,当n=2时T(2)=2,2是打印的次数,也就是说打印的时间就是此代码的真正执行时间。对于上面的代码,假设n=8,共计打印字符串的次数为3次,假设n=16共计打印字符串次数为4次,从公式可得

T(8)=3, 2^3=8,2^T(8)=8

T(16)=4, 2^4=16,2^T(16)=16

2^T(n)=n

转换一下可得:T(n)=logn2n,再换算为时间复杂度为:T(n)=O(logn n)

时间复杂度对比

   
名称 时间复杂度
常数时间 O(1)
对数时间 O(log n)
线性时间 O(n)
线性对数时间 O(n log n)
二次时间 O(n^2)
三次时间 O(n^3)
指数时间 O(2^n)

运行时间大小从上往下排越靠下运行时间越长

时间复杂度计算-go的更多相关文章

  1. Java基础-时间复杂度计算方式

    Java基础-时间复杂度计算方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境 ...

  2. 大O法时间复杂度计算

    困惑的点——log,如何计算得出? ① 上限:用来表示该算法可能有的最高增长率. ② 大O表示法:如果某种算法的增长率上限(最差情况下)是f(n),那么说这种算法“在O(f(n))中”.n为输入规模. ...

  3. c++性能测试工具:计算时间复杂度

    有时候除了测量算法的具体性能指数,我们也会希望测试出算法的时间复杂度,以便我们对待测试的算法的性能有一个更加直观的了解. 测量时间复杂度 google benchmark已经为我们提供了类似的功能,而 ...

  4. 时间复杂度 - Convert 计算次数 TO 时间复杂度

    我们假设计算机运行一行基础代码需要执行一次运算. int aFunc(void) { printf("Hello, World!\n"); // 需要执行 1 次 return 0 ...

  5. 深入浅出数据结构C语言班(11)——简要介绍算法时间复杂度

    在接下来的数据结构博文中,我们将会开始接触到一些算法,也就是"解决某个问题的方法",而解决同一个问题总是会存在不同的算法,所以我们需要在不同的算法之中做出抉择,而做出抉择的根据往往 ...

  6. 洛谷P3952 时间复杂度【字符串】【模拟】

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  7. php算法基础----时间复杂度和空间复杂度

    算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...

  8. 时间复杂度 NOIP_2017_D1T2

    有的题做了很久\感想比较深\可以引申很多\上台讲过,所以单开一篇,不放在总结下面. 这道题做的时候花了很长时间,犯的错也比较典型,当时写过一篇单独的总结,放在学校了,返校后粘上来. 时间复杂度 小明正 ...

  9. [NOIP2017]时间复杂度

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  10. P3952 时间复杂度

    P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...

随机推荐

  1. babylon.js 学习笔记(9)

    接上回继续,做为一个游戏引擎,怎能没有Sprite(精灵)? 下面是基本示例: const createScene = function () { const scene = new BABYLON. ...

  2. Rust: win10环境如何编译bevy?

    bevy是一个rust语言的跨平台游戏引擎,但是在windows10环境编译时,遇到问题无数,幸尽数解决,记录于此,供遇到同类问题的朋友参考: 环境:windows 10 + bevy 0.5.0 + ...

  3. 12Java基础之多态

    多态 多态是在继承/实现情况下的一种现象,表现为:对象多态.行为多态. 多态存在的条件 有继承关系 子类重写父类的方法 父类引用指向子类对象 多态的一个注意事项 多态是对象.行为的多态,Java中的属 ...

  4. Ubuntu 18.04 开机自启 某命令脚本

    1.mv xx.sh /etc/init.d 2.chmod 777 xx.sh 4.sudo update-rc.d xx.sh defaults 90 # 90为优先级,越高执行的越晚 5.sud ...

  5. 亚马逊AutoML论文获最佳论文奖

    亚马逊在首届AutoML会议上荣获最佳论文奖 论文提出了一种停止超参数优化过程的新准则 在首届自动化机器学习(AutoML)会议上,我们团队凭借关于贝叶斯优化终止方法的研究获得最佳论文奖.该研究解决了 ...

  6. 探索 LanceDB 在多种存储方案下的查询效率

    随着 LLM 和多模态 AI 的兴起,非结构化数据的规模呈指数级增长,这对数据存储.检索和分析提出了更高的要求.LanceDB 是 AI 原生多模态数据湖产品,采用自研的开源数据格式 Lance,以解 ...

  7. 删除 linux 导致原来的 win10 进不去

    win10 + linux双系统,删除 linux 导致 win10 无法进入,通过重建 mbr 即可解决.

  8. 深度对比 Coze 与 Dify,一文看懂如何选型

    大家好,我是汤师爷,专注AI智能体分享,致力于帮助100W人用智能体创富~ 随着Coze开源,业内许多人认为它可能对Dify构成威胁. 本文从架构设计.技术栈和适用场景等方面对这两个平台进行全面对比. ...

  9. 已经写了一个linux下可运行的全屏程序,如何让系统启动的时候自动起来,不要看到操作系统的桌面界面

    要在Linux系统启动时自动运行你的全屏程序,并且不显示操作系统的桌面界面,你可以按照以下步骤进行设置: 1. **设置默认运行级别(或目标)**: - 对于使用Systemd的现代Linux发行版( ...

  10. ubuntu 后台运行的几种方法!

    第一种:使用 "nohup",即 "nohup ./test.sh &",忽略hangup信号,防止终端关闭时程序退出. 运行状态可以用 "j ...