时间复杂度

#4616. 时间复杂度

我怕爱的太早我们不能终老 提交于 2019-12-03 15:12:18
题目描述 在你的帮助下,小凯成功找到了宝藏价值最大的方案。接下来他在闲逛时被一个游戏机吸引了。 游戏机中共有 $n$ 个带颜色的小球,第 $i$ 个小球的颜色是 $a_i$ 。小凯需要选出一个区间(假设长度为 $l$),满足对于任意颜色的小球: - 要么在这个区间中出现 $0$次(即不出现); - 要么在这个区间中出现次数 $\ge b_l$。 其中 $b_l$ 是一个给定的数组,且满足对于任意 $i<j$ 有 $b_i \ge b_j$。如果最终小凯选出的区间越长,获得的奖励就越大。 小凯想用 OI 知识解决这个问题,但是由于水平问题,他只会 $O(n^3)$ ,而游戏机中的球非常多。因此他又来厚颜无耻地找你,希望你能帮他优化时间复杂度,解决这个问题。 即求出,最长满足要求的区间长度是多少。特别的,若问题无解,输出 $0$ 。 数据范围 对于 100% 的数据, $n \le 10^6, 0 \le a_i \le n, 1 \le b_i \le n+1$, 且满足对于任意,$i < j$ 有 $b_i \ge b_j$ 题解 考场只会暴力选手 考虑到一个区间如果不合法,那么这个区间的子区间可能成为合法答案当且仅当这个子区间不包含这个区间内颜色出现次数小于 $b$ 的颜色 基于这个思想,我们可以进行启发式分裂。对于 $[L,R]$ ,拿 $l$ 指针从左到右扫描, $r$

时间复杂度-算法评价的标准

为君一笑 提交于 2019-12-03 13:37:20
前言:算法,一直是每个程序员的心病,确是程序的核心,很多人觉得算法很难,没错,但是世界上真的有很难的事情吗?如果不去尝试,只去抱怨,不去尝试,我觉得可能一辈子也就只能当一名普通的程序员了。有一句老话说的挺好,成功的人遇到一个难题,第一反应是想着怎么解决它,而不是先担心不会做,做不懂,如果不迈出第一步,后面只会更加难过。博主是个多愁善感的程序猿,不过我觉得有些东西,不该逃避的绝对不能去逃避。只有勇于面对困难,才能真正去战胜它,哈哈,感觉有点像心灵鸡汤了,好吧,开始我的初级算法学习之路了。 一、算法好坏的判别标准: 1.1 时间复杂度 无论是什么东西,总有一个判别的标准,算法也是,并不是说你说这个算法好就好,界内是有一个专门的标准的,在保证算法的准确性后,这个判别标准就是算法的时间复杂度,学过数据结构的同学不会对此陌生,评价一个算法流程的好坏,是先看时间复杂度的指标,我们在然后再分析不同数据样本下的实际运行时间,也就是常数项时间。 通常我们一般使用O(读作big 欧 )来表示,具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分,如果记为f(N),那么时间复杂度为O(f(N))。 下面我用上家公司的一道面试算法题来大致说明: 题目大致是:有两个已排序的数组,分别是N=[ 1,2,4,5,6,7] M=[ 2,3,5,6,9,12,15,17]

算法和算法的评价

不羁的心 提交于 2019-12-03 13:36:12
》》算法的基本概念: 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中 每一条指令表示一个或多个操作。此外,一个算法还具有下列5个重要的 特性。 (1)、有穷性 一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束, 且每一步都可在有穷时间内完成。 (2)、确定性 算法中每一条指令必须有明确的含义,读者理解时不会产生二义性。 即对于相同的输入只能得到相同的输出。 (3)、可行性 一个算法是可行的,即算法中描述的操作都是可以通过已经实现的 基本运算执行有限次来实现的。 (4)、输入 一个算法有零个或多个的输入,这些输入取自于某个特定的对象的 集合。 (5)、输出 一个算法有一个或多个的输出,这些输出是同输入有着某种特定关系 的量。 --------------------------- 通常设计一个“好”的算法应考虑达到以下目标: (1)正确性:算法应当能够正确地解决求解问题。 (2)可读性:算法应当具有良好的可读性,以助于人们理解。 (3)健壮性:当输入非法数据时,算法也能适当地做出反应或进行处理, 而不会产生莫名其妙的输出结果 (4)效率与低存储量需求:效率是指算法执行的时间,存储量需求是指 算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。 --------------------------- 》》算法效率的度量: 算法效率的度量是通过

【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨

