算法训练营02-预备知识和时间复杂度分析
文章目录
- 1. 准备知识
- 1. 拓展资料
- 2. 自顶向下编写算法
- 2. 时间复杂度的分析
- 1.时间复杂度种类
- 2. 时间复杂度的分析方法
- 3. 主定理理论,时间复杂度计算
1. 准备知识
1. 拓展资料
- leetcode看看同一个题目国际站的disscuss,一定要看这个
- idea leetcode的plugin
- code style: 空格等需要注意
- 选单词的快捷键操作
2. 自顶向下编写算法
自顶向下的方式,使用方法来抽象主干逻辑
2. 时间复杂度的分析
1.时间复杂度种类
时间复杂度,最常见是7种
- O(1) 常数
- O(logn) 对数
- O(n) 线性
- O(n^2) 平方
- O(n^3) 立方
- O(2^n) 指数
- O(n!) 阶乘
2. 时间复杂度的分析方法
个人在学习中发现,时间复杂度的分析很多时候没有唯一的方式,首先,关于时间复杂度的理解,我认为可以理解为随着问题规模的增长,需要的时间增长的级别
但是具体的分析方式确实有很多种类
简单的分析,比如对于sum(n)的算法,直接看n=1,和n=k之间的差别
- 如果使用循环累加的话,那么n=k的话,时间复杂度也会从t编程kt,所以时间复杂度则是O(n)
- 如果使用数学公式进行计算的话,那么n=k和n=1的计算方式是一样的
使用递推方式,比如斐波那契的最原始的方式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使用树状图类分析,把merge sort 分析,拆成一个树,进行分析
我们只需要知道这棵树的高度hhh,用高度hhh乘以每一层的时间消耗nnn,就可以得到总的时间复杂度O(n∗h)O(n*h)O(n∗h)使用主定理(master method)分析
3. 主定理理论,时间复杂度计算
主定理最早出现在《算法导论》中,提供了分治方法带来的递归表达式的渐近复杂度分析。
规模为n的问题通过分治,得到a个规模为n/b的问题,每次递归带来的额外计算为f(n)
那么问题的时间复杂度为:
T(n) = aT(n/b)+f(n)
设c*=logb(a)
那么就可以得到问题的复杂度为:
- 如果
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)
- 如果
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))
- 如果
c>c*
f(n)=O(n^c)
且c>c*
则T(n)=O(f(n))
举例,暂无
注意,主定理的使用也是万能的,他只使用于,子问题划分为了独立的子问题的情况,子问题之间不能再有交叉
在斐波那契数列中,主定理就是无法使用的
算法训练营02-预备知识和时间复杂度分析相关推荐
- 算法与数据结构(三) 时间复杂度分析 [例题]
时间复杂度分析 用几种分析方法分析下面函数的时间复杂度 // 全局变量,大小为10的数组array,长度len,下标i. int array[] = new int[10]; int len = 10 ...
- 排序算法 之希尔排序及时间复杂度分析
排序算法之 冒泡排序及性能优化(时间复杂度+空间复杂度分析) 排序算法之 简单选择排序及时间复杂度分析 排序算法之 直接插入排序及时间复杂度分析 希尔排序 算法思想:将整个待排序列分割成若干个子序列( ...
- 03.预备知识:算法的复杂度分析
大家好,我是王有志.关注王有志,回复DSA获取数据结构和算法学习资源. 今天我们只有一个内容:算法的复杂度分析.算法的复杂度分析可以说是算法中的灵魂,有了它我们才能去评价一个算法优劣. 算法的评价标准 ...
- 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念
上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...
- Fourier分析入门——第1章——数学预备知识
第 1 章 学习Fourier分析的数学预备知识 目录 第 1 章 学习Fourier分析的数学预备知识 1.1 引言 1.2 几何和代数的一些相关概念的回顾 1.2.1 标量运算(scalar ...
- 算法时间复杂度分析基础
摘要 本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...
- 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...
- C++Primer Plus (第六版)阅读笔记 + 源码分析【第一章:预备知识】
第一章:预备知识 C++简介 C++简史 C语言 C语言编程原理 面向对象编程 C++和泛型编程 C++的起源 可移植性和标准 程序创建的技巧 创建源代码文件 编译和链接 UNIX Linux Win ...
- 算法时间复杂度分析专题一(帮助快速解题)
笔试: 题目告诉数据范围,根据题目的数据范围来考虑用什么解法 c++竞赛:一般时限1~2秒 时间范围内指令操作次数<10^8 不同数据范围下,代码时间复杂度和算法该如何选择: n<=30, ...
最新文章
- 音乐(文件)断点下载
- Ruby如何使用require从外部加载自定义类或模块
- 09Mybatis_入门程序——删除用户以及更新用户
- 2.修改/etc/hosts文件 /安装SSH、配置SSH无密码登陆(全程切换到hadoop用户下操作)
- 阿里云MySQL按流量计费吗_阿里云服务器按使用流量计费带宽峰值1M和100M费用方面有区别吗?...
- 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
- MySQL where后面的列子查询使用
- docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群
- Docker映像存储在哪里? Docker容器路径介绍
- 事件和委托的编译代码
- 【数字信号处理】基于matlab GUI IIR低通+FIR高通信号时域+频谱分析【含Matlab源码 1029期】
- mysql环境变量配置还是不行_为什么要配置mysql环境变量
- win11系统 JDK 环境变量配置失败
- [汇编语言例题]计算地址连续的ffff:0~ffff:b单元中的数据的和(详解)
- 梦想照进现实|CSDN 实体奖牌 第三期
- Win32多语言IME应用程序编程接口(API)
- mysql 在线语法检查工具,符合多个数据库的在线SQL语法检查器
- 《可复制的领导力》读书笔记
- MineCraft Spigot简单开服教程
- 网络直播为何如此受年轻人喜爱?互联网时代对发展有什么影响!