复杂度

比赛错题总结

混江龙づ霸主 提交于 2020-01-12 08:49:16
这里是最后两个月的比赛总结,从吾心,尽吾力,可以无悔矣。 2019 1 10 牛客练习赛57 犯了几个sb错误 如 代码写的有误 字符打错等,没有好好对待比赛题目,过于紧张了。 经典NPC问题: 装货物 怎么做?显然搜索不行 状压 \(f[i]\) 表示...然后预处理一发,状态转移发现需要枚举子集 复杂度 \(3^n\) 会T。 到这里我们已经被惯性思维给控制住了 状态并非只需要枚举子集我们完全可以枚举下一个拿哪一个箱子,显然这需要另一个状态来加持即g[i]表示形成这个状态最后一个箱子剩余的最大容量这样可以保证使答案不会变的更差。 复杂度 \(2^n\cdot n\) 可以通过。 来源: https://www.cnblogs.com/chdy/p/12181880.html

技术的演进

为君一笑 提交于 2020-01-10 05:12:29
  对人们生活影响最大的是技术的进步,技术一直都是围绕着生存和繁衍这两大主题进行发展的,而技术的进步是因为人类集群的大规模协作。在整个过程中趋向于熵增加,也就是说技术的复杂度越来越高。 石器 远古时代的人类不满足于果实,需要营养含量更高的食物,在肉体力量上又无法与其他食肉动物相抗衡,只能使用石器敲开被其他食肉动物吃剩下骨头。 在石器时代,人与人之间处于弱肉强食的状态,生存和繁殖都被高大威猛的雄性所主导 。 铁器 铁器提高了生产力。 也是在这个时代出现了奴隶,出现奴隶是因为不需要大规模协作,只需要一些人进行重复劳动即可实现资本增长。 发动机 这是一个进一步让人从体力劳动中解放出来的技术,也是工业时代初期蓬勃发展的引擎。 从这个时代开始奴隶制消失了,因为技术复杂度,所以一定要给人以自由才能实现资本增长。 互联网 在信息的空间位移上释放了人类的双脚。 现在AI技术也已经出现,下一个解放的应该就是人类的大脑了。 但是,人是进化的产物,天生就不适合学习各种科学知识,技术复杂度进一步提高,学习成本进一步升高。给人的自由度也会更大。 作为一个技术人员,我常想虽然技术改变了世界,但是其实最先应用技术到人类生活频次最高的领域的商业人士才是获益最多的人。换一种说法就是那些运筹帷幄,懂得资源组合的人才是主导者,技术人员在整个过程中不过是泥瓦匠而已,技术人员只是饿不死而已。 来源: https://www

外观在 Java 中的实现

大城市里の小女人 提交于 2020-01-07 17:53:50
外观 是一种结构型设计模式, 能为复杂系统、 程序库或框架提供一个简单 (但有限) 的接口。 尽管外观模式降低了程序的整体复杂度, 但它同时也有助于将不需要的依赖移动到同一个位置。 在 Java 中使用模式 复杂度:⭐ 流行度:⭐⭐ 使用示例: 使用 Java 开发的程序中经常会使用外观模式。 它在与复杂程序库和 API 协作时特别有用。 下面是一些核心 Java 程序库中的外观示例: javax.faces.context.FacesContext 在底层使用了 Life­Cycle 、 View­Handler 和 Navigation­Handler 这几个类, 但绝大多数客户端不知道。 javax.faces.context.ExternalContext 在内部使用了 Servlet­Context 、 Http­Session 、 Http­Servlet­Request 、 Http­Servlet­Response 和其他一些类。 识别方式: 外观可以通过使用简单接口, 但将绝大部分工作委派给其他类的类来识别。 通常情况下, 外观管理着其所使用的对象的完整生命周期。 复杂视频转换库的简单接口 在本例中, 外观简化了复杂视频转换框架所进行的沟通工作。 外观提供了仅包含一个方法的类, 可用于处理对框架中所需类的配置与以正确格式获取结果的复杂工作。 some

复杂度分析之空间复杂度

