复杂度

算法复杂度

淺唱寂寞╮ 提交于 2019-12-04 21:54:51
程序争取运行时间,运行空间,达到预期效果 实际应用中,还涉及相当大量的数据处理,随着数据规模的增大, 基于不同算法的程序在处理同一问题所需时间是不同的 所以算法复杂度的分析就很重要 来源: https://www.cnblogs.com/-constructor/p/11886232.html

字符串的最长回文子串--manacher算法

你。 提交于 2019-12-04 20:17:33
预备知识: 字符串概念 回文子串概念 朴素算法: 通常我们熟知的求解字符串的最长回文字串的方法有以下两种算法: 1、O(n^2)枚举子串的左右两个端点->O(n)判断该子串是否为回文串:总复杂度O(n^3); 2、O(n)枚举每一个回文子串的中点(偶数长度类似,不做讨论)->O(n)向两端拓展:总复杂度O(n^2)。 然而在一般的算法竞赛中,O(n^2)复杂度求回文子串的算法是无法接受的,下面介绍一种在线性时间内求字符串的最长回文子串的算法--manacher算法。 manacher算法: 如果将上述算法2视为算法1的优化版本,那么manacher算法可视为算法2的优化版本。下面先分析算法2的不足之处。 对于算法2我们会枚举每一个位置的中点,每次都从枚举点开始向两端拓展。比如下图中枚举了7作为中点,假设其两端最远拓展的长度为6,即字符串[1~13]为一个回文子串(并且13为当前向右拓展的最远距离)。当我们再枚举11作为中点时,我们会依次比较:(10,12)->(9,13)->......,这样的复杂度就是O(n^2)。然而实际上我们还需要对7为中点的子串进行这样的枚举吗? 其实是不需要的。 因为我们已经知道了[1~13]为一个回文子串了,也就是说子串[1~7]与[7~13]一样(下图红框所示)。那么子串[9~13]当然与对称位置的子串[1,5]一样(下图蓝框所示)。更本质一点就是

敲开通往架构师的门

為{幸葍}努か 提交于 2019-12-04 12:04:42
最近学习了一些关于架构设计的知识想分享给大家。俗话说得好,不想当架构师的程序员不是好厨子。那么如何成为一名架构师呢?接下来就聊一聊我的一些想法。 什么是架构师 之前有同学问我,做了几年技术,应该转管理还是转架构师?对于这位同学,我给他的答案是,你要先踏踏实实做好现在的工作。因为就他提的问题来看,应该是刚入行不久或者是在校学生。 专心做技术的,都想做架构师。但架构师并不是说技术做时间长了可以转的。随着你的知识深度和广度的增加,在工作中会扮演更重要的角色,承担更大的责任,最终自然而然就会接触到架构设计的工作。 而架构师的主要工作,其实是利用架构设计知识以及丰富的工作经验,在设计架构时,结合实际情况,在不同的选项中做出取舍。 架构设计的真正目的? 为什么要进行架构设计?因为架构设计很重要?可是为什么重要呢?似乎说不清楚。 因为可以提升开发效率吗?也不一定,因为只有简单的设计才会使开发效率更高。而架构设计出于多方面考虑,不得已会引入一些复杂度,因此架构设计并不一定能提升开发效率。 是为了大多数口中的“高可用”、“高性能”、“可扩展”吗?其实也不是。我们的系统可能并不一定需要这些。 那架构设计的真正目的是什么呢?我认为架构设计的真正目的是与系统复杂度做斗争。 系统复杂度的来源有: 高性能、高可用、可扩展性、低成本、安全、规模 。 前面我们聊到有些系统可能不需要高可用、高性能

A

