时间复杂度

时间复杂度_空间复杂度

自作多情 提交于 2020-02-02 01:33:58
1.算法中的基本操作的执行次数,为算法的时间复杂度。 bubbleSort的时间复杂度O(N ^ 2) binarySearch的时间复杂度O(logN) fibonacci递归的时间复杂度 O(2 ^ N) 阶乘递归factorial的时间复杂度B O(N) 2.空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。(空间复杂度算的是变量的个数。) bubbleSort的空间复杂度O(1) fibonacci的空间复杂度O(N) factorial空间复杂度 O(N) 来源: CSDN 作者: star9523 链接: https://blog.csdn.net/star9523/article/details/104135587

力扣练习2:分治

混江龙づ霸主 提交于 2020-02-02 01:01:39
多数元素 解法一: 遍历整个数组,然后用另一重循环统计每个数字出现的次数。将出现次数大于len/2的数字返回。 时间复杂度:O(n^2) class Solution { public int majorityElement ( int [ ] nums ) { int majorityCount = nums . length / 2 ; for ( int num : nums ) { int count = 0 ; for ( int elem : nums ) { if ( elem == num ) { count ++ ; } } if ( count > majorityCount ) { return num ; } } return - 1 ; } } 解法二: 如果所有数字被单调递增或者单调递减的顺序排了序,那么众数的下标为 n/2(偶数时为n/2+1) 时间复杂度:O(nlgn) class Solution { public int majorityElement ( int [ ] nums ) { Arrays . sort ( nums ) ; return nums [ nums . length / 2 ] ; } } 数组中的第K个最大元素 解法一: 直接使用库函数sort排序后输出len-k即可,时间复杂度:O(Nlog⁡N) 解法二:

数据结构 - 布隆过滤器(Bloom Filter)

谁都会走 提交于 2020-02-01 22:45:50
思考 如果要经常判断1个元素是否存在,你会怎么做? 很容易想到使用哈希表(HashSet、HashMap),将元素作为key去查找 时间复杂度:O(1),但是空间利用率不高,需要占用比较多的内存资源 如果需要编写一个网络爬虫去爬10亿个网站数据,为了避免爬到重复的网站,如何判断某个网站是否爬过? 很显然,HashSet、HashMap并不是非常好的选择 是否存在时间复杂度低、占用内存较少的方案? 布隆过滤器(Boolm Filter) 1970年由布隆提出 它是一个空间效率高的概率型数据结构,可以用来告诉你:一个元素一定不存在或者可能存在 优缺点 优点:空间效率和查询时间都远远超过一般的算法 缺点:有一定的误判率、删除困难 它实质上是一个很长的二进制向量和一系列随机映射函数(Hash函数) 常见应用 网页黑名单系统、垃圾邮件过滤系统、爬虫的网站判重系统、解决缓存穿透问题 原理 假设布隆过滤器由20位二进制、3个哈希函数组成,每个元素经过哈希函数处理都能生成一个索引位置 添加元素:将每一个哈希函数生成的索引位置都设为1 查询元素是否存在 如果一个哈希函数生成的索引位置不为1,就代表不存在(100%准确) 如果一个哈希函数生成的索引位置都为1,就代表存在(存在一定的误判率) 添加、查询的时间复杂度都是:O(k),k是哈希函数的个数。 空间复杂度是:O(m),m是二进制位的个数 误判率

【Python数据结构与算法笔记day06】1.4. 算法效率衡量+执行时间反应算法效率+单靠时间值绝对可信吗?+时间复杂度与“大O记法”+如何理解“大O记法”+最坏时间复杂度+时间复杂度的几条基本计

百般思念 提交于 2020-02-01 16:08:04
文章目录 1.4. 算法效率衡量 算法效率衡量 执行时间反应算法效率 单靠时间值绝对可信吗? 时间复杂度与“大O记法” 如何理解“大O记法” 最坏时间复杂度 时间复杂度的几条基本计算规则 1.4. 算法效率衡量 算法效率衡量 执行时间反应算法效率 对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(214.583347秒相比于0.182897秒),由此我们可以得出结论: 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。 单靠时间值绝对可信吗? 假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的! 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢? 时间复杂度与“大O记法” 我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。算然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的

