时间复杂度

test2

冷暖自知 提交于 2019-12-01 10:22:49
栈是一种在竞赛中非常实用的基础数据结构。本篇笔记主要记录了栈的一些例题与技巧。 基本性质 对于一个栈,保证有以下性质 先入栈的元素一定后出 后入栈则反之 例如对于$3,6,0,1,2$这一组数据来说,假设我们将他们全部入栈,再全部出栈,那么出栈后的序列为$2,1,0,6,3.$ 【例题】$push,pop,Getmin$ 实现一个栈,支持入栈,出栈和查询最小值的工作,要求时间复杂度均为$O(1).$ $ $对于入栈、出栈的功能,$c++ STL stack$中自带的函数时间复杂度为$O(1)$。但是对于查询最小值而言,栈本身的性质并不支持这种操作。 $ $我们可以考虑在维护一个$stack$的同时,再维护一个二叉堆(即优先队列),这样就可以达到题目的要求。然而,这样的时间复杂度为$O(logN).$ $ $所以我们需要一种更高效的算法。我们发现,每一次入栈、出栈的时间复杂度均为$O(1)$;而我们又知道,假设有两个数$x,y$,当我们每对这两个数做出一次比较是,时间复杂度也是$O(1).$我们利用这样的性质,同时维护两个栈结构$P_1,P_2$,其中$P_1$存放的是原本的数据,而$P_2$存放的是从$P_1$栈底$P_{1_{0/1}}$至当前栈顶$P_{1_n}$的最大值。 $ $这样,我们就可以梳理出一个程序的脉络$.$ 若此次执行的是$push$操作,则将此元素$x$压进

第二章作业

旧时模样 提交于 2019-12-01 10:18:09
一、对分治思想的体会 1、帮助我们解决问题。 分治法,对大的问题拆封成规模较小的问题,我们求解小问题,再把小问题的答案合并起来,得出大问题的答案。大问题思考起来比较乱,犯迷糊,不易想到解决方法,比如汉诺塔问题。分解成小问题,我们就容易想出方法来解决问题 2、时间复杂度低 分治法思想核心是递归,递归的时间复杂度低。算法的复杂度低,提高了算法的质量 二、结对编程情况汇报 有一道题没有按时间复杂度为O(logn)编程,后来查找资料知道如何写出O(logn)的算法。锻炼了我以多种方式去思考问题,从而得出最好的答案。 来源: https://www.cnblogs.com/mhw-84/p/11680052.html

模拟测试71

北战南征 提交于 2019-12-01 10:04:55
T1:   直接搜索子集复杂度太高,考虑meet in the mid。   先将两段内部的答案处理出来,暴力枚举子集即可。   将所有数分成两半,在前一半里枚举集合和子集,在后一半里枚举集合,判断前一半的子集是否为并集的一半,再反过来枚举一遍。   时间复杂度$O(6^{\frac{n}{2}})$。 T2:   先判断无解情况。   考虑逆序关系,每个数只能接受一个方向的逆序关系,且不能不接受逆序关系。   然后就可以DP了。   设$dp[i][j]$为在前$i$个数中$i$的排名为$j$的方案数。   当$i$存在向右的逆序关系,$dp[i][j]=\sum \limits_{k=1}^{j-1}dp[i-1][k]$。   反之,$dp[i][j]=dp[i-1][j-1]$。   前缀和优化一下即可。   时间复杂度$O(n^2)$。 T3:   一道正解是随机化的题。   将所有的$x$random_shuffle一下,然后枚举,先判断当前值是否比之前更优,若不能让答案更优,直接continue掉。   如果能使答案更优,在二分答案。   能让答案变优的$x$的期望个数为$logp$个,所以时间复杂度为$O(nlognlogp)$。 来源: https://www.cnblogs.com/hz-Rockstar/p/11678456.html

Redis

南笙酒味 提交于 2019-12-01 09:37:13
简介 开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件 数据结构 字符串(strings) 散列(hashes) 列表(lists) 集合(sets) 有序集合(sorted sets) https://www.cnblogs.com/jasontec/p/9699242.html redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)。 Redis用作缓存,主要两个用途:高性能,高并发,因为内存天然支持高并发。 应用场景 分布式锁(string) setnx key value,当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存在,则setnx不做任何动作,返回0。 当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁,如果setnx返回0表示获取锁失败,整体思路大概就是这样,细节还是比较多的,有时间单开一篇来讲解。 计数器(string) 如知乎每个问题的被浏览器次数: 分布式全局唯一id(string) 分布式全局唯一id的实现方式有很多,这里只介绍用redis实现。 每次获取userId的时候,对userId加1再获取,可以改进为如下形式: 直接获取一段userId的最大值

NOIp2017时间复杂度

江枫思渺然 提交于 2019-12-01 09:05:15
比较复杂,调了好长时间不过以后再遇到这类题就好多了. 注意:   1.栈里面存储时间复杂度,当循环不进去时赋值为-1000000(很小的数);   2.即使已经判断为err也不能退出,要接着把数据读完,否则会影响到下一组读入的数据   3.使用了 sscanf将字符转换为数字,不能写成x=sscanf(); sscanf(字符,"%d",&x); #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; inline bool isnum(char x){ return x>='0'&&x<='9'; } int main(){ int testcase; scanf("%d",&testcase); while(testcase--){ int L,top=0,ans=0,sta[105][3]; char tm[10]; bool flag=1,vis[200]; memset(vis,0,sizeof(vis)); sta[0][0]=sta[0][1]=0; scanf("%d%s",&L,tm); while(L--){ char a[10],b[10],c[10],d[10]; scanf("%s",a); if(a[0]=='F'){