丶灬走出姿态 提交于 2019-12-04 10:30:06
给定N个形如$f_i(x)=a_i*x^2+b_i*x$的二次函数 有Q次询问每次给出一个$x$,求$max{f_i(x)}$ 再菜也只是菜这么一两天了 过了这几天,奥赛就与我无关了 可能退役之前最后一篇? 观察到二次函数没有c 二次函数可以转化成$x(a*x+b)$ 就可以分类讨论了,分成$x>0,x<0$ 只讨论$>0$($<0$同理) $>0$时按照$a$升序,$b$升序排序 排序后,对于每一个值域预处理,回答时$O1$ 假设值域上两个值$x,x+1$ $x$取到最大值为$mxid$,那么$x+1$取到最大值一定大于等于$mxid$ 证明 $(x+1)*a+b=x*a+b+a$ $a$排序后是单调递增的 因为$mxid$之前a都$<=a_{mxid}$,本来就$<=mxid$现在增加量$<=mxid$ 所以可以链表乱搞 复杂度$O(值域ln(值域))$ 复杂度证明 经过去重之后 假设最后一个值为$a_{mxid},b_{mxid}$ 极限情况就是一直跳$a_1$,最大是$a_1$ 会跳多少次解不等式 $a_{lst}*x*x+b_{lst}*x>a_1*x*x+b_1*x$ 假设x>0 $a_{lst}*x+b_{lst}>a_1*x+b_1$ 于是有了 $x>\frac{b_1-b_{lst}}{a_{lst}-a_1}$ 然后设分母为$delta_a$ 仍然考虑极限情况

csp-s模拟89

♀尐吖头ヾ 提交于 2019-12-04 06:31:21
T1:   有个诡异的结论:最多按3次delete   然后类似于艾氏筛的dp就行了,复杂度 \(O(nloglogn)\) ,有点卡   正解是跑个最短路,感觉很优秀 T2:   考虑容斥,发现其实就是求:$\sum_{i=1}^{\lfloor \sqrt{n} \rfloor} \mu (i)* \lfloor n/(i^2) \rfloor $   其中 \(\lfloor n/(i^2) \rfloor\) 可以整除分块,那么复杂度瓶颈在于求莫比乌斯函数的前缀和   低于线性的求积性函数前缀和, 杜教筛 即可 T3:   Treap = Tree+Heap (x)   椎 = 树 + 堆 ( \(\surd\) )   呵,在理   考虑肯定不能模拟treap,因为weight值并不随机,所以并不平衡   考虑将离线下来,对key值排序,那么 \(k_u\) 和 \(k_v\) 的lca一定是它们区间中weight最大的点   然后就考虑如何求x到lca的距离,考虑treap中weight的性质可知距离即为从x到lca中weight单调递增的点的个数   说白了就是维护单调栈的大小,线段树维护单调栈即可 来源: https://www.cnblogs.com/Gkeng/p/11837314.html

基于乘积量化的快速特征匹配

半城伤御伤魂 提交于 2019-12-04 01:31:56
基于乘积量化的快速特征匹配 1、算法实现 不使用乘积量化的特征匹配方法 假设有两张图片p1、p2,分别有k1、k2个128维的sift描述子特征向量,该方法算出p1中每一个特征向量与p2中的每一个特征向量的欧式距离,距离最短的那一对特征向量构成一组匹配。该方法的计算复杂度:k1*k2*128。存储空间为:k1*128+k2*128。 基于乘积量化的快速特征匹配法 1、训练码本。将待训练的图片p1、p2、p3……的每个sift描述子特征向量分为m段,将属于同一段的所有128/m维特征向量用k-means方法聚类成n个聚类中心,得到m段包含n个聚类中心的码本。对每段的聚类结果,计算任意两个聚类中心之间距离,生成一个大小为n*n的距离矩阵,共有m个这样的距离矩阵。代码如下: % 将用于训练的sift描述子向量均分为16段,每段8维 sub_vector = cell( 16 , 1 ); for i = 1 : 16 sub_vector {i} = siftDescriptorTrain(( i - 1 )* 8 + 1 : 8 * i ,:); end C = cell( 16 , 1 ); Idx = cell( 16 , 1 ); opts = statset( 'MaxIter' , 300 ); % 对每一段进行k-means聚类,k=64 for i = 1 : 16

