时间复杂度

算法中的时间复杂度分析

£可爱£侵袭症+ 提交于 2019-12-03 10:15:24
三个法则,从极客时间的算法专栏总结 1. 只关注循环执行次数最多的一段代码 ,我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。 2. 加法法则:总复杂度等于量级最大的那段代码的复杂度,总的时间复杂度就等于量级最大的那段代码的时间复杂度。 例如: 那我们将这个规律抽象成公式就是:如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))). 3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 例如: 如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)).也就是说,假设 T1(n) = O(n),T2(n) = O(n2),则 T1(n) * T2(n) = O(n3)。落实到具体的代码上,我们可以把乘法法则看成是嵌套循环 来源: https://www.cnblogs.com/QuestionsZhang/p/11788132.html

20182323 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结

给你一囗甜甜゛ 提交于 2019-12-03 10:12:27
目录 [toc] 学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结 教材学习内容总结 第12章 算法分析 什么叫做算法:是对特定问题求解方法,或者说是步骤的一种描述。 什么叫做好算法(具有以下标准): 正确性 可读性 健壮性 通用性 效率与储存空间需求 冰与火之歌:【时间】与【空间】复杂度 时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。 算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进复杂度,简称为时间复杂度。 其中f(n)是问题规模n的某个函数。这样用大写 O() 来体现算法时间复杂度的记法,我们称为大O记法 常见的时间复杂度如下图所示: 每个复杂度的时间比如下图所示: 第14章 栈 什么是栈:栈是一个有序集合,其中添加和删除元素都是发生在同一端,通常称作发生操作的这一端为顶部,对应的端为底部。(先进后出) 栈的操作: 利用栈完成后缀表达式的计算:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构

20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

泪湿孤枕 提交于 2019-12-03 10:08:26
目录 20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 评分标准 点评模板: 点评过的同学博客和代码 其他(感悟、思考等,可选) 学习进度条 参考资料 20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 · 时间复杂度:增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n) · 时间复杂度越低,程序运行效率越高。时间复杂度的计算可通过寻找运行次数最多的程序,计算他的运行次数,取n的最高次方的极数,即为程序的时间复杂度 · 栈可以理解为一类数据的集合,栈中的元素可以写入,也可以读出。元素存在先后次序。先入栈的先被读出。栈可用数组,链表两种形式实现。 · 有push,pop,peek,isempty,size等常用操作 · 链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node · 队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。 · 队尾(tail),队首(head),队列前端(front),队列末端

10月清北学堂培训 Day 7

末鹿安然 提交于 2019-12-03 09:25:18
今天是黄致焕老师的讲授~ 历年真题选讲 NOIP 2012 开车旅行 小 A 和小 B 决定外出旅行,他们将想去的城市从 1 到 n 编号,且编号较小的城市在编号较大的城市的西边。记城市 i 的海拔高度为 H i ,城市 i 和城市 j 之间的距离 d ( i , j ) 恰好是这两个城市海拔高度之差的绝对值,即 d ( i , j ) = | H i − H j | 。 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次 。他们计划选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行。小 B 总是沿着前进方向选择一个最近的城市作为目的地,而小 A 总是沿着前进方向选择第二近的城市作为目的地(注意:本题中如果当前城市到两个城市的距离相同,则认为离海拔低的那个城市更近)。如果其中任何一人无法按照自己的原则选择目的城市,或者到达目的地会使行驶的总距离超出 X 公里,他们就会结束旅行。 现在给定两个问题: 对于一个给定的 X = X 0 ,从哪一个城市出发,小 A 开车行驶的路程总数与小 B 行驶的路程总数的比值最小。如果从多个城市出发,小 A 开车行驶的路程总数与小 B 行驶的路程总数的比值都最小,则输出海拔最高的那个城市。 对任意给定的 X = X i 和出发城市 S i ,小 A 开车行驶的路程总数以及小 B 行驶的路程总数。

算法 -- o(1), o(n), o(logn), o(nlogn)

只谈情不闲聊 提交于 2019-12-03 09:06:10
描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。 再比如O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。 O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。 O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)

时间复杂度

家住魔仙堡 提交于 2019-12-03 07:44:34
  O后面的括号中有一个函数指明某个算法的耗时/耗空间与数据增长量之间的关系。其中n代表输入数据的量   O(1)-就是最低的时间复杂度     例子:哈希算法,无论数据规模多大,都可以在一次计算后找到目标(不考虑哈希冲突)   O(n)-代表数据量增大n倍,耗时也增大n倍(线性)     例子:找到一个数组里最大的数,需要把n个变量都扫一边,操作次数也为n   O(n^2)-代表数据量增大n倍时,耗时增大n^2倍     例子:冒泡排序-对n个数排序,需要扫描n^2次   O(log n)-当数据增大n倍时,耗时增大log n倍,(这里log是以2为底,当数据增大256倍,耗时只增大8倍)     例子:二分查找就是   O(n log n)-就是n乘以logn,当数据增大256倍时,耗时增大256*8 = 1028倍,这个复杂度高于线性低于平方     例子:归并排序 来源: https://www.cnblogs.com/huan30/p/11783645.html

