时间空间复杂度概述

找个时间写一写时间复杂度和一些问题分类,也普及一下这方面知识。

如何衡量一个算法好坏

很显然,最重要的两个指标:需要多久可以解决问题、解决问题耗费了多少资源

那我们首先说第一个问题,要多长时间来解决某个问题。那我们可以在电脑上真实的测试一下嘛,多种方法比一比,用时最少的就是最优的啦。

但是没必要,我们可以通过分析计算来确定一个方法的好坏,用O()表示,括号内填入N、1,等式子。

这到底是什么意思呢?

简单来说,就是这个方法,时间随着数据规模变化而增加的快慢。时间可以当成Y,数据规模是X,y=f(x),就这样而已。但是f(x)不是准确的,只是一个大致关系,y=10x,我们也视作x,因为他的增长速度还是n级别的。现在就可以理解了:一般O(N)就是对每个对象访问优先次数而已。请注意:O(1)它不是每个元素访问一次,而是Y=1的感觉,y不随x变化而变化,数据多大它的时间是不变的,有限的常数操作即可完成。

那我们就引入正规概念:

时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。

计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。

注意:文中提到:不包括这个函数的低阶项和首项系数。什么意思呢?就是说10n,100n,哪怕1000000000n,还是算做O(N),而低阶项是什么意思?不知大家有没有学高等数学1,里面有最高阶无穷大,就是这个意思。举个例子。比如y=n*n*n+n*n+n+1000

就算做o(n*n*n),因为增长速率最大,N*N及其它项增长速率慢,是低阶无穷大,n无限大时,忽略不计。

 

那接着写:o(n*n*n)的算法一定不如o(n)的算法吗?也不一定,因为之前说了,时间复杂度忽略了系数,什么意思?o(n)可以是10000000n,当n很小的时候,前者明显占优。

所以算法要视实际情况而定。

算法的时间 复杂度常见的有:
常数阶 O(1),对数阶 O(log n),线性阶 O(n),
线性对数阶 O(nlog n),平方阶 O(n^2),立方阶 O(n^3),…,
k 次方阶O(n^k),指数阶 O(2^n),阶乘阶 O(n!)。

常见的算法的时间 复杂度之间的关系为:
       O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(2^n)<O(n!)<O(n^n) 

 

我们在竞赛当中,看见一道题,第一件事就应该是根据数据量估计时间复杂度。

计算机计算速度可以视作10^9,如果数据量是10000,你的算法是O(N*N),那就很玄,10000*10000=10000 0000,别忘了还有常数项,这种算法只有操作比较简单才可能通过。你可以想一想O(nlog n)的算法一般就比较稳了。那数据量1000,一般O(N*N)就差不多了,数据量更小就可以用复杂度更高的算法。大概就这样估算。

 

当 n 很大时,指数阶算法和多项式阶算法在所需时间上非常
悬殊。因此,只要有人能将现有指数阶算法中的任何一个算法化
简为多项式阶算法,那就取得了一个伟大的成就。

体会一下:

 

空间复杂度也是一样,用来描述占空间的多少。

注意时间空间都不能炸。

所以才发明了那么多算法。

符上排序算法的时间空间表,体会一下:

 


排序博客:加深对时间空间复杂度理解

https://blog.csdn.net/hebtu666/article/details/81434236

 

 

相关扩展:https://blog.csdn.net/hebtu666/article/details/82465495

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树遍历算法总结

文章目录前提要素深度优先搜索DFS经典遍历算法前序遍历递归版迭代版中序遍历递归版迭代版后序遍历递归版迭代版Morris遍历算法中序遍历前序遍历后序遍历广度优先搜索BFS按层遍历参考资料前提要素 本文代码用Java实现。 //二叉树节点结构 public static class TreeNode {publi…

时间复杂度 P/NP/NPC

你会经常看到网上出现“这怎么做&#xff0c;这不是NP问题吗”、“这个只有搜了&#xff0c;这已经被证明是NP问题了”之类的话。你要知道&#xff0c;大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问…

kmp1-HDU1711 HDU1686 HDU2087 HDU3746

HDU 1711 kmp模板题 http://acm.hdu.edu.cn/showproblem.php?pid1711 #include<stdio.h> #include<string.h> #define N 1000005 int s[N]; int p[N]; int next[N]; int m,n; void getnext(){int j0,k-1;next[0]-1;while(j<m){if(k-1||p[j]p[k]){j;k;next[j]…

kmp2-HDU1358 HUST1010 POJ2406 POJ2752

HDU1358 http://acm.hdu.edu.cn/showproblem.php?pid1358 先构造出 next[] 数组&#xff0c;下标为 i&#xff0c;定义一个变量 j i - next[i] 就是next数组下标和下标对应值的差&#xff0c;如果这个差能整除下标 i&#xff0c;即 i%j0 ,则说明下标i之前的字符串&#xff0…

18暑期培训总结

暑假一共直播讲了七次课&#xff0c;每次一小时到一个半小时&#xff0c;前六次讲解python主要实用语法&#xff0c;最后一次讲了学习方法和简单基础的思想和算法。由于时间有限&#xff0c;不能做到很好&#xff0c;请见谅。 学院做题网站&#xff1a;橙白oj http://oj.acm-i…

第七次课 课上代码

