时间复杂度

300_最长上升子序列

懵懂的女人 提交于 2020-01-13 03:07:35
""" 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。 进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? """ # 方法一 动态规划 # 时间复杂度要求达到 o(nlogn)?? 意味着什么?。。意味着可能需采用二分查找 def lengthOfLIS1 ( nums ) : n = len ( nums ) dp = [ 1 ] * n for i in range ( 1 , n ) : for j in range ( i ) : if nums [ j ] < nums [ i ] : dp [ i ] = max ( dp [ i ] , dp [ j ] + 1 ) return max ( dp or [ 0 ] ) # 方法二 二分法 def lengthOfLIS2 ( nums ) : tails , res = [ 0 ] * len ( nums ) , 0 for num in nums : i , j = 0 , res while i < j : m = ( i + j ) /

数据结构之算法

六眼飞鱼酱① 提交于 2020-01-13 01:01:49
算法    算法 —— 对特定问题求解步骤的描述    特性: 输入——有0个或多个输入       输出——有1个或多个输出        有穷性       确定性       可行性 如何评价一个算法的好坏?        正确的       可读性高       时间效率高       存储空间小 算法时间复杂度 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是 算法的时间量度 ,记作:T(n) = O(f(n))。 它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为 时间复杂度 。其中f(n)是问题规模n的某个函数。 推导大O阶方法   1.   用常数取代运行时间中的所有加法常数。   2.   在修改后的运行次数函数中,只保留最高阶项。   3.   如果最高阶项存在且不是,则去除与这个项相乘的常数。得到的结果就是大O阶。 常见的时间复杂度如表:        来源: https://www.cnblogs.com/gaiyin/p/6871709.html

数据结构和算法绪论

大城市里の小女人 提交于 2020-01-13 01:01:22
程序设计 = 数据结构 + 算法 数据结构 :逻辑结构(数据对象中数据元素之间的相互关系)和物理结构(数据的逻辑结构在计算机中的存储形式)。   逻辑结构:集合结构(只有同属一个集合的关系)、线性结构(一对一的关系)树形结构(存在一对多的层次关系)、图形结构(多对多的关系)。   物理结构:顺序存储(把数据放在地址连续的存储单元里,数据间的逻辑关系和物理关系一致)、链式存储(任意存储单元,数据元素的存储关系不能反映其逻辑关系,需要用一个指针存放数据元素的地址)。 常用抽象数据类型: 算法 的五个特性:输入(零个或多个输入)、输出(至少一个输出)、有穷性(有限步骤后结束,每个步骤在可接受时间内完成)、确定性(每个步骤都被精确定义无歧义;在一定条件下只有一条执行路径)、可行性(每个步骤都能通过执行有限次数完成)。 算法设计的要求:   1. 正确性:没有语法错误;对合法输入产生满足要求的输出;对非法输入产生满足规格的说明;对故意刁难的测试输入都有满足要求的输出结果。   2. 可读性:便于阅读。   3. 鲁棒性:输入数据不合法也能做出相关处理。   4. 时间效率高和存储量低。 时间复杂度和空间复杂度 事先分析估算。时间消耗取决于:算法采用的策略、编译产生的代码质量、问题的输入规模、机器执行指令的速度。(所以抛开硬软件因素,程序运行所需时间依赖于算法好坏和输入规模)

数据结构的基本知识、算法

老子叫甜甜 提交于 2020-01-13 01:01:03
数据结构的基本知识 下面的都是摘自《大话数据结构》书中的内容,记下来可以时时查看: 数据:描述客观事物的符号,计算机可以操作的对象; 数据元素:组成数据的有一定意义的基本单位,作为整体能被计算机处理;人是人类的数据元素,牛马是牲畜类的数据元素 数据项:组成数据元素,人的眼睛耳朵就是人这个数据元素的数据项; 注意:数据项是数据的最小单位,不过讨论问题时数据元素才是数据模型的着眼点。 数据对象:性质相同的数据元素的集合,数据的子集 数据结构:相互存在关系的数据元素的集合。 逻辑结构、物理结构 逻辑结构:是指数据对象中数据元素之间的相互关系 集合结构,线性结构,树形结构,图形结构 物理结构:是指数据的逻辑结构在计算机中的存储形式 顺序存储结构,把数据元素存放在地址连续的存储单元里 链式存储结构,数据元素存储在在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系不能反应逻辑关系,因此需要一个指针存放数据元素的地址。 逻辑结构面向问题,物理结构面向计算机。 抽象数据类型 数据类型:一组性质相同的值的集合及定义在次集合上的一些操作的总称。 抽象数据类型:是指一个数学模型及定义在该模型上的一组操作。 一个抽象数据类型定义了:一个数据对象、数据对象中个数据元素之间的关系及对数据元素的操作。 抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性