常见算法的时间空间复杂度【整理摘编】

。_饼干妹妹 提交于 2019-12-04 00:59:20
1.( 来源 ) (1)O(1):常量阶,运行时间为常量 (2)O(logn):对数阶,如 二分搜索算法,快速幂 (3)O(n):线性阶,如 n个数内找最大值 (4)O(nlogn):对数阶,如 快速排序算法,线段树 (5)O(n^2):平方阶,如 选择排序,冒泡排序 (6)O(n^3):立方阶,如 两个n阶矩阵的乘法运算 (7)O(2^n):指数阶,如 n个元素集合的所有子集的算法 (8)O(n!):阶乘阶,如 n个元素全部排列的算法 2.( 来源) 来源: https://www.cnblogs.com/phemiku/p/11826243.html

漫谈互联网架构

对着背影说爱祢 提交于 2019-12-03 14:07:00
互联网的标准技术架构如下图所示,这张图基本上涵盖了互联网技术公司的大部分技术点,不同的公司只是在具体的技术实现上稍有差异,但不会跳出这个框架的范畴。 存储层技术SQL SQL即我们通常所说的关系数据。前几年NoSQL火了一阵子,很多人都理解为NoSQL是完全抛弃关系数据,全部采用非关系型数据。但经过几年的试验后,大家发现关系数据不可能完全被抛弃,NoSQL不是No SQL,而是Not Only SQL,即NoSQL是SQL的补充。 所以互联网行业也必须依赖关系数据,考虑到Oracle太贵,还需要专人维护,一般情况下互联网行业都是用MySQL、PostgreSQL这类开源数据库。这类数据库的特点是开源免费,拿来就用;但缺点是性能相比商业数据库要差一些。随着互联网业务的发展,性能要求越来越高,必然要面对一个问题:将数据拆分到多个数据库实例才能满足业务的性能需求(其实Oracle也一样,只是时间早晚的问题)。 数据库拆分满足了性能的要求,但带来了复杂度的问题:数据如何拆分、数据如何组合?这个复杂度的问题解决起来并不容易,如果每个业务都去实现一遍,重复造轮子将导致投入浪费、效率降低,业务开发想快都快不起来。 所以互联网公司流行的做法是业务发展到一定阶段后,就会将这部分功能独立成中间件,例如百度的DBProxy、淘宝的TDDL。不过这部分的技术要求很高,将分库分表做到自动化和平台化

算法基础

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 14:02:40
算法复杂度:时间复杂度,和空间复杂度 时间复杂度,参考文章 https://blog.csdn.net/qq_41523096/article/details/82142747 空间复杂度,参考时间复杂度,引申理解。 来源: https://www.cnblogs.com/kevinsteve/p/11798211.html

20182333 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

耗尽温柔 提交于 2019-12-03 09:51:07
20182333 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 第十二章 算法分析 1.算法效率(决定着一个程序执行的速度) 2.增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n) 第十四章 栈 1.集合分为两大类:①线性集合:按照顺序一个一个排。②非线性集合:存在顺序并列的情况。 2.栈是一种线性集合,元素按后进先出(LIFO)的方法进行处理,有push,pop,peek,isempty,size等常用操作 3.栈是用于计算后缀表达式的理想数据结构,在进行运算时,先把中缀表达式转为后缀表达式,然后从左到右扫描,数字入栈,遇见符号,把前两个数字进行相应的运算然后放入栈中(减法是第二个数减去栈顶的数)。 4.链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node 5.链表会按需动态增长,因此本质上,它没有容量限制 6.使用链表实现的栈和使用数组实现的栈一样,都需要写出相应的push、pop等方法。 第十五章 队列 1.队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。 2.队尾(tail),队首(head),队列前端(front),队列末端(rear)。 3