时间空间复杂度&#xff08;例子&#xff1a;1-n求和&#xff09; 复杂度&#xff1a;https://blog.csdn.net/hebtu666/article/details/82463970 https://blog.csdn.net/hebtu666/article/details/82465495 二分 一个数组查找某个值1 2 3 5 6 7 8 9 10 15 20。。 查找11 …

数据结构课上笔记1

第一节课复习了c语言的一些知识&#xff0c;并简单介绍了数据结构这门课程。 1、引用和函数调用&#xff1a; 1.1引用&#xff1a;对一个数据建立一个“引用”&#xff0c;他的作用是为一个变量起一个别名。这是C对C语言的一个重要补充。 用法很简单&#xff1a; int a 5; …

并查集实现

并查集是什么东西&#xff1f; 它是用来管理元素分组情况的一种数据结构。 他可以高效进行两个操作&#xff1a; 查询a&#xff0c;b是否在同一组合并a和b所在的组 萌新可能不知所云&#xff0c;这个结构到底有什么用&#xff1f; 经分析&#xff0c;并查集效率之高超乎想象…

字符串上的简单动态规划

因为数据结构快学串了&#xff0c;以前又做过一些字符串dp的题&#xff0c;今天突然就想把它们写在一起吧。 直接开始 问题1&#xff1a;给两个字符串&#xff0c;求最长公共子串 问题2&#xff1a;给两个字符串&#xff0c;求最长公共子序列 问题3&#xff1a;给一个字符串…

线段树简单实现

首先&#xff0c;线段树是一棵满二叉树。&#xff08;每个节点要么有两个孩子&#xff0c;要么是深度相同的叶子节点&#xff09; 每个节点维护某个区间&#xff0c;根维护所有的。 如图&#xff0c;区间是二分父的区间。 当有n个元素&#xff0c;初始化需要o(n)时间&#xf…

树状数组实现

树状数组能够完成如下操作&#xff1a; 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意&#xff1a;有人觉得前缀和就行了&#xff0c;但是你还要维护啊&#xff0c;改变某个值&#xff0c;一个一个改变前缀和就是o(n)了。 线段树树状数组的题就是这样&#x…

数据结构课上笔记2

今天继续说明了一些基本概念&#xff0c;讲解了时间空间复杂度。 &#xff08;对于概念的掌握也很重要&#xff09; 元素之间的关系在计算机中有两种表示方法&#xff1a;顺序映像和非顺序映像&#xff0c;由此得到两种不同的储存结构&#xff1a; 顺序存储结构和链式存储结构…

双端单调队列

上次我们介绍了单调栈结构https://blog.csdn.net/hebtu666/article/details/82717317 这次介绍一种新的数据结构&#xff1a;双端队列&#xff1a;双端队列是指允许两端都可以进行入队和出队操作的队列&#xff0c;其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后…

KMP子字符串匹配算法学习笔记

文章目录学习资源什么是KMP什么是前缀表为什么一定要用前缀表如何计算前缀表前缀表有什么问题使用next数组来匹配放码过来构造next数组一、初始化二、处理前后缀不相同的情况三、处理前后缀相同的情况使用next数组来做匹配代码总览测试代码时间复杂度分析学习资源 字符串&…

数组实现队列

数组实现队列结构&#xff1a; 相对栈结构要难搞一些&#xff0c;队列的先进先出的&#xff0c;需要一个数组和三个变量&#xff0c;size记录已经进来了多少个元素&#xff0c;不需要其它萌新看不懂的知识。 触底反弹&#xff0c;头尾追逐的感觉。 循环使用数组。 具体解释…

栈/队列 互相模拟实现

用两个栈来实现一个队列&#xff0c;完成队列的Push和Pop操作。 队列中的元素为int类型。 思路&#xff1a;大概这么想&#xff1a;用一个辅助栈把进第一个栈的元素倒一下就好了。 比如进栈1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 第一个栈&#xff1a; 5 …

数据结构课上笔记3

这节课介绍了线性表结构和顺序表示的一部分内容。 操作太多&#xff0c;而且书上有&#xff0c;就不一一介绍分析了。 线性表定义&#xff1a;n个数据元素的有限序列。 特点&#xff1a; 存在唯一一个称作“第一个”的元素。存在唯一一个称作“最后一个”的元素除最后一个元…

内存分区

之前一直比较懵&#xff0c;想想还是单独写一个短篇来记录吧 一般内存主要分为&#xff1a;代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区这几个区域。 代码区&#xff1a;存放程序的代码&#xff0c;即CPU执行的机器指令&#xff0c;并且是只读的。 常…

栈的排序

一个栈中元素的类型为整型&#xff0c;现在想将该栈从顶到底按从大到小的顺序排序&#xff0c;只许申请一个栈。除此之外&#xff0c;可以申请新的变量&#xff0c;但是不能申请额外的数据结构&#xff0c;如何完成排序&#xff1f; 思路&#xff1a; 将要排序的栈记为stack,申…

双链表实现

以前写的不带头的单链表实现&#xff0c;当时也啥也没学&#xff0c;好多东西不知道&#xff0c;加上一心想压缩代码&#xff0c;减少情况&#xff0c;所以写得不太好。 请教了老师&#xff0c;首先是命名问题和代码紧凑性等的改进。还有可读性方面的改进&#xff0c;多写了一…