萝らか妹 提交于 2019-12-03 13:35:04
引文 我有个 朋友 有算法强迫症,每次一看到别人写的算法,就有上去改的冲动,不然就会偏头疼,主要症结在于他认为别人写的算法不好,但是什么的算法可以评判为好,什么样的算法可以评判为不好?最近为了治愈他,我特地写了这篇文章。 算法的衡量从两个方向出发:时间复杂度和空间复杂度。本文主要是不讲具体算法,只将算法的衡量,重点讲解如何衡量算法的复杂度,解决平时见到的XX算法时间复杂是 O ( log n ) O(logn) ,其中这个结果是怎么推导出来的? log n logn 是个什么玩意儿?,大写的 O O 是什么意思?为什么用这个符号表示等类似问题。 在开始讲解复杂度之前我们先因为一个数学概念Big O notation Big O notation Big O notation是一种描述述函数渐进行为的理论,又被称作Landau’s symbol,其实这部分是高数中的概念。用于表述一个函数增长的多快或者减少的多快。(重点描述加速度),在计算机领域,Big O notation常常用来表达算法时间复杂度和性能的术语,一个算法在执行过程中需要的最大时间或者最大空间。 那么为什么要用O来表示呢? 大O符号是由德国数论学家保罗·巴赫曼(Paul Bachmann)在其1892年的著作《解析数论》(Analytische Zahlentheorie)首先引入的

[算法]什么算法?怎么衡量算法的好坏?

雨燕双飞 提交于 2019-12-03 13:34:13
一 什么是算法? 在计算机领域中,算法是一系列的程序指令,用于处理特定的运算和逻辑问题. 衡量算法的好坏主要的指标是时间复杂度和空间复杂度 二 怎么衡量算法的优劣? 2.1时间复杂度 时间复杂度可以理解为,算法执行的基本次数,是对算法运行时间长短的衡量,但仅仅这么认为是不正确的,还需要符合以下规则: 如果运行时间是常数级,则用常数O(1)来表示 只保留时间函数中的最高阶项 如果最高阶项存在,则省略最高限项系数去掉 eg: T(n) = 3n =>时间复杂度 O(n) T(n)=3n^2 => 时间复杂度 O(n^2) 常见的时间复杂度按照由低到高 O(1)<O(logN)<O(n)<O(nlogN)<O(n^2) 2.2空间复杂度 空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的衡量. 其中递归算法的空间复杂度和递归深度成正比. 三 什么是数据结构 数据结构是数据的组织,管理和存储格式,其使用目的是为了高效的访问和修改数据. 数据结构包含数组,链表这样的线性结构,包含树,图这样的复杂数据结构 来源: CSDN 作者: 菜鸟腾飞 链接: https://blog.csdn.net/drdongshiye/article/details/95808054

算法基础——算法优劣的衡量

陌路散爱 提交于 2019-12-03 13:31:44
针对一个问题可以有多种的算法方法来解决问题,当然我们最喜欢的还是简单的、高效的方法。如何衡量算法的好坏,是学习算法的重要基础。 最初,用所需要的计算时间来衡量一个算法的好坏 但不同的机器相互之间无法比较 需要用独立于具体计算机的客观衡量标准 1.问题的规模 2.基本运算 3.算法的计算量函数 问题的规模 输入数据量的测度(一般是n来表示) 基本运算 解决给定问题时占支配地位的运算(一般一种、偶尔两种) 计算量函数 用问题规模的某个函数来表示算法的基本 运算量,这个表示基本运算量的函数称为算 法的时间复杂性(度)。时间复杂度用用T(n)(或T(n,m)等)来表示。 重点概念: 渐进时间复杂度 当问题的规模趋于极限情形时的时间复杂度的表示 3种记号 1. O(f(n))表示算法时间复杂度的上界 定义为:若存在c > 0,和正整数n0≥1,使得当n≥n0时,总有 T(n)≤c*f(n) 。 2. Ω(f(n)) 表示算法时间复杂度的下界 定义为:若存在c > 0,和正整数n0≥1,使得当n≥n0时,存在无穷多个n ,使得T(n)≥c*f(n)成立。 3. Θ(f(n)) 表示算法时间复杂度的确界 定义为:若存在c1,c2>0,和正整数n0≥1,使得当n≥n0时,总 有 T(n)≤c1*f(n),且有无穷多个n,使得T(n)≥c2*f(n) 成立,即:T(n)= O(f(n))与T(n)

算法性能评价

