时间复杂度

时间复杂度趣图分析

冷暖自知 提交于 2019-11-27 18:14:01
正文: 时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和 大黄 同时加入了一个公司...... 一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是...... 由此可见,衡量代码的好坏,包括两个非常重要的指标: 1.运行时间; 2.占用空间。 基本操作执行次数 关于代码的基本操作执行次数,我们用四个生活中的场景,来做一下比喻: 场景1:给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天? 答案自然是 3 X 10 = 30天。 如果面包的长度是 N 寸呢? 此时吃掉整个面包,需要 3 X n = 3n 天。 如果用一个函数来表达这个相对时间,可以记作 T(n) = 3n。 场景2:给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢? 这个问题翻译一下,就是数字16不断地除以2,除几次以后的结果等于1?这里要涉及到数学当中的对数,以2位底,16的对数,可以简写为log16。 因此,把面包吃得只剩下1寸,需要 5 X log16 = 5 X 4 = 20 天。 如果面包的长度是 N 寸呢? 需要 5 X

一套图 搞懂“时间复杂度”

荒凉一梦 提交于 2019-11-27 18:13:40
一套图 搞懂“时间复杂度” https://blog.csdn.net/qq_41523096/article/details/82142747 写在前面: 这篇文章是在公众号: 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章,简介 清晰 明了。 所以拿来po出来 仅供学习交流,如侵则删。 现已将此文收录至: 《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理 正文: 时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司...... 一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是...... 由此可见,衡量代码的好坏,包括两个非常重要的指标: 1.运行时间; 2.占用空间。 基本操作执行次数 关于代码的基本操作执行次数,我们用四个生活中的场景,来做一下比喻: 场景1:给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天? 答案自然是 3 X 10 = 30天。 如果面包的长度是 N 寸呢? 此时吃掉整个面包,需要 3 X n = 3n 天。 如果用一个函数来表达这个相对时间,可以记作 T(n) = 3n。 场景2:给小灰一条长16寸的面包

一套图 搞懂“时间复杂度”

匆匆过客 提交于 2019-11-27 18:13:21
在 领扣 看算法题时接触到时间复杂度这个概念, 作为常在农村走 从未上过街的IT民工的我是第一次听说, 于是就有了下面的这篇转载文章. 本文转自: https://blog.csdn.net/qq_41523096/article/details/82142747 写在前面: 这篇文章是在公众号: 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章,简介 清晰 明了。 所以拿来po出来 仅供学习交流,如侵则删。 现已将此文收录至: 《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理 正文: 时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司...... 一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是...... 由此可见,衡量代码的好坏,包括两个非常重要的指标: 1.运行时间; 2.占用空间。 基本操作执行次数 关于代码的基本操作执行次数,我们用四个生活中的场景,来做一下比喻: 场景1:给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天? 答案自然是 3 X 10 = 30天。 如果面包的长度是 N 寸呢? 此时吃掉整个面包,需要 3 X n = 3n 天。

trie上构建后缀数组

穿精又带淫゛_ 提交于 2019-11-27 18:07:46
例题: 往事太多,有时候忘了就忘了吧。 如果有非记不可的,就只能用点附加手段啦! 我们定义一棵往事树是一个 n 个点 n-1 条边的有向无环图,点编号为 1到 n,其中 1 号点被称为是根结点,除根结点以外, 每个点都恰有一条出边(即以其作为起点的边)。 每条边上有 1 个字符(这里我们实际上用一个不大于 300的非负整数代表不同的字符), 对于任意一个点 u,u 的所有入边(即以其为终点的边)上的字符互不相同。 接下来我们定义往事,点 u 对应的往事为 u 到根的路径(显然有且只有一条)上的所有边按照从 u 到根经过的顺序排序后边上的字符依次拼接形成的字符串,简记为 r(u)。 一棵往事树的联系度取决于它包含的所有往事之中最相近的一对的相似度。具体的,我们定义 2 个点 u 和点 v 对应的往事的相似度 f(u,v)如下。 \(f(u,v)=Lcp(r(u),r(v))+Lcs(r(u),r(v))\) 其中 Lcp(a,b)表示字符串 a 和 b 的最长公共前缀的长度, Lcs(a,b)表示字符串a 和 b 的最长公共后缀的长度。 定义一棵往事树的联系度为所有满足 1<=u<v<=n 的 f(u,v)的最大值。 现在,给出一棵往事树,请你给出这棵往事树的联系度。 题解: 首先,将所有r(u)排序,这样,lcp就是相邻的r(u)的lcp的RMQ。(原理同后缀数组) 所以

洛谷P3952 时间复杂度

别等时光非礼了梦想. 提交于 2019-11-27 16:47:59
明显一道模拟题,没有特别的算法,就是考验耐心。 输入: //将数字记为k 分成三种: k O(n^k) F i x y E 第二种由于不会出现以变量作为x,y的值,如: F i 1 n F j i+1 n 则没有必要保存各个变量的值。 对于时间复杂度: F i k k = F i n k = O(1) 只有 F i k n = O(n) 则也没有必要保存k的值,只须关注x,y是否等于n和循环成立即可。 剩下的就是简单的模拟。 代码: #include<iostream> #include<stack> #include<cstring> using namespace std; stack<bool> q; char st[105]; bool fnd(char a); void mfnd(); int main() { string inERR,ai,aj; int ans,t,i,j,k,kline,now,nans,fans,zERR,reERR; char a; bool ERR; cin>>t; for(int o=1;o<=t;o++) { memset(st,0,sizeof(st)); ERR=0; now=0; nans=0; fans=0; zERR=0; reERR=0; cin>>kline>>a>>a>>a; if(a=='1')//ans=0 O(1)

