时间复杂度

AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)

假如想象 提交于 2020-02-06 09:33:06
题目链接 https://atcoder.jp/contests/agc039/tasks/agc039_f 题解 又是很简单的F题我不会。。。 考虑先给每行每列钦定一个最小值 \(a_i,b_j\) ,并假设每行每列的最小值是这个数,且每行每列只需要放 \(\ge\) 这个数的数即可,那么这种情况的价值是 \(\prod^n_{i=1}\prod^m_{j=1}\min(a_i,b_j)\) , 方案数是 \(\prod^n_{i=1}\prod^m_{j=1}(n+1-\max(a_i,b_j))\) 然后我们需要把最小值的限制容斥掉,也就是枚举若干行若干列容斥掉(限制 \(+1\) 同时系数乘以 \(-1\) )。 这样的话直接暴力DP就可以解决。设 \(f[k][i][j]\) 表示当前用 \([1,k]\) 中的数填满了 \(i\) 行 \(j\) 列。转移可以直接枚举不被容斥的行数、不被容斥的列数、容斥的行数、容斥的列数,乘上贡献系数,得到了一个多项式时间复杂度的算法。 但是我们发现这样转移显然很浪费,我们可以把四个变量同时枚举改成分四个阶段依次枚举,这样转移时间复杂度降到了 \(O(n)\) .(注意因为要保证从小到大填数,所以必须先枚举不被容斥再枚举被容斥) 不过这题还挺卡常的……需要 \(O(n^3)\) 预处理一下转移系数,详见代码 时间复杂度 \(O(n^4)

软考难点—算法时间的复杂度

本秂侑毒 提交于 2020-02-06 05:58:46
推导大O阶的方法 1、用常熟1取代运行时间中的所有加法常数。 2、在修改后的运行次数函数中,只保留最高阶项。 3、如果最高阶项存在且不为1,则去除与这个项相乘的常数。 应用: ①常数阶 int sum=0,n=1000; sum=(1+n)*n/2; printf("%d",sum);   以上是顺序结构的时间复杂度,这个算法的运行次数函数是f(n)=3。根据上面的方法,第一部就是把常数改成1,。在保留最高阶时发现,它根本没有最高阶项,所以它的时间复杂度是O(1)。   对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变化而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。 ②线性阶 要分析算法的复杂度,关键就是要分析循环结构的运行情况。 int i; for(i=0;i<n;i++) { /*时间复杂度为O(1)的程序步骤序列*/ } 上面的代码,它的时间复杂度是O(n),因为循环体中的代码需要执行n次。 ③对数阶 int count=1; while (count < n) { count=count * 2; /*时间复杂度为O(1)的程序步骤序列*/ }   由于每次count乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。又2 x =n 得到x=log 2 n。所以找个循环的时间复杂度为O

数据结构之算法时间复杂度

半城伤御伤魂 提交于 2020-02-06 05:30:39
原文链接 算法的时间复杂度定义为: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n}=0(f(n))。它表示随问题规模n的增大,算法执行时间的埔长率和 f(n)的埔长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f( n)是问题规横n的某个函数。 根据定义,求解算法的时间复杂度的具体步骤是: 找出算法中的基本语句   算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。 计算基本语句的执行次数的数量级   只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。 用大Ο记号表示算法的时间性能   将基本语句执行次数的数量级放入大Ο记号中。 如何推导大o阶呢?我们给出了下面 的推导方法: 1.用常数1取代运行时间中的所有加法常数。 2.在修改后的运行次数函数中,只保留最髙阶项。 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 简单的说,就是保留求出次数的最高次幂,并且把系数去掉。 如T(n)=2n^2+n+1 =O(n^2) 例如: #include "stdio.h" int main

时间复杂度+常见复杂度解释

廉价感情. 提交于 2020-02-06 04:59:00
--------------------- 作者:CrankZ 来源:CSDN 原文:https://blog.csdn.net/CrankZ/article/details/84726408 版权声明:本文为博主原创文章,转载请附上博文链接! 前言 算法的效率 虽然计算机能快速的完成运算处理,但实际上,它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源。要想编写出能高效运行的程序,我们就需要考虑到算法的效率。 算法的效率主要由以下两个复杂度来评估: 时间复杂度 :评估执行程序所需的时间。可以估算出程序对处理器的使用程度。 空间复杂度 :评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。 设计算法时,一般是要先考虑系统环境,然后权衡时间复杂度和空间复杂度,选取一个平衡点。不过,时间复杂度要比空间复杂度更容易产生问题,因此算法研究的主要也是时间复杂度,不特别说明的情况下,复杂度就是指时间复杂度。 本文只分析时间复杂度 什么是时间复杂度 了解时间复杂度之前,先了解时间频度 时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多

时间复杂度问题

。_饼干妹妹 提交于 2020-02-06 04:54:48
推导“大O阶”的步骤: 1、用常数 1 取代运行时间中的所有加法常数。 2、在修改后的运行次数函数中,只保留最高阶项。 3、如果最高阶项存在且不是 1 ,则去除与这个项相乘的常数。 下面我们在通过一个有不少 for 循环的例子按照上面给出的推导“大O阶”的方法来计算一下算法的时间复杂度。先看一下下面的这个例子的代码,也是用 C 语言写的,在注释上我们仍然对执行次数进行说明。 int n = 100000; //执行了 1 次 for (int i = 0; i < n; i++) { //执行了 n + 1 次 for (int j = 0; j < n; j++) { //执行了 n*(n+1) 次 printf("i = %d, j = %d\n", i, j); //执行了 n*n 次 } } for (int i = 0; i < n; i++) { //执行了 n + 1 次 printf("i = %d", i); //执行了 n 次 } printf("Done"); //执行了 1 次 上面的代码严格的说不能称之为一个算法,毕竟它很“无聊而且莫名其妙”(毕竟算法是为了解决问题而设计的嘛),先不论这个“算法”能解决什么问题,我们看一下它的“大O阶”如何推导,还是先计算一下它的执行总次数: 执行总次数 = 1 + (n + 1) + n*(n + 1) + n*n +

