时间复杂度

时间复杂度、空间复杂度

匿名 (未验证) 提交于 2019-12-02 23:26:52
什么是算法? 计算机是人的大脑的延伸,它的存在主要是为了帮助我们解决问题。 而算法在计算机领域中就是为了解决问题而指定的 一系列简单的指令集合 。不同的算法需要不同的资源,例如:执行时间或消耗内存。 如果一个算法执行时间需要好几年或者需要占用非常大的内存,那么这算法几乎毫无用处,即使有价值使用场景也非常有限。 因此,一般上我们讨论一个算法的优劣的时候可以通过 时间 和 空间 两个维度来衡量,也就是常说的: 1、时间复杂度; 2、空间复杂度; 我们当然希望执行时间和消耗内存都越少越好,但很多时候其实我们无法同时兼顾,需要在时间和空间之间做一定的取舍达到平衡。 时间复杂度 一般上,如果我们要衡量一个程序片段的执行时间,我们会把程序运行一次并打印时间,这是最常见也是最简单的方式。 这种方式存在一些问题: 1、不同的计算机会产生不同的执行时间,甚至于相同的计算机也会产生不同的时间,根据计算机当前的情况而定; 2、通常可能我们使用很小的数据量来测量,但一个算法随着数据量的不同性能变化是不同的,所以小数据量衡量的时间不见得适用于大数据量; 3、甚至于有时候一个算法压根无法直接通过运行来测试时间。 为了解决这些问题,引入了数学领域中的 “大O标记法” 大O标记法 T(N)=O(f(N)) 数学概念看起来有些费解,我们可以把T(N)=1000N把f(N)=N 2 ,当N=1000,c=1的时候

01、数据结构与算法入门

匿名 (未验证) 提交于 2019-12-02 23:06:17
数据结构与算法(java) 1. 数据结构入门 1.1 常见的数据结构与操作 数据结构体系图 1.2 基本概念 1.3 逻辑结构 1.3.1 线性结构与非线性结构 线性结构 非线性结构 1.3.2 集合、线性、树状与网络 1.4 存储结构 1.4.1 顺序存储结构 1.4.2 链式存储结构 1.4.3 索引存储结构 1.4.4 散列存储结构 1.5 举例 1.6 总结 2. 算法入门 2.1 概述 2.2 时间复杂度 2.2.1 定义 2.2.2 表示时间复杂度 2.2.3 计算时间复杂度 2.2.4 常用时间复杂度的级别 2.3 空间复杂度 2.3.1 定义 2.3.2 举例 例1 例2

大话数据结构笔记-第二章 算法

风格不统一 提交于 2019-12-02 22:17:19
一、笔记 2.1 算法   算法是描述解决问题的方法。   算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。   指令能被人或者机器等计算装置执行。可以是计算机指令,也可以是我们平时的语言文字。   为了解决某个或者某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定 的功能,这就是算法。 数据结构与算法关系   学习数据结构中,谈到算法,也是为了帮助理解好数据结构。 2.2 算法的特性   算法的5个特性:输入、输出、有穷性、确定性和可行性。   算法的输入可以是零个。但算法至少有一个或多个输出。输出形式可以是打印输出或返回一个或多个值等。   有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。   确定性:算法的每一步骤都具有确定的含义,不会出现二义性。   可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。意味着算法可以转换为程序上机运行,并得到正确的结果。 2.3 算法设计的要求   算法设计的要求:正确性、可读性、健壮性、时间效率高和存储量低。 正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理五歧义性、能正确反映问题的需求、能够得到问题的正确答案。     正确性大体分为以下四个层次:    

冒泡排序--JavaScript描述

匿名 (未验证) 提交于 2019-12-02 21:53:52
  相信凡是编程入门的都接触过冒泡排序算法,排序算法在编程中经常用到。 1. code 1 /** 2 * 冒泡排序 3 * 1、比较的轮数等于总数 - 1 4 * 2、比较次数等于要比较的个数 - 1 5 * --比较从第一个到最后一个 6 * --每一轮比较完得到一个最终值、不参与下一次比较 7 * 8 * */ 9 10 /** 11 * 最大时间复杂度 O(n^2) 12 * 空间复杂度 O(1) 13 * */ 14 var arr = [10, 0, 100, 20, 60, 30]; 15 var temp; 16 /** 17 * 从大到小 18 * **/ 19 /* 控制循环比较的轮数 */ 20 for (var i = 0; i < arr.length - 1; i++) { 21 /* 控制每一轮比较的次数 */ 22 for (var j = 0; j < arr.length - 1 - i; j++) { 23 if(arr[j] < arr[j + 1]){ 24 temp = arr[j]; 25 arr[j] = arr[j + 1]; 26 arr[j + 1] = temp; 27 } 28 } 29 } 30 // alert(arr); 31 console.log("从小到大 :" + arr); 32 /** 33 * 从小到大

1.2Java面试题及回答集锦

