复杂度

洛谷 P4396 [AHOI2013]作业(莫队 + 分块 + 根号均摊)

耗尽温柔 提交于 2020-01-27 21:54:18
很显然有一个莫队套树状数组的做法, 因为树状数组更新和查询的复杂度都是 log ⁡ n \log n lo g n ,复杂度是 n m log ⁡ n n \sqrt m \log n n m ​ lo g n 通过学习了解到分块数据结构可以做到 O ( 1 ) O(1) O ( 1 ) 查询, O ( n ) O(\sqrt n) O ( n ​ ) 更新 与 O ( n ) O(\sqrt n) O ( n ​ ) 查询, O ( 1 ) O(1) O ( 1 ) 更新的平衡。 由于 查询是 1 0 6 10^6 1 0 6 级别,通过分块数据结构 和 根号平衡在莫队中更新可以做到 O ( 1 ) O(1) O ( 1 ) ,总体复杂度为 O ( m n + n m ) O(m\sqrt n + n \sqrt m) O ( m n ​ + n m ​ ) ,理论上限大约为 3 ∗ 1 0 8 3*10^8 3 ∗ 1 0 8 左右 做法是对权值分块,维护块内数字出现的次数和以及不同数字的个数。 详细见代码: # include <bits/stdc++.h> using namespace std ; const int maxn = 1e6 + 10 ; int n , m , a [ maxn ] , block , cnt [ maxn ] ; int ans [

算法-复杂度分析