南笙酒味 提交于 2019-12-03 13:31:05
1、首先,什么是算法,算法就是解决问题的一般步骤,然后又为什么需要算法,那就是因为问题的引入。 其次,解决问题的方式方法有好坏之分,因此算法也就有好坏之分。算法性能的好坏并不会因为选取的语言的不同的而存在出入。 再而,引入评价算法性能的方式,也就是时间复杂度和空间复杂度。 时间复杂度:对于学过数据结构的人都会知道有那么一张关于量级的时间复杂度的表,那么讨论算法时间复杂度也就是看属于那个量级,但是这个又是用什么来衡量的呢。那么我 们就需要知道核心代码的执行次数,然后再对应表。 空间复杂度:一般情况下只是去看是否有借助外部存储。 最后:所有的算法性能的评价都是要建立在你能够把实际问题转化为计算机语言来实现,如果无法实现那么一切都是徒劳。 2、关于解决算法题 首先:遇到题目先看题目属于哪一类问题,是动态规划还是其他别的类型,想要解决这个题目需要选取什么样的存储结构,然后看是否能把问题转化成计算机问题,进行模拟。 其次:如果确定了解决的类型那么解决的方式无非就是对这些结构进行操作。 再而:就是回到1的问题上来了。 3、对于考研的学生特别是考408的人而且题量并不会允许你去想怎么把算法写的完美,那么现在就出现了暴力解决的方式,也就是用笨办法。 来源: CSDN 作者: 固执的鱼 链接: https://blog.csdn.net/ChaXinZuoWang/article/details

如何评价一个算法的好坏

。_饼干妹妹 提交于 2019-12-03 13:30:36
首先,这个算法必须是正确的 其次,好的算法应该是友好的,便于人们理解和交流,并且是机器可执行的。 这个算法还需要足够健壮,即当输入的数据非法或不合理时,也能适当的做出正确的反应或进行相应的处理 最后它还必须拥有高效率和低存储量要求。 也就是所谓的 时间复杂度 和 空间复杂度 1. 时间复杂度 定义:在计算机科学中,算法的时间复杂度是一个函数,他定量描述了该算法的运行时间.一个算法执行所耗费的时间,从理论上讲,只有你把你的程序放机器上跑起来,才能知道.然而我们有一套时间复杂度的分析方式.一个算法所花费的时间与其中语句的执行次数成正比例.算法中的基本操作的执行次数,为算法的时间复杂度. 2.时间复杂度为什么不使用时间来衡量而使用基本语句的 运行次数来衡量 ? 算法的执行时间依赖于具体的软硬件环境,所以,不能用执行时间的长短来衡量算法的时间复杂度,而要通过基本语句执行次数的数量级来衡量。 3.时间复杂度的 O渐进表示法 (Big O notation) 是用于描述函数渐进行为的数学符号. 大O阶方法推导: 计算基本语句的执行次数的数量级;  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。  如果算法中包含嵌套的循环

POJ2185 Milking Grid 题解 KMP算法

余生颓废 提交于 2019-12-03 11:41:36
题目链接: http://poj.org/problem?id=2185 题目大意:求一个二维的字符串矩阵的最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵。 题目分析:next函数的应用。需要枚举每一行每一列的字符串所对应的的 \(nxt[]\) 值,然后通过分析计算出最小的宽和最小的高。 具体分析 参考链接: https://blog.csdn.net/u013686535/article/details/52197467 一看这题,容易想出一种很直观的做法:求出每一行的最小重复串长度,取所有行的最小重复串长度的lcm为宽;对列也同样操作求出高。这种想法虽然很直观,但是否正确呢? 事实上,这种算法并不是正确的。如下面的这个反例: 2 8 ABCDEFAB AAAABAAA 对于这个例子:第一行为6,第二行为5,6与5的最小公倍数为30,大于8则取8为宽,但明显是错误的。 但由于poj的测试数据太弱,以致使用这种方法的程序也可以通过。 下面介绍一下正解的做法。 首先是确定宽度:我们分别求出每行所有可能的重复子串长度,例如对于aaaa就有1、2、3和4,然后取每行都有的重复子串长度中最小的作为宽。 例如,对于上面的例子,第一行的重复子串长度只可能是6或8(显然整个串为一个重复子串也是可以的),第二行则可能是5、6、7或8,那么取它们都有的6和8当中最小值6

考试流程

梦想与她 提交于 2019-12-03 11:37:46
先T1,T1不会的情况下: 20~30分钟没一点思路的话打完暴力直接走。 然后T2T3综合暴力分数和代码复杂度。就算想到正解大概,代码工业的话也先放一放。 然后回去考虑T1。 注意平稳心态。尝试简单角度,找性质,打表,猜性质,猜简单做法。 难题要随机化,但是不要在这上浪费过多时间。 注意检查复杂度是否会假。 不确定的细节题一定要对拍。 来源: https://www.cnblogs.com/seamtn/p/11794251.html