匿名 (未验证) 提交于 2019-12-02 21:53:52
1、问题:如果A和B对象循环引用,是否可以被GC? 回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GC Roots没有任何引用链连接,则证明对象是不可用的。 2、Java中的内存溢出是如何造成的? OutOfMemoryError: (1)PerGern Space 程序中使用了大量jar或class,使Java虚拟机装载类空间不够。 解决方案:调参XX:PermSize 和 XX:MaxPermSize 、减少jar包,减少类的重复加载 (2)Java Heap Space Java虚拟机创建了太多的对象。 解决方案:调参Xms(初始堆大小)Xmx(最大堆大小)、检查死循环或不必要创建的重复对象 解决方案:调整JVM中线程大小。 3、 String s = “123”;这个语句有几个对象产生? 若字符串池中没有"123",则产生一个对象,并且放入常量池中,若有"123",则产生0个对象。 若是String s = new String("123"),若常量池中没有,则在常量池中创建一个,然后在堆内存中创建一个。 4、 Error

后端开发应该掌握的Redis基础

允我心安 提交于 2019-12-02 20:11:12
转自: https://juejin.im/post/5d078cd6f265da1b8466e62c 在上一篇文章中,我们简单地讲了一下 Redis 的应用场景、安装、如何连接等比较基础的知识,那么在这篇文章,我们就再接再励,继续 Redis 基础知识的学习吧。 在这篇文章中,我们来讲一讲 Redis 的数据结构和通用命令。 Redis的数据结构 Redis 支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。 五种基础数据结构 String :字符串,是构建其他数据结构的基础 Hash :哈希列表 List :列表 Set :集合,在哈希列表的基础上实现 Sort Set :有序集合 复杂的数据结构 Bitmaps :位图,在string的基础上进行位操作,可以实现节省空间的数据结构。 Hyperloglog :用于估计一个 set 中元素数量的概率性的数据结构。 Geo : geospatial,地理空间索引半径查询。 BloomFilter :布隆过滤器。 不同数据结构的相同之处 从上面的介绍,我们看到支持的数据结构的不同,但其实, Redis的 每一种数据结构都由一个 key 和 value 组成,可以抽象为: Redis数据结构组成 而所有数据结构的 key 的值都是任意合法的字符串,不同的数据结构的区别就在于

模拟测试92

帅比萌擦擦* 提交于 2019-12-02 19:17:51
T1:   显然每个数是独立的。   无解情况的判定用裴蜀定理即可     用$ex_gcd$求出一组特解,对于每个数,只需要求出使$|x|+|y|$最小的一组解即可。   最优解一定取在$x$或$y$接近$0$时,取个$min$即为答案。   时间复杂度$O(n)$。 T2:   根据贪心思想。   考虑两个数对$(a_i,b_i)$和$(a_j,b_j)$,如果$a_i<b_j$并且$b_i<a_j$,那么我们希望$i$排在$j$前面。对于相反的情况,我们希望$j$排在$i$前面。其余两种情况$i$和$j$以任意顺序排列都是相同的。显然按$a+b$从小到大排列就可以满足所有的需求。   设DP状态为选择的$a_i$的最大值为$j$时的最优值,更新时只涉及单点插入和区间加,用线段树维护DP数组即可。   时间复杂度$O(nlogn)$。 T3:   跑多元最短路,并记录由哪个源点更新。   枚举每条边,如果两侧的前驱不同,则用这条路径更新两个前驱的答案。   时间复杂度$O(mlogn)$。 来源: https://www.cnblogs.com/hz-Rockstar/p/11760125.html

简析 NP 问题 和P问题

丶灬走出姿态 提交于 2019-12-02 18:05:08
简析 NP 问题 和P问题 最简单的解释: P:算起来很快的问题 NP:算起来不一定快,但对于任何答案我们都可以快速的验证这个答案对不对 NP-hard:比所有的NP问题都难的问题 NP-complete:满足两点: 是NP hard的问题 是NP问题 严谨的定义: 问题: ​ 对于一个包含由0和1组成的字符串集合S,以某个01字符串x作为输入,要求某个图灵机判断x在不在S里面。这里的图灵机可以先想象成平时我们用的计算机,S也可以被看成我们要解决的问题。注意我们的问题非常简单,就是要判断某个字符串x是否在某个集合S里面,下面是定义: P:有一个图灵机在多项式时间内能够判断x是否在S里面 NP:有一个图灵机M,如果某个字符串x在S里面,那么存在一个验证字符串u(注意这个u是针对这个x的,而且长度必须是x长度的多项式 关系),M以x和u作为输入,能够验证x真的是在S里面。 NP-hard:如果某个问题S是NP-hard,那么对于任意一个NP问题,我们都可以把这个NP问题在多项式时间之内转化为S,并且原问题的答案和转化后S的答案是相同的。也就是说只要我们解决了S,那么就解决了所有的NP问题。 NP-complete:一个问题既是NP-hard,又在NP里面;也就是说 解决了这个问题我们就解决了所有NP问题 这个问题本身也是个NP问题 好,下面先来解释为什么会有人搞出来这么莫名其妙的定义