算法时间复杂度

冷暖自知 提交于 2020-01-12 19:27:04
算法时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。 //简称为大O记法。 注:一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。 大O记法的推断: (1)用常数1取代运行时间中的所有加法常数。 (2)在修改后的运行次数函数中,只保留最高阶项。 (3)如果最高阶项存在且不是1,则除去与这个项相乘的常数。得到的结果就是大O阶。 常用的时间复杂度所消耗的时间从小到大依次是: O(1)<O(logn)<O(n)<O(nlogn)<O(n n)<O(n n*n)<O(2 n)<O(n!)<O(n n) 一:常数阶O(1) int sum = 0, n = 100; sum = (1 + n)*n / 2; printf("%d\n", sum); //高斯算法 这里代码有三行,但是时间复杂度是O(3),而不是O(1),这是根据大O记法推断出来的,第一步就是让一替换三。 二:线性阶 int i=0; //1 for(i =0 ;i<n;i++)//n+1 { /*

算法 一些基本概念

穿精又带淫゛_ 提交于 2020-01-12 11:17:43
(以下是本人在学习程杰老师的《大话数据结构》所做的笔记) 一、算法的定义 算法(Algorithm)是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 二、算法的特性 1.输入输出 2.有穷性 3.确定性 4.可行性 三、算法的要求 1.正确性 2.可读性 3.健壮性 4.时间效率高和存储量低 四、算法效率的度量方法 1.事后统计方法(不科学、不准确) 2.事前分析估算方法 在分析程序的运行时间时,最重要的是把程序看成独立于程序设计语言的算法或一系列步骤。 五、算法的渐近增长 函数的渐近增长(概念):给定两个函数 f(n) 和 g(n),如果存在一个整数N,使得对于所有的 n>N, f(n) 总是比 g(n) 大,那么我们说 f(n) 的增长渐近快于 g(n) 。 (我的理解)就是给两个函数,n表示他们的规模,但n大于某一个值的时候,一个函数的值总是比另一个函数的大,那么我们可以理解这个函数渐近增长较快。 六、算法的时间复杂度(重点、难点) 1.算法的时间复杂度定义:在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模n的函数,进而分析 T(n) 随n的变化情况并确定 T(n) 的数量级。算法的时间复杂度(算法的时间量度)记作 T(n) = O(f(n))。表示随着问题规模n的增长,算法执行的时间的增长率和 f(n) 的增长率相同

数据结构——树(知识总结)

删除回忆录丶 提交于 2020-01-12 06:52:02
文章目录 图的应用 最小生成树 普里姆(prim)算法 克鲁斯卡尔(Kruskal)算法 最短路径 迪杰斯特拉(Dijkstra)算法 弗洛伊德(Floyd)算法 图的应用 最小生成树 普里姆(prim)算法 克鲁斯卡尔(Kruskal)算法 prim算法时间复杂度为 O(n^2) ,克鲁斯卡尔算法时间复杂度为 O(eloge) 。对于两个算法,克鲁斯卡尔算法对于 稀疏图 优势大,而普里姆算法对于 稠密图 更好一点。 最短路径 迪杰斯特拉(Dijkstra)算法 问题抽象:在有向网中A点到达B点的多条路径中,寻找一条各边权值之和最小的路径,即最短路径 弗洛伊德(Floyd)算法 两种算法的时间复杂度都是O(n^3),对有向图和无向图都适用。 来源: CSDN 作者: 丶LJW 链接: https://blog.csdn.net/weixin_43246440/article/details/103884963

莫队算法良心讲解