python常用算法学习(3)

点点圈 提交于 2019-12-01 08:32:56
1,什么是算法的时间和空间复杂度   算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大的区别。   那么我们应该如何去衡量不同算法之间的优劣呢?   主要还是从算法所占用的 时间 和 空间 两个维度取考量。 时间维度:是指执行当前算法所消耗的时间,我们通常使用时间复杂度来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用空间复杂度来描述   因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况,然而,有的时候时间和空间却又是鱼与熊掌,不可兼得,那么我们就需要从中去取一个平衡点。   下面分别学习一下时间复杂度和空间复杂度的计算方式。 1.1 时间复杂度   我们想要知道一个算法的时间复杂度,很多人首先想到的方法就是把这个算法程序运行一遍,那么它所消耗的时间就自然而然的知道了。这种方法可以吗?当然可以,不过它也有很多弊端。   这种方式非常容易受运行环境的影响,在性能高的机器上跑出来的结果与在性能低的机器上跑的结果相差会很大。而且对测试时使用的数据规模也有很大关系。再者我们再写算法的时候,还没有办法完整的去运行呢,因此,另一种更为通用的方法就出来了:大O符号表示法,即T(n) = O(f(n))。   我们先看一个例子: for(i=1; i

时间复杂度o(1), o(n), o(logn), o(nlogn)

孤街醉人 提交于 2019-12-01 08:14:24
1、时间复杂度o(1), o(n), o(logn), o(nlogn)。算法时间复杂度的时候有说o(1), o(n), o(logn), o(nlogn),这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 2、时间复杂度为O(1)。 是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话) 3、时间复杂度为O(n)。 就代表数据量增大几倍,耗时也增大几倍。 比如常见的遍历算法。再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。 比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。 4、时间复杂度为O(logn)。 当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。 二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。 指数函数,一般地,y=a^x函数(a为常数且以a>0,a≠1)叫做指数函数。y

算法第二章递归与分治策略小结

北战南征 提交于 2019-12-01 08:03:22
第2章 递归与分治策略 2.1.递归的概念 递归算法:直接或间接地调用自身的算法 递归函数:用函数自身给出定义的函数 !!!!递归函数的第一句一定是if语句作为边界条件,然后就是递归方程 如:阶乘函数的第一句就是if条件语句 1 int factorial(int n){ 2 if( n ==0) 3 return 1; 4 return n*factorial(n-1); 5 } ※※※递归函数中比较著名的是Hanoi塔问题 Hanoi塔问题。 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座c上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。 hanoi塔问题题目描述 1 #include<iostream> 2 using namespace std; 3 void move(char p1,char p2){ 4 cout<<p1<<"->"<<p2<<endl; 5 } 6 7 //将a上的n个盘子经b移动到c上 8 void hanoi(int n,char a,char b,char

分治法思想与体会

本秂侑毒 提交于 2019-12-01 07:57:00
  分治,即分而治之,是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原文题的解。其算法设计模式如下: divide-and-conquer(P){   if (|P|<=n0)     adhoc(P);   divide P into smaller subinstances P1,P2,...,Pk;   for (i=1; i<=k; i++)     yi = divide-and-conquer(Pi);   return merge(y1,y2,...,yk); 在人们大量的实践中,发现在用分治法的时候,使子问题规模大致相同是最好的,,而许多问题中,将一个问题分成大小相等的k个子问题的处理方法(一般情况下k=2)几乎总是比子文体规模不等的好。   对分治法深有体会的一次是第一次结对编程那会的第二题。原先老师还没要求时间复杂度为O(log2 n)时,我是直接在main函数里直接写了if进行判断的,然后一堆的判断语句。把时间复杂度扩大到了O(n)。后来就开始思索要怎样将复杂度变小。当时是明确知道要用二分法才能将时间复杂度变小,但还不知道怎么在find函数里添加语句进行判断。用二分法就可以将时间复杂度变为O(log2 n)。后来加上了下面这两个语句。   if(x<a[l]) cout<<l

算法排序----插入排序法

自古美人都是妖i 提交于 2019-12-01 07:56:11
接下来我来讲述一下插入排序法。 首先来解释一下插入排序法的原理,它的原理是每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。那么也就是说,每次插入一个数都要对原来排序好的那部分序列进行重新的排序,时间复杂度同样为O(n²)。 这种算法是稳定的排序方法。 直接插入排序算法分析 根据代码我们来解释一下直接插入排序的核心 例如,我们要对5,3,4,6,2这几个数进行排序 a[] 0 1 2 3 4 值 5 3 4 6 2 当这个数组进入函数后,下标首先定义到i = 1,即排序前,首先定义为a[0] = 5即是有序的。 进入循环内,比较a[1] 是否小于 a[0] 发现是小于的,这个时候按理说是要把a[0]这个元素右移动1位。然后将a[1]这个元素插在a[0]的位置上 但是考虑到这样子将覆盖原来的a[1]的值,所以先将a[1]的值拷贝一份给temp,然后将a[0]右移一位,再将temp的值传给a[0] .即 a[] 0 1 2 3 4 值 3 5 4 6 2 这时i =2了。此时a[0],a[1]属于有序的序列了,我们此时再次比较a[2]是否小于a[1](前一位),4<5,满足if条件 temp = a[2] 先拷贝一份,再将a[1] 右移一位,再次比较a[0]是否大于temp ,发现3并没有大于4,由此可见只要i前面有序数存在大于a[i