P1631 序列合并

99封情书 提交于 2020-01-31 04:49:36
P1631 序列合并 题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。 输入格式 第一行一个正整数N; 第二行N个整数Ai​, 满足Ai​≤Ai+1​且Ai​≤10^9; 第三行N个整数Bi​, 满足Bi​≤Bi+1​且Bi​≤10^9. 【数据规模】 对于50%的数据中,满足1<=N<=1000; 对于100%的数据中,满足1<=N<=100000。 输出格式 输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。 输入输出样例 输入 3 2 6 6 1 4 8 输出 3 6 7 如果暴力枚举的话,空间复杂度使O(N^2),时间复杂度是N^2*log(N) 首先对A,B数组进行排序 方法1:设Ax为A数组中的第x个数,By为B数组中的第y个数,若Ax+By排前n,则x*y<=n; 由此推知, 若从A数组中取前1个数,则B数组中可以取前n个数; 若从A数组中取前2个数,则B数组中可以取前n/2个数; 若从A数组中取前3个数,则B数组中可以取前n/3个数; ...... 若从A数组中取前n个数,则B数组中可以取前1个数. 最后对这些数进行排序,前n个数便是答案 时间复杂度是O(nlogn*logn)(对nlogn个数进行排序,时间复杂度是logn) AC代码: #include <bits

查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

左心房为你撑大大i 提交于 2020-01-31 04:18:09
散列表 散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入、删除、查找操作时间复杂度是 O(logn)。 跳表 跳表,插入、删除、查找操作时间复杂度是 O(logn)。 散列表 vs 二叉查找树 相对散列表,二叉查找树好像并没有什么优势,那我们为什么还要用二叉查找树呢? 第一, 散列表中的数据是无序存储的 ,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。 第二,散列表扩容耗时很多,而且当 遇到散列冲突时,性能不稳定 ,尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。 比如:红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树 第三,笼统地来说,尽管散列表的查找等操作的时间复杂度是常量级的,但 因为哈希冲突的存在,这个常量不一定比 logn 小 ,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。 第四, 散列表的构造比二叉查找树要复杂 ,需要考虑的东西很多

【线段树】牛客 k小数查询 (区间线段树套权值线段树)

社会主义新天地 提交于 2020-01-31 01:19:26
K小数查询 题意: 给一个长度为 n 数列 A ,然后m个操作,有如下两种: · 1 l r x,表示对i \(\in\) [l,r],令 \(A_i=min(A_i,x)\) · 2 l r k,表示询问区间[l,r]中第 k 小的数。 输入描述: 第一行输入两个整数 \(n,m(1≤n,m≤8×10^4)\) 。 接下来一行 n 个整数描述数组 \(A(1≤A_i≤n)\) 。 接下来 m 行每行描述一个操作,操作格式与题面中相同,保证 \(1≤l≤r≤n,1≤k≤r−l+1,1≤x≤10^9\) 输出描述: 对于每组询问,输出一个整数表示答案。 官方题解: 考虑区间线段树套权值线段树求区间k小值的算法:对 \([1,n]\) 建线段树,每一个线段树节点 \([l,r]\) ,用一棵动态开点的权值线段树记录 \([l,r]\) 中每种权值出现了多少次。 如果能够维护这样的数据结构,询问就可以转化为在 \(O(logn)\) 棵权值线段树上二分,能在 \(O(lon^2n)\) 的时间里得到答案。 修改时,首先和普通的区间线段树一样,定位到某些节点[l,r]:这次修改相当于把内层线段树中所有大于等于 \(x\) 的数并到 \(x\) 的位置,这可以被转化成 \(t+1\) 次线段树单点修改操作,其中 \(t\) 为被并入的节点个数。把这 \(t+1\) 次修改应用到内层线段树 \

数据结构与算法(时间复杂度和大O表示法)