时间复杂度 空间复杂度

て烟熏妆下的殇ゞ 提交于 2020-02-06 04:53:54
时间复杂度 在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是 渐近的 ,亦即考察 输入值大小趋近无穷时的情况 。例如,如果一个算法对于任何大小为 n (必须比 n0 大)的输入,它至多需要 5n3 + 3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n3)。 为了计算时间复杂度,我们通常会估计算法的操作单元数量,每个单元运行的时间都是相同的。因此,总运行时间和算法的操作单元数量最多相差一个常量系数。相同大小的不同输入值仍可能造成算法的运行时间不同,因此我们 通常使用算法的最坏情况复杂度 ,记为 T(n),定义为任何大小的输入n所需的最大运行时间。另一种较少使用的方法是平均情况复杂度,通常有特别指定才会使用。时间复杂度可以用函数 T(n)的自然特性加以分类。 在进行算法分析时,语句总的 执行次数T(n) 是关于 问题规模n的函数 ,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和 f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f( n)是问题规横n的某个函数。 "O

【Python数据结构与算法复习day40】1-04常见时间复杂度与大小关系常见时间复杂度之间的关系+常见时间复杂度之间的关系(必背)+n的阶层的时间复杂度比n的n次方的时间复杂度低

眉间皱痕 提交于 2020-02-06 04:16:24
1-04常见时间复杂度与大小关系 文章目录 1-04常见时间复杂度与大小关系 常见的时间复杂度 常见时间复杂度之间的关系 练习: 时间复杂度练习( 参考算法的效率规则判断 ) 解答 常见的时间复杂度 注意,经常将log2n(以 2 为底的对数)简写成logn 常见时间复杂度之间的关系 所消耗的时间从小到大:【必背!!!!!!】 练习: 时间复杂度练习( 参考算法的效率规则判断 ) O(5) O(2n + 1) O(n²+ n + 1) O(3n³+1) 解答 O(5)=O(1) O(2n + 1)=O(n) O(n²+ n + 1)=O(n²) O(3n³+1)=O(n³) 所以 O(5)<O(2n + 1)<O(n²+ n + 1)<O(3n³+1) 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104185928

数据结构与算法概念

扶醉桌前 提交于 2020-02-06 00:27:49
数据结构小白入门 数据结构指一组相互之间存在一种或多种特定关系的数据元素的集合, 当我们需要在计算机中存储这些数据时,还涉及到数据的,组织方式,在计算机中的存储方式,以及定义在该数据上的一组操作; 一组数据相互之间有某种关系 组织方式 存储方式 以及可对其进行的一组操作 理解: 我们学习的最终目的是要在计算机中存储 一组数据 ,但是不得不先考虑数据的 组织方式 ,在计算机中的 存储方式 ,以及可以对这些数据进行的 一组操作 ,当然了既然是一组数据必然表明了这写数据之间是存在想换的关联关系的;关系可能还会有多种; 例如: 一组数据:12345 组织方式:从小到大 存储方式:可使用线性存储结构 操作:要取出最大的一个 数据结构研究方向 问题: 机外处理 处理要求 建模: 逻辑结构 基本运算 实现: 存储结构 算法 基本术语 数据(Data): ​ 所有能被计算机处理的符号的集合 数据元素(DataElement): ​ 是数据集合中的一个 个体,即数据的基本单位 数据项(DataItem): ​ 数据元素常常可分为若干个数据项,数据项是数据具有意义的最小单位 组织数据的三个层次: 数据(表)->数据元素(行)->数据项(字段) 实际问题中的数据成为原始数据 逻辑结构(LogicalStructure) ​ 数据元素之间的结构关系,如从小到大/一对一/一对多 物理结构

HOJ 1301 Jungle Roads (最小生成树)

霸气de小男生 提交于 2020-02-06 00:05:52
本题只是输入看起来比较复杂,细心一点处理好就可以了。 用三个一维数组代替二维数组存储边,降低时间复杂度。 # include <iostream> # include <cstring> using namespace std ; const int N = 30 , NN = 80 , INF = 99999999 ; int c1 [ NN ] , c2 [ NN ] , c3 [ NN ] , f [ N ] ; //三个一维数组代替二位数组存储数据,降低时间复杂度 int find ( int x ) { //寻找根节点 if ( x == f [ x ] ) return x ; f [ x ] = find ( f [ x ] ) ; return f [ x ] ; } int mer ( int x , int y ) { //将x和y所在的两个集合合并 x = find ( x ) ; y = find ( y ) ; if ( x != y ) f [ x ] = y ; return 1 ; } int main ( ) { int n , x , y , k , num , sum ; char xx , yy ; while ( cin >> n && n ) { num = 0 ; sum = 0 ; memset ( c1 , 0 , sizeof (

Python之路:常用算法与设计模式

好久不见. 提交于 2020-02-05 07:19:28
选择排序 时间复杂度 二、计算方法 1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。 一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 2.一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))。随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n))。 3.常见的时间复杂度 按数量级递增排列,常见的时间复杂度有: 常数阶O(1), 对数阶O(log2n), 线性阶O(n), 线性对数阶O(nlog2n), 平方阶O(n^2), 立方阶O(n^3),..., k次方阶O(n^k), 指数阶O(2