网络流初步

一个人想着一个人 提交于 2019-11-27 15:56:24
其实网络流很久之前已经学过,但是因为一些原因搁置了很久,于是想再系统地复习一下. 由于博主能力有限,所以关于网络流知识也是了解个大概,这里只是简单介绍,并且说一下博主的 感性理解 最大流   EK増广路算法     很容易理解的一个算法,也就是我们不断地bfs找出一条増广路然后更新剩余容量,直到更新完毕,类似于SPFA做法.时间复杂度$O(nm^{2})$;     这里不再附上代码,因为后面的费用流就要用EK+SPFA,而只是求最大流,推荐Dinic.   Dinic算法     与EK不同的是,Dinic算法增加了一些优化,这里引进了深度这个概念,通过在同一深度图中増广,一个点可以向多个点进行多流増广,并有减枝;     于是Dinic就可以达到$O(n^{2}m)$的优秀时间复杂度,可以代替匈牙利算法跑二分图匹配,时间复杂度$O(n\sqrt{n})$;     PS:关于二分图匹配时间复杂度可以这么想,由于一个点多流推进,同时増广多个点,而且深度小,所以时间复杂度就十分优秀;     Code:      #include<bits/stdc++.h> #define maxn 10008 using namespace std; int n,m,head[maxn],s,t,cent=1,d[maxn],maxflow; int min(int a,int b)

时间复杂度

对着背影说爱祢 提交于 2019-11-27 15:56:13
时间复杂度 题目 【题目描述】 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦! 下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。 A++语言的循环结构如下: F i x y 循环体 E 其中 F i x y 表示新建变量 i (变量 i 不可与未被销毁的变量重名)并初始化为 x, 然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环,否则不进入。 每次循环结束后 i i都会被修改成 i + 1,一旦 i 大于 y终止循环。 x 和 y 可以是正整数( x 和 y 的大小关系不定)或变量 n。 n 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 1 0 0。 “E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。 注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。 【输入格式】 输入文件第一行一个正整数 t ,表示有 t ( t ≤ 1 0)个程序需要计算时间复杂度。每个程序我们只需抽取其中 F i x y 和 E 即可计算时间复杂度。注意:循环结构 允许嵌套。 接下来每个程序的第一行包含一个正整数 L 和一个字符串, L 代表程序行数

数据结构与算法分析(四)链表

一个人想着一个人 提交于 2019-11-27 15:18:02
一、什么是链表? 1.和数组一样,链表也是一种线性表。 2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。 3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。 二、为什么使用链表?即链表的特点 1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n)级别(需要从链头至链尾进行遍历)。 2.和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。 三、常用链表:单链表、循环链表和双向链表 1.单链表 1)每个节点只包含一个指针,即后继指针。 2)单链表有两个特殊的节点,即首节点和尾节点。为什么特殊?用首节点地址表示整条链表,尾节点的后继指针指向空地址null。 3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。 2.循环链表 1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。 2)适用于存储有循环特点的数据,比如约瑟夫问题。 3.双向链表 1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。 2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。 3)性能特点: 和单链表相比,存储相同的数据

C++算法之——常用算法总结

泄露秘密 提交于 2019-11-27 14:25:43
http://blog.sina.com.cn/s/blog_61bebe480100v7c7.html 基本的C++算法分为三类:排序算法、树算法、图算法 算法思想有三种:递推、分治、动态规划 以及 贪心算法。 本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。 一、排序算法 1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑 比较次数、数据交换次数) 冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间 选择排序:一般针对数组、本地排序、需要交换数据。O(1)的额外空间 插入排序:可以是针对数组的本地排序,此时需要移动大片数据,但是比较次数是O(N*logN)。如果是针对链表,比较次数是O(N^2),但是不需要交换数据。 注意:一般排序都是针对数组的本地排序,数组与链表相比,可以随机访问,空间使用效率更高(链表需要存放指针),而链表一般对于插入与删除操作有更好的性能。 2. O(N*logN)算法 快速排序:针对数组的本地排序,时间复杂度平均O(N*logN),最坏时O(N^2)。空间复杂度O(1) 归并排序:可以针对数组,也可以针对链表。针对数组时时间复杂度为O(N*logN),空间复杂度为O(N) 3. 堆排序 1991年计算机先驱奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 (Robert W.Floyd)和威廉姆斯(J

算法与时间复杂度

柔情痞子 提交于 2019-11-27 14:11:19
   算法 (Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰 指令 ,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的 输入 ,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用 空间复杂度 与 时间复杂度 来衡量。   算法特征:   一个算法应该具有以下五个重要的特征:    (1)有穷性 (Finiteness)       算法的有穷性是指算法必须能在执行有限个步骤之后终止;    (2)确切性 (Definiteness)       算法的每一步骤必须有确切的定义;    (3)输入项 (Input)       一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;    (4)输出项 (Output)       一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;    (5)可行性 (Effectiveness)       算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。 要素   一、数据对象的运算和操作