对着背影说爱祢 提交于 2020-01-12 05:13:57
问题:有n个数组成一个序列,有m个形如询问L, R的询问,每次询问需要回答区间内至少出现2次的数有哪些。   朴素的解法需要读取O(nm)次数。如果数据范围小,可以用数组,时间复杂度为O(nm)。如果使用STL的Map来保存出现的次数,则需要O(nmlogn)的复杂度。有没有更快的方法呢?   注意到询问并没有强制在线,因此我们可以使用离线方法。注意到一点,如果我们有计算完[L, R]时的“中间变量”(在本题为每个数出现的次数),那么[L - 1, R]、[L + 1, R]、[L, R - 1]、[L, R + 1]都能够在“中间变量”的“基本操作时间复杂度” (1) 得出。如果能安排适当的询问顺序,使得每次询问都能用上上次运行产生的中间变量,那么我们将可以在更优的复杂度完成整个询问。 (1) 如果数据较小,用数组,时间复杂度为O(1);如果数据较大,可以考虑用离散化或map,时间复杂度为O(logn)。   那如何安排询问呢?这里有个时间复杂度非常优秀的方法:首先将每个询问视为一个“点”,两个点P1, P2之间的距离为abs(L1 - L2) + abs(R1 - R2),即曼哈顿距离,然后求这些点的最小生成树,然后沿着树边遍历一次。由于这里的距离是曼哈顿距离,所以这样的生成树被称为“曼哈顿最小生成树”。最小曼哈顿生成树有专用的算法 (2) ,求生成树时间复杂度可以仅为O

二维数组-最大子数组

浪子不回头ぞ 提交于 2020-01-11 20:53:52
一 题目:求二维数组中最大子数组的和 结对开发人员: 朱少辉:负责程序分析,代码编程 侯涛亮:负责代码复审和代码测试 二 设计思路 我认为若想求二维数组中最大子数组,可以将二维数组化为一维数组,在对其求连续子数组最大值。那么如何将一个二维数组化为一维数组呢?可以举一个例子,如下: i=0 5 6 -3 8 -9 2 i=1 1 -12 20 0 -3 -5 i=2 -9 -7 -3 6 7 -1 例子为一个3*6矩阵,令其为a[3][6]。由于可以行行相加或列列相加转化为一维数组,在这为行行相加,故附设一个一维数组是s[6],初值均为0。附设两变量SUM和MAX,max初始值为a[0][0]即5。当i=0时,将a[0][0]-a[0][5]的值赋给s[6],用求一维最大子数组的方法求得最大值赋给MAX,然后,再将i=1行的元素加到第一行(即s[j]=s[j]+a[1][j])再赋值给s[6],求最大子数组,然后接着将第三行元素往上加(即s[j]=s[j]+a[2][j]),最后求得含第一行元素的子矩阵的最大值。把s[6]回归为0。同理,从第二行开始,依次往下加,从第三行开始....最后可求得最大子矩阵的值。这种算法的时间复杂度为O(n^3). 三 代码实现 #include<iostream> using namespace std; void main() { int m,n,i

简单排序算法(1)

懵懂的女人 提交于 2020-01-11 17:21:47
认识时间复杂度 常数时间的操作 一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。 时间复杂度为一个算法流程中,常数操作数量的一个指标。常用0(读作big 0)来表示。具体 来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作, 进而总结出常数操作数量的表达式。 在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为千(N),那 么时间复杂度为。(f(N))。 评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行 时间,也就是“常数项时间”。 选择排序、冒泡排序细节的讲解与复杂度分析 时间复杂度0(N^2),额外空间复杂度0(1) 插入排序细节的讲解与复杂度分析 时间复杂度0(N^2),额外空间复杂度0(1) 算法流程按照最差情况来估计时间复杂度 二分法的详解与扩展 1) 在一个有序数组中,找某个数是否存在 2) 在一个有序数组中,找>=某个数最左侧的位置 3) 局部最小值问题 异或运算的性质与扩展 1) 0^N == N N^N == 0 2) 异或运算满足交换律和结合率 3) 不用额外变量交换两个数 4) 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这一个数 5) 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到这两个数 对数器的概念和使用 1