文章目录

  • 1. 准备知识
    • 1. 拓展资料
    • 2. 自顶向下编写算法
  • 2. 时间复杂度的分析
    • 1.时间复杂度种类
    • 2. 时间复杂度的分析方法
    • 3. 主定理理论,时间复杂度计算

1. 准备知识

1. 拓展资料

  1. leetcode看看同一个题目国际站的disscuss,一定要看这个
  2. idea leetcode的plugin
  3. code style: 空格等需要注意
  4. 选单词的快捷键操作

2. 自顶向下编写算法

自顶向下的方式,使用方法来抽象主干逻辑

2. 时间复杂度的分析

1.时间复杂度种类

时间复杂度,最常见是7种

  1. O(1) 常数
  2. O(logn) 对数
  3. O(n) 线性
  4. O(n^2) 平方
  5. O(n^3) 立方
  6. O(2^n) 指数
  7. O(n!) 阶乘

2. 时间复杂度的分析方法

个人在学习中发现,时间复杂度的分析很多时候没有唯一的方式,首先,关于时间复杂度的理解,我认为可以理解为随着问题规模的增长,需要的时间增长的级别
但是具体的分析方式确实有很多种类

  1. 简单的分析,比如对于sum(n)的算法,直接看n=1,和n=k之间的差别

    1. 如果使用循环累加的话,那么n=k的话,时间复杂度也会从t编程kt,所以时间复杂度则是O(n)
    2. 如果使用数学公式进行计算的话,那么n=k和n=1的计算方式是一样的
  2. 使用递推方式,比如斐波那契的最原始的方式f(n)=f(n-1)+f(n-2)的递归方式,所以T(n)=T(n-1)+T(n-2),所以T(n)=2^n*T(1),所以T(n)=2^n

  3. 使用树状图类分析,把merge sort 分析,拆成一个树,进行分析

    我们只需要知道这棵树的高度hhh,用高度hhh乘以每一层的时间消耗nnn,就可以得到总的时间复杂度O(n∗h)O(n*h)O(n∗h)

  4. 使用主定理(master method)分析

3. 主定理理论,时间复杂度计算

主定理最早出现在《算法导论》中,提供了分治方法带来的递归表达式的渐近复杂度分析。
规模为n的问题通过分治,得到a个规模为n/b的问题,每次递归带来的额外计算为f(n)
那么问题的时间复杂度为:
T(n) = aT(n/b)+f(n)

c*=logb(a)
那么就可以得到问题的复杂度为:

  1. 如果c<c*
f(n)=O(n^c),
c<c*
则T(n)=O(n^c*)

举例,二叉树的遍历,时间复杂度为O(n)
对应的

a=2,b=2
c*=1
f(n)=O(1)
T(n)=2(n/2)+O(1)
因为满足c<c*则T(n)=O(n)
  1. 如果c==c*
f(n)=O(n^c * (log(n))^k),且c==c*
则
T(n)=O(n^c* * (log(n))^(k+1))这里的关键就是f(n)中的n的指数等于logb(a)这个条件也被描述为
f(n)=O(n^c* * (log(n))^k)

举例,merge sort,时间复杂度为nlog(n)

a=2,b=2
c*=1
f(n)=O(n),则由f(n)=O(n^c* * (log(n))^k)可以推断出来k=0
所以
T(n)=nlog(n)

二分查找