£可爱£侵袭症+ 提交于 2020-01-27 01:39:08
背景 首先呢,我们讲一下今天我们要说的:算法复杂度分析——背景。 继续讲下我们在面试的过程中被面试官问道算法时,肯定会问到你算法复杂度,例如:时间复杂度,空间复杂度。 有没有更好的算法,来处理某一个业务场景遇到的瓶颈? 以上这些都是我们会经常碰到的问题。 为什么讨论算法的复杂度? 算法两个主要方面 正确:算法功能与问题要求一致? 成本:运行时间 + 所需存储空间 =》 如何度量? + 如何比较? 算法复杂度分析的动机 如何度量: 设计的这个算法如何?跑得是不是足够快? 随着问题规模的增长会怎样变化了? 如何比较? 同一个问题有多种不同的算法,如何判断其优劣了? 直接想法 – 实验测试 把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小 实验测试难以准备反映算法的效率 - 测试环境和测试数据各异 不同的算法可能适应不同的输入规模 不同的算法可能适应不同类型的输入 同一个算法,可能由不同的程序员、用不同的语言、由不同的编译器编译 同一个算法,可能被运行在不同的 OS 、不同体系结构的计算机上 为了给出一个客观的评判断,需要抽象出一个理解的计算模型 不依赖于上述各种具体因素,准确测量和评价算法 RAM(Random Access Model) 1. 指令一条接着一条执行(串行) 2. 指令包含了真实计算机的常见指令 ,例如: 算术指令(加法,减法,乘法,除法,取余

给类排序复杂度比较和冒泡排序与选择排序

血红的双手。 提交于 2020-01-26 17:56:09
各个排序的比较 冒泡排序 export default (arr) => { // 冒泡排序 for (let i = arr.length - 1, tmp; i > 0; i--) { for (let j = 0; j < i; j++) { tmp = arr[j] if (tmp > arr[j + 1]) { arr[j] = arr[j + 1] arr[j + 1] = tmp } } } return arr } 选择排序 export default (arr) => { // 选择排序 for (let i = 0, len = arr.length, min; i < len; i++) { min = arr[i] for (let j = i + 1; j < len; j++) { if (arr[j] < min) { let c = min min = arr[j] arr[j] = c } } arr[i] = min } return arr } 来源: https://www.cnblogs.com/ygjzs/p/12234405.html

如何进行复杂度分析?

隐身守侯 提交于 2020-01-25 07:34:40
时间复杂度分析: 1、大 O 复杂度表示法:T(n) = O(f(n)),公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比 只关注循环执行次数最多的一段代码 总复杂度等于量级最大的那段代码的复杂度 嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 2、最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度 3、最好情况时间复杂度:代码在最坏情况下执行的时间复杂度 4、平均时间复杂度:代码在所有情况下执行的次数的加权平均值 5、均摊时间复杂度:极少数高级别复杂度且发生具有时序关系时,可以将这几个高级别的复杂度均摊到低级别复杂度上,一般均摊结果就等于低级别复杂度 空间复杂度分析: 与时间复杂度分析类似,关注算法的存储空间与数据规模之间的增长关系 常见的复杂度: 常见的复杂度并不多,从低到高阶:O(1)、O(logn)、O(n)、O(nlogn)、O(n2) 来一道刷了进BAT的面试题? 来源: CSDN 作者: ConstXiong 链接: https://blog.csdn.net/meism5/article/details/103841238

异或算法

橙三吉。 提交于 2020-01-24 02:49:00
最近碰到很多通过巧妙着运用 位运算 来巧妙解决复杂问题的算法,今天分享的这道题,或许能够开拓你的一些算法思维。 题目描述 有一组存放 ID 的数据。并且 ID 取值为 0 - (N-1) 之间,其中只有一个 ID 出现的次数为 1,其他的 ID 出现的次数都等于 2,问如何找到这个次数为 1 的 ID ? 解法一:巧用数组下标 不知道有多少人还记得我之前分享的 巧用数组下标 的技巧: 一些常用的算法技巧总结 。 我的第一想法便是采用 下标法 来解决,把 ID 作为数组 arr 的下标,在遍历 ID 的过程中,用数组记下每个 ID 出现的次数,即每次遍历到 ID = n,则 arr[n]++。 之后我们在遍历数组 arr,找到 arr[n] = 1 的ID,该下标 n 便是我们要寻找的目的 ID。 这种方法的时间复杂度为 O(N),空间复杂度为 O(N)。 解法二:巧用哈希表 显然时间复杂度是无法再降低的了,因为我们必须要遍历所有的 ID,所以时间复杂度最少都得为 O(N)了,所以我们要想办法降低空间复杂度。 大家想一个问题,假如我们检测到某个 ID 已经出现了 2 次了,那么这个 ID 的数据我们还需要存储记录吗?大部分的 ID 都出现了 2 次,这一大部分的数据真的需要存储吗? 答是不用的,因为出现 2 次的 ID 不是我们所要找的。所以我们可以优化 解法一 ,我们可以采用

从0开始学架构(一)

99封情书 提交于 2020-01-23 18:12:29
此系列文章为 极客时间 上 从 0 开始学架构 学习后感悟总结,虽然隔了一段时间了,那么就再看一遍并且进行感悟升华,排版格式上有问题,后期再复习时也会进行更新 架构设计的关键思维是判断和取舍,程序设计的关键思维是逻辑和实现。 架构设计的主要目的是为了解决软件系统复杂度带来的问题,架构师该做的有的放矢,而不是贪大求全 一.架构复杂度来源---高性能 为了满足业务的所需性能,单机早已无法应当,因此都是采用集群方式来应对,使用集群方式后就会变得更复杂。 很简单的方式,我们加入新机器后便需要再加入任务分配器,从单机就进化成了下图,很好理解         随着为了满足业务性能要求增加了新服务器后,引出了一些问题 多了一个任务分配器,它可能是硬件(F5),也更有可能是负载均衡软件(lvs/nginx/haproxy),也可能是自研系统 任务分配器内有算法,使用不同的算法会对我们的性能有不同的改善,不同的业务场景有各自所需的算法 任务分配器与后端业务机器之间的联通问题 一台机器可以承受5000业务量(假定),但是2台并不是1W,实际需要打个8折,即8000,如果业务还比较复杂,那么可能只有5000,我们的收益会越来越低 随着业务量的增加,单台任务分配器都会成为瓶颈,即连任务分配器我们也需要变成集群模式,任务分配器前面也需要选择对应的分配策略(即任务分配器的任务分配器),常用的有DNS 轮询

bzoj 泛做

爱⌒轻易说出口 提交于 2020-01-22 23:47:10
3003 这个题是这样的,对序列差分后,每个取反操作就是给两个端点的值取反,然后背包之后再状压就好了 4128 这题棒棒的QAQBSGS 23333 4176 这个杜教筛呃呃呃 大爷链接 3028 我要去学学生成函数 大爷链接 4025 我真TM是智商爆降了,这个东西明显的按时间分治一下就好了,管他什么lct 3498 一位大爷:“将所有点分成两类:度数 < sqrt(m)的和度数 > sqrt(m)的.先求包含第一类点的三元环个数.由于边很少,所以枚举2条边即可.由于一个点的度不超过sqrt(m),所以一条边最多被枚到(sqrt(m))次,最多枚M条边,所以这个操作时O(m sqrt(m))的.再求不包含第一类点的三元环个数.由于每条边贡献2个度,所以二类点的数量是O(sqrt(m))级的.直接枚举三个点,复杂度O((sqrt(m))^3)=O(m sqrt(m))所以算法总的复杂度是O(m*sqrt(m))的.” 5043 先发个 神犇友链 当时只知道暴力,f[i][j]表示第i位剩余j最小的k但是这样j为2^60太大无法忍受,所以可以倒着按位做表示这一位剩余j,一定满足j<=n,这样复杂度降为60n,好棒棒呦 4241 一样看以为莫队结果被怼啦 大爷链接 ,填填坑 2400 这题其实很简单,然而......因为是异或运算,所以每一位独立然后就是最小割了(捂脸 4036

做题报告模板

醉酒当歌 提交于 2020-01-22 16:35:53
题目链接: Remove All Adjacent Duplicates In String 题目大意: 。。。。 做题报告: (1) 该题涉及的算法与数据结构 。。。 (2) 自己的解答思路+代码+分析时间和空间复杂度 (3) 大神们的解答思路+代码+分析时间和空间复杂度 时间和空间复杂度: 时间复杂度:O( ) 空间复杂度:O( ) (4) 比较自己想的和参考答案的区别 来源: https://www.cnblogs.com/Aiahtwo/p/12228711.html

数据结构与算法——复杂度分析

可紊 提交于 2020-01-21 05:18:06
1、大O复杂度表示法 1.1、从维度划分 从维度划分可分为:时间复杂度、空间复杂度 1.1.1、时间复杂度 概念 代码执行时间随数据规模增长的变化趋势 多项式量级复杂度分析规则(非多项式量级不常见暂不考虑) 顺序相加,嵌套相乘,取最高阶 阶数排序 幂阶( n 4 > n 3 > n 2 n^4>n^3>n^2 n 4 > n 3 > n 2 )>线性对数阶( n l o g n nlogn n l o g n )>线性阶( n n n )>对数阶( l o g n logn l o g n )>常数阶(1) 举例 int a = 0 ; for ( int i = 0 ; i < n ; i ++ ) { a = a + 1 ; for ( int j = 0 ; j < n ; j ++ ) { a = a + 2 ; } } int b = 1 ; while ( b <= n ) { b = b * 10 ; } 第一行:执行1次 第二行:循环执行n次 第三行:循环执行n次 第四行:循环执行 n 2 n^2 n 2 次 第五行:循环执行 n 2 n^2 n 2 次 第八行:循环执行 l o g n logn l o g n 次 总计: 2 n 2 + 2 n + l o g n + 1 2n^2+2n+logn+1 2 n 2 + 2 n + l o g n + 1 次

【数据结构-1】复杂度

旧城冷巷雨未停 提交于 2020-01-21 04:43:09
文章目录 1. 斐波那契数列 2. 大O表示法 3. 线性表 1. 斐波那契数列 public class Main { public static void main ( String [ ] args ) { System . out . println ( fib2 ( 70 ) ) ; } /** * 0 1 1 2 3 5 8 13 */ public static int fib1 ( int n ) { if ( n <= 1 ) return n ; return fib1 ( n - 1 ) + fib1 ( n - 2 ) ; } public static int fib2 ( int n ) { if ( n <= 1 ) return n ; int first = 0 ; int second = 1 ; for ( int i = 0 ; i < n - 1 ; i ++ ) { int sum = first + second ; first = second ; second = sum ; } return second ; } } 2. 大O表示法 3. 线性表 来源: CSDN 作者: 茶花女- 链接: https://blog.csdn.net/qq_42764468/article/details/104056059