第七周学习总结

半世苍凉 提交于 2019-12-03 06:42:41
学号 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 十二章在讲编程中的时间复杂度的概念,时间复杂度越低,程序运行效率越高。时间复杂度的计算可通过寻找运行次数最多的程序,计算他的运行次数,取n的最高次方的极数,即为程序的时间复杂度。 栈可以理解为一类数据的集合,栈中的元素可以写入,也可以读出。元素存在先后次序。先入栈的先被读出。栈可用数组,链表两种形式实现。应注意使用数组的实现链表时要注意数组大小,在push过程中可添加扩大数组大小的程序。这样的栈通过数组下表定义顺序。 栈实现的链表通过setnext来实现链接 泛型:通过泛型来定义类 class Box<T> 。可使栈使用更加灵活。栈中所存放的元素可通过使用时定义来实现。T即为战中存放数据的类型。如定义一个int型的栈 Box<Integer> num1 = new Box(); ,即栈中存放int型的变量。若要对栈中的元素进行操作需要定义int型变量,或者需要定义方法返回值为int时,都可使用T来代替。而声明该类的对对象时,应 Box<T> num1 来定义。 教材学习中的问题和解决过程 问题1:对泛型的理解不够深入。实例化时难以定义对象。 问题1解决方案:起初被 class Box<T> 迷惑,不会使用。经百度及课本查询,得知该类名与其他类名无异,只是可以使程序更加灵活。 问题2

算法理论基础

一曲冷凌霜 提交于 2019-12-03 04:24:39
定义: 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。 能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。 不同的算法可能用不同的时间、空间或效率来完成同样的任务。 一个算法的优劣可以用 空间复杂度与时间复杂度 来衡量。 算法的7个特性: 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性(Definiteness):算法的每一步骤必须有确切的定义; 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没 有输出的算法是毫无意义的; 可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性); 高效性(High efficiency):执行速度快,占用资源少; 健壮性(Robustness):对数据响应正确。 时间复杂度 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,时间复杂度常用大O符号(大O符号(Big O

20182334 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

坚强是说给别人听的谎言 提交于 2019-12-03 02:43:12
20182334 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 本周学习了栈的数组表达和链表表达和队列的数组表达和链表表达,无论是数组还是链表,都离不开一个接口,叫做ADT: public interface StackATD<T> { public void push(T element); public T pop(); public T peek(); public boolean isEmpty(); public int size(); public String toString(); } public interface List<T> { public void add( T element); public T delete(); public T first(); public boolean isEmpty(); public int size(); public String toString(); } 这两段代码起到中枢作用,承接栈的所有方法,也联系着测试代码。 同样在队列中也是如此,需要同样的接口。 栈相当于做电梯,先进的人后出,后进的人先出;队列就相当于我们一般的排队,先排的人先走,后排的人后走。 还学习了时间复杂度, 在我理解看来 ,时间复杂度就是观察代码中有几层循环,有几层循环就有几个n,最后得到结果。

eetCode刷题-递归篇

二次信任 提交于 2019-12-03 01:36:05
递归是算法学习中很基本也很常用的一种方法,但是对于初学者来说比较难以理解(PS:难点在于不断调用自身,产生多个返回值,理不清其返回值的具体顺序,以及最终的返回值到底是哪一个?)。因此,本文将选择LeetCode中一些比较经典的习题,通过简单测试实例,具体讲解递归的实现原理。本文要讲的内容包括以下几点: 理解递归的运行原理 求解递归算法的时间复杂度和空间复杂度 如何把递归用到解题中(寻找递推关系,或者递推公式) 记忆化操作 尾递归 剪枝操作 理解递归的运行原理 例1求解斐波那契数列 题目描述(题目序号:509,困难等级:简单): 求解代码(基础版): class Solution { public int fib(int N) { if(N <= 1) return N; return fib(N - 1) + fib(N - 2); } } 现在以N = 5为例,分析上述代码的运行原理,具体如下图: 递归的返回值很多,初学者很难理解最终的返回值是哪个,此时可以采用上图的方式画一个树形图,手动执行递归代码,树形图的叶节点即为递归的终止条件,树形图的根节点即为最终的返回值。树形图的所有节点个数即为递归程序得到最终返回值的总体运行次数,可以借此计算时间复杂度,这个问题会在后文讲解。 例2 二叉树的三种遍历方式 二叉树的遍历方式一般有四种:前序遍历、中序遍历、后序遍历和层次遍历