a=1,b=2
c*=0
f(n)=O(1),所以c=0,k=0
c==c*
T(n)=O(n^0 * log(n)^1 = O(log(n))
  1. 如果 c>c*
f(n)=O(n^c)
且c>c*
则T(n)=O(f(n))

举例,暂无

注意,主定理的使用也是万能的,他只使用于,子问题划分为了独立的子问题的情况,子问题之间不能再有交叉
在斐波那契数列中,主定理就是无法使用的

算法训练营02-预备知识和时间复杂度分析相关推荐

  1. 算法与数据结构(三) 时间复杂度分析 [例题]

    时间复杂度分析 用几种分析方法分析下面函数的时间复杂度 // 全局变量,大小为10的数组array,长度len,下标i. int array[] = new int[10]; int len = 10 ...

  2. 排序算法 之希尔排序及时间复杂度分析

    排序算法之 冒泡排序及性能优化(时间复杂度+空间复杂度分析) 排序算法之 简单选择排序及时间复杂度分析 排序算法之 直接插入排序及时间复杂度分析 希尔排序 算法思想:将整个待排序列分割成若干个子序列( ...

  3. 03.预备知识:算法的复杂度分析

    大家好,我是王有志.关注王有志,回复DSA获取数据结构和算法学习资源. 今天我们只有一个内容:算法的复杂度分析.算法的复杂度分析可以说是算法中的灵魂,有了它我们才能去评价一个算法优劣. 算法的评价标准 ...

  4. 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念

    上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...

  5. Fourier分析入门——第1章——数学预备知识

    第 1 章  学习Fourier分析的数学预备知识 目录 第 1 章  学习Fourier分析的数学预备知识 1.1 引言 1.2 几何和代数的一些相关概念的回顾 1.2.1 标量运算(scalar ...

  6. 算法时间复杂度分析基础

    摘要       本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...

  7. 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记

    文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...

  8. C++Primer Plus (第六版)阅读笔记 + 源码分析【第一章:预备知识】

    第一章:预备知识 C++简介 C++简史 C语言 C语言编程原理 面向对象编程 C++和泛型编程 C++的起源 可移植性和标准 程序创建的技巧 创建源代码文件 编译和链接 UNIX Linux Win ...

  9. 算法时间复杂度分析专题一(帮助快速解题)

    笔试: 题目告诉数据范围,根据题目的数据范围来考虑用什么解法 c++竞赛:一般时限1~2秒 时间范围内指令操作次数<10^8 不同数据范围下,代码时间复杂度和算法该如何选择: n<=30, ...

最新文章

  1. 音乐(文件)断点下载
  2. Ruby如何使用require从外部加载自定义类或模块
  3. 09Mybatis_入门程序——删除用户以及更新用户
  4. 2.修改/etc/hosts文件 /安装SSH、配置SSH无密码登陆(全程切换到hadoop用户下操作)
  5. 阿里云MySQL按流量计费吗_阿里云服务器按使用流量计费带宽峰值1M和100M费用方面有区别吗?...
  6. 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
  7. MySQL where后面的列子查询使用
  8. docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群
  9. Docker映像存储在哪里? Docker容器路径介绍
  10. 事件和委托的编译代码
  11. 【数字信号处理】基于matlab GUI IIR低通+FIR高通信号时域+频谱分析【含Matlab源码 1029期】
  12. mysql环境变量配置还是不行_为什么要配置mysql环境变量
  13. win11系统 JDK 环境变量配置失败
  14. [汇编语言例题]计算地址连续的ffff:0~ffff:b单元中的数据的和(详解)
  15. 梦想照进现实|CSDN 实体奖牌 第三期
  16. Win32多语言IME应用程序编程接口(API)
  17. mysql 在线语法检查工具,符合多个数据库的在线SQL语法检查器
  18. 《可复制的领导力》读书笔记
  19. MineCraft Spigot简单开服教程
  20. 网络直播为何如此受年轻人喜爱?互联网时代对发展有什么影响!

热门文章

  1. 操作系统 :银行家算法的实现(C++)
  2. ON DUPLICATE KEY UPDATE 用法与说明
  3. SQL 学习最强刷题网站!
  4. 回腾讯了......
  5. 实时音视频助力在线教育风口
  6. 数平精准推荐 | OCR技术之系统篇
  7. nginx日志配置指令详解
  8. Nginx-1.9.8推出的切片模块
  9. 申请Let's Encrypt的证书
  10. Flink 能够改写成 FlinkSQL的理论依据:命令式代码 vs 声明式代码