江枫思渺然 提交于 2020-01-31 00:18:34
对于上一部分中的问题 算法介绍 。运行时间花费了120s,当然配置稍微低点的会花费更久的时间。并且如果将1000改为10000,甚至更高,那么花费的时间将会更加高。这里有没有一种方法对该算法进行优化呢? 对于该问题,我们不难发现,对于已经确定的a,b,那么c是唯一确定的,因为 c = 1000 − a − b c=1000-a-b c = 1 0 0 0 − a − b ,有了这样的一个思想,我们对上述代码进行改进 import time start_time = time.time() for a in range(1001): for b in range(1001): c = 1000-a-b if a**2+b**2==c**2: print("a,b,c:%d,%d,%d"%(a,b,c)) end_time = time.time() print("time:%d"%(end_time-start_time)) print('finished') 结果 a,b,c:0,500,500 a,b,c:200,375,425 a,b,c:375,200,425 a,b,c:500,0,500 time:0 finished 与之前进行对比发现,改进后的代码运行时间少了很多,花费不到1秒时间 那么我们应该如何来衡量算法的效率呢?下面有几种方式 算法效率衡量 执行时间反应算法效率

12 - 排序算法基础

此生再无相见时 提交于 2020-01-30 16:00:39
1. 排序算法介绍 排序也称为排序算法。排序是将一组数据依指定的顺序进行排列的过程 2. 时间频度 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多 其中 语句执行次数 称为 语句频度/时间频度 ,记为 T(n) 随着n的变大,时间频度有3个特点 (1) 忽略 常数项 2n+20 和 2n 随着n 变大,执行曲线无限接近, 20可以忽略 3n+10 和 3n 随着n 变大,执行曲线无限接近, 10可以忽略 (2) 忽略 低次项 2n^2+3n+10 和 2n^2 随着n 变大, 执行曲线无限接近, 可以忽略 3n+10 n^2+5n+20 和 n^2 随着n 变大,执行曲线无限接近, 可以忽略 5n+20 (3) 忽略 系数项 随着n值变大,5n^2+7n 和 3n^2 + 2n ,执行曲线重合, 说明指数为2下, 5和3可以忽略 而n^3+5n 和 6n^3+4n ,执行曲线分离,说明多少次方是关键 3. 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),使得当n趋近于无穷大时, T(n) / f(n) 的极限值为不等于零的常数 ,则称f(n)是T(n)的 同数量级函数 。记作 T(n)=O( f(n) ) ,称O( f(n) ) 为 算法的渐进时间复杂度 ,简称

数据结构之数组

守給你的承諾、 提交于 2020-01-30 11:10:54
数据结构的分类 数据结构按照数据的排列特点可以分为线性表和非线性表。 线性表:数据排成一排,像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。比如数组、链表、队列,栈等。 非线性表:数据之间并不是简单的前后关系。比如:树、图,堆等。 数组的定义 数组是一种很常见的数据结构,我们学习的没门语言都会涉及。那么数组又是怎样定义的呢? 数组(Array)是一种线性表数据结构。它用连续的内存空间,来存储一组具有相同类型的数据。 数组的特性 支持随机访问。高效的查找,低效的插入和删除。 我们先来看插入操作。 假如数组的长度为n,现在,如果我们需要将一个数据插入到数组中的第k个位置。为了把第k个位置腾出来,给新的数据,我们需要将第k~n这部分的元素都顺序地往后挪一位。那插入操作的时间复杂度是多少呢? 如果在数组的末尾插入元素,那就不需要移动数据了,这个时候的时间复杂度为O(1)。但如果在数组的开头插入元素,那所有的数据都要一次往后移动一位,所以最坏时间复杂度是O(n)。因为每个位置插入元素的概率是一样的,所以平均情况时间复杂度为(1+2+…+n)/n=O(n)。 如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,就必须按照刚才的方法搬移k之后的数据。但是如果数组中存储的数据没有任何规律,数组就只是一个存储数据的集合。在这种情况下,如果要将某个数据插入到第k个位置