自古美人都是妖i 提交于 2020-01-07 17:46:36
几种空间复杂度 1. 常量空间 当算法的存储空间大小固定,和输入规模没有直接的关系时,空间 复杂度记作O(1)。例如下面这段程序: void fun1(int n){ int var = 3; … } 2. 线性空间 当算法分配的空间是一个线性的集合(如数组),并且集合大小和 输入规模n成正比时,空间复杂度记作O(n)。 例如下面这段程序: void fun2(int n){ int[] array = new int[n]; … } 3. 二维空间 当算法分配的空间是一个二维数组集合,并且集合的长度和宽度都 与输入规模n成正比时,空间复杂度记作O(n2)。 例如下面这段程序: void fun3(int n){ int[][] matrix = new int[n][n]; … } 4. 递归空间 递归是一个比较特殊的场景。虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“方法调用栈”。“方法调用栈”包括进栈和出栈两个行为。当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中。当方法返回时,执行出栈操作,把调用的方法和参数信息从栈中弹出。 下面这段程序是一个标准的递归程序: void fun4(int n){ if(n<=1){ return; } fun4(n-1); … } 假如初始传入参数值n=5,那么方法fun4

空间复杂度

十年热恋 提交于 2020-01-07 16:18:51
时间复杂度,换句话说,就是它们运行得有多快。但有些时候,我们还得以另一种名为空间复杂度的度量方式,去估计它们会消耗多少内存。 当内存有限时,空间复杂度便会成为选择算法的一个重要的参考因素。比如说,在给小内存的小型设备写程序时,或是处理一些会迅速占满大内存的大数据时都会考虑空间复杂度。 描述空间复杂度的大O记法 计算机科学家还是用描述时间复杂度的大O记法来描述空间复杂度。 用大O来描述一个算法需要多少空间:当所处理的数据有N个元素时,该算法还需额外消耗多少元素大小的内存空间。 function makeUpperCase(array){//makeUpperCase函数接收一个数组作为参数array。 var newArray=[];//然后它创建了一个全新的数组,名为newArray for(var i=0; i < array.length; i++){ newArray[i]=array[i].toUpperCase();//并将原数组array里的字符串的大写形式填进去。 } return newArray; } 分析该函数的话,你会发现它接收一个N元素的数组,就会产生另一个新的N元素数组。因此,我们会说这个makeUpper-Case函数的空间效率是O(N)。 我们再写一个更高效利用内存的makeUpperCase。 function makeUpperCase(array

[USACO 18Jan Gold] Moo Tube

纵饮孤独 提交于 2020-01-07 09:49:22
题目大意:   给定一棵节点数为n的树,每两点之间的关联度为两点路径上权值最小的边。q次查询,每次查询某个点关联度大于等于k的节点的数量。   n,q<=100,000 题目解法:   数据范围考虑排序后离线操作。   显然,对于每个点,符合条件的节点一定是一个包含该点的连通块。因此我们可以考虑每次操作将所有权值>=k的边的两个端点合并到同一个连通块(通过并查集实现),然后再用一个数组记录每个连通块的大小,对于每次查询输出该点所在连通块大小即可。为了降低合并操作的复杂度,我们考虑到如果将所有操作按照k从大到小排序,我们只需要在前面的基础上合并新的边即可。这样总的合并次数就是边数。为了更快的找到需要新加的边,还需要把边按照权值排序,这样找边的复杂度也是边数。总的复杂度是O(n log n)    来源: https://www.cnblogs.com/myrcella/p/12148003.html

访问者在 Java 中的实现

被刻印的时光 ゝ 提交于 2020-01-06 14:39:32
访问者 是一种行为设计模式, 允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。 在 Java 中使用模式 复杂度: ⭐⭐⭐ 流行度: ⭐ 使用示例: 访问者不是常用的设计模式, 因为它不仅复杂, 应用范围也比较狭窄。 这里是 Java 程序库代码中该模式的一些示例: javax.lang.model.element.AnnotationValue 和 Annotation­Value­Visitor javax.lang.model.element.Element 和 Element­Visitor javax.lang.model.type.TypeMirror 和 Type­Visitor java.nio.file.FileVisitor 和 Simple­File­Visitor javax.faces.component.visit.VisitContext 和 Visit­Callback 将形状导出为 XML 文件 在本例中, 我们希望将一系列几何形状导出为 XML 文件。 重点在于我们不希望直接修改形状代码, 或者至少能确保最小程度的修改。 最终, 访问者模式建立了一个框架, 允许我们在不修改已有类的情况下向形状层次结构中添加新的行为。 shapes shapes/Shape.java: 通用形状接口 package refactoring_guru

并行计算基础

耗尽温柔 提交于 2020-01-04 05:05:34
冒泡排序算法:   - 算法分析:     时间复杂度:       经过几轮修改,数组正序时,最优复杂度可以达到O(n);逆序时,最差复杂度O(n2)。     稳定性:       算法中,每次只有前一个元素大于后一个元素,才会进行交换。所以数值相同的两个元素,不会发生位置互换,所以可以保持之前前后顺序。故,冒泡排序是稳定的排序。   算法演示如下:        奇偶排序算法: 时间复杂度/空间复杂度; 排序方法 时间复杂度 空间复杂度 稳定性 复杂度 平均情况 最坏情况 最好情况 奇偶排序 O(nlog 2 n) O(nlog 2 n) O(n) O(1) 稳定 较简单 适用于并行计算的指令必须满足以下3个条件: 1、指令J的输入和指令I的输出交集为空;//不依赖另一条指令的输出作为输入 2、指令I的输入和指令J的输出交集为空; 3、指令I和指令J的输出交集为空;;//确保不会同时对相同的变量进行写操作 不适用于并行处理的场景: 1、两条指令享有共同的输出集; 2、一条指令的输出包含全部或者部分另一条指令的输入; 3、一条指令的输入包含全部或者部分另一条指令的输出。 来源: https://www.cnblogs.com/able7/p/10194863.html

260. 只出现一次的数字 III

六眼飞鱼酱① 提交于 2020-01-02 23:54:24
ID: 260 TITLE: 只出现一次的数字 III TAG: Java,Python 概述 使用哈希表可以在 O ( N ) \mathcal{O}(N) O ( N ) 的时间复杂度和 O ( N ) \mathcal{O}(N) O ( N ) 的空间复杂度中解决该问题。 这个问题在常数的空间复杂度中解决有点困难,但可以借助两个位掩码来实现。 方法一:哈希表 建立一个值到频率的映射关系的哈希表,返回频率为 1 的数字。 算法: from collections import Counter class Solution : def singleNumber ( self , nums : int ) - > List [ int ] : hashmap = Counter ( nums ) return [ x for x in hashmap if hashmap [ x ] == 1 ] class Solution { public int [ ] singleNumber ( int [ ] nums ) { Map < Integer , Integer > hashmap = new HashMap ( ) ; for ( int n : nums ) hashmap . put ( n , hashmap . getOrDefault ( n , 0 ) +

【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)

这一生的挚爱 提交于 2019-12-30 03:03:20
Part 1、块状链表。 定位 插入 删除 数组 O(1) O(n) O(n) 链表 O(n) O(1) O(1) 对于线性表的以上常见操作来说,数组和链表都无法有效地解决。但是,若我们将链表的每个节点存成一个数组,使得链表里每个节点的数据拼接起来就是原先的线性表中的内容(即块状链表),并且数组的大小合适的话,以上的操作都能比较好地解决了。根据均值不等式,若每个块的大小定为sqrt(n)左右最优,此时块数也是sqrt(n)左右,易证。以下是块状链表的基础操作的思想、复杂度和代码。 一、声明。C++ STL中提供了list和vector两种数据结构,于是,若我们将它们嵌套起来,便是一个很方便的块状链表,免去指针之类的操作。这里的每个块仅仅存储了数据,没有存储额外的域,实际情况要予以添加。 next函数用于返回list的迭代器x的下一个迭代器。 1 #include<cstdio> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 int sz;//块大小,一般为sqrt(n) 6 struct BLOCK{vector<int>data;BLOCK(){}}; 7 list<BLOCK>List; 8 typedef list<BLOCK>::iterator L_ITER; 9 typedef vector