时间复杂度

左神算法书籍《程序员代码面试指南》――2_05环形单链表的约瑟夫问题

匿名 (未验证) 提交于 2019-12-02 23:49:02
【题目】 据说著名犹太历史学家Josephus有过以下故事: 在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中, 39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈, 由第1个人开始报数,报数到3的人就自杀,然后再由下一个人重新报1,报数到3的人再自杀, 这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。 这就是著名的约瑟夫问题。现在请用单向环形链表描述该结构并呈现整个自杀过程。 输入:一个环形单向链表的头节点head和报数的值m。 返回:最后生存下来的节点,且这个节点自己组成环形单向链表,其他节点都删掉。 进阶: 如果链表节点数为N,想在时间复杂度为O(N)时完成原问题的要求,该怎么实现? 【题解】 整个进阶解法的过程总结为: 1.遍历链表,求链表的节点个数记为n,时间复杂度为O(N)。 2.根据n和m的值,还有上文分析的Num(i - 1)和Num(i)的关系,递归求生存节点的编号;这一步的具体过程请参看如下代码中的getLive方法,getLive方法为单决策的递归函数,且递归为N层,所以时间复杂度为O(N)。 3.最后根据生存节点的编号,遍历链表找到该节点,时间复杂度为O(N)。 4.整个过程结束,总的时间复杂度为O(N)。 1 #include<iostream> 2 3 using

1.数据结构与算法简介

匿名 (未验证) 提交于 2019-12-02 23:49:02
例题:(问题规模) 如果a+b+c = 1000, 且a^2 + b^2 = c^2(a,b,c为自然数),如何求出所有a, b, c可能的组合? import time # def condition_solution(): # start_time = time.time() # for a in range(1001): # for b in range(1001): # for c in range(1001): # if 1000 == a + b + c and a*a + b*b == c*c: # print("a, b, c: %d, %d, %d" % (a, b, c)) # end_time = time.time() # cost = end_time - start_time # pri# nt("cost: %f" % cost) # def condition_solution (): start_time = time . time () for a in range ( 1001 ): for b in range ( 1001 ): c = 1000 - a - b if 1000 == a + b + c and a * a + b * b == c * c : print ( "a, b, c: %d, %d, %d" % ( a , b

时间复杂度

匿名 (未验证) 提交于 2019-12-02 23:49:02
时间复杂度的计算就是 执行次数*变量i 例子: eat1( { for( {; out.println( "等待一天"); out.println( "等待一天"); out.println( "吃一寸面包"); } 2. eat2( for( 2){ out.println( "等待一天"); out.println( "等待一天"); out.println( "等待一天"); out.println( "等待一天"); out.println( "吃一半面包"); }

数据结构 --- 01. 时间复杂度,timeit模块,栈,队列,双端队列

匿名 (未验证) 提交于 2019-12-02 23:49:02
一.时间复杂度   1.基本概念 评判程序优劣的方法:   消耗计算机资源和执行效率(无法直观)   计算算法执行的耗时(适当推荐,因为会受机器和执行环境的影响)   时间复杂度(推荐) 时间复杂度   评判规则:量化算法执行的操作/执行步骤的数量   最重要的项:时间复杂度表达式中最有意义的项   大O记法:O(时间复杂度表达式中最有意义的项)常见的时间复杂度: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)   2.示例说明 ① a=5 b=6 c=10 for i in range(n): for j in range(n): x = i * i y = j * j z = i * j for k in range(n): w = a*k + 45 v = b*b d = 33 3+3n**2+2n+1用大O记法:O(n**2) ② def sumOfN(n): theSum = 0 for i in range(0,n+1): theSum = theSum + i return theSum print(sumOfN(10)) 用大O记法:O(n) ③三种不同数据结构的时间复杂度 [ ['tom',100],['jay',99] ] #O(n) [ ('tom'

[NOIP2017] 时间复杂度

匿名 (未验证) 提交于 2019-12-02 23:43:01
按题意模拟即可 语法的检查是在整个程序执行前先进行的,因此即使在无法进入的循环中(x>y),变量名也不能重名 输入的数据要读完,不要中途 break(如果一边检查语法一边判断复杂度) #include<cstdio> #include<cctype> #include<algorithm> using namespace std; int t,l; char o[10]; char p[10],x[10],y[10]; void solve(){ char c[1000]={0};// 栈 - 变量名 int s[1000]={0},top=0;// 栈 - 每个循环复杂度的累加值 int vis[30]={0},err=0,w=0;//n^w scanf("%d%s",&l,o); for(int i=1;i<=l;i++){ scanf("%s",p);// 第一个字符 if(p[0]=='F'){ scanf("%s%s%s",p,x,y);// 全部当成字符串处理 if(err)continue; // 计算 ix,iy int ix=0,iy=0; if(x[0]=='n')ix=0x3f3f3f3f; else for(int j=0;x[j];j++)ix=ix*10+x[j]-'0'; if(y[0]=='n')iy=0x3f3f3f3f; else for(int

分治[2019.5.25]

匿名 (未验证) 提交于 2019-12-02 23:42:01
  1、为最近对问题的一维版本设计一个直接基于分治技术的算法,并确定它的时间复杂度。假设输入的点是以升序保存在数组A中。(最近点对问题定义:已知上m个点的集合,找出对接近的一对点。)   思路:通过分治和递归将问题自顶向下分为层层的子问题,然后每层中子问题自底向上min向上比较。   输入:保存升序点序列的数组A int Close(int A[a...b]){ if(a==b)return error; else if(b-a==1)return A[b]-A[a]; else{ int c = int((a+b)/2); //多个数时,分治&递归求每个子问题,然后min return min{Close(A[a…c]), Close(A[c...b]), A[c+1]-A[c]}; } }   输出:最近的一对数的距离   时间复杂度:θ(n)   2、设计一个分治算法来计算二叉树的层数.(空树返回0,单顶点树返回1),并确定它的时间复杂度.   思路:水题,对于二叉树T,若为空树,则高度为0;否则,分别求左子树和右子树高度,递归即可。   输入:二叉树T int height(Tree T){ if T=NULL return 0; else return max{height(left_T),height(right_T)}+1; }   输出:二叉树的层数   时间复杂度

常见数据结构的查找、插入、删除时间复杂度

匿名 (未验证) 提交于 2019-12-02 23:41:02
(1)向一个有序数组中插入一个数的时间复杂度是多少? 查找插入位置如果用遍历查找的是O(n),用二分查找是O(log2n)。 但是数组的插入操作需要将插入位置后的元素全部后移一位,这需要O(n)。 所以总的时间复杂度是O(n)。(O(n)+O(n)=O(n),O(log2n)+O(n)=O(n)) (2) 有序链表查找的时间复杂度是O(n)的原因是什么? 折半查找对链表而言根本不能达到O(logN)的效率。只有当访问集合中任何一个元素的时间是常量O(1)时间时,折半查找才能达到O(logN),而链表访问其中元素的平均时间是O(N)即线性时间。对用数组构造的集合才能使用折半查找。

时间复杂度和空间复杂度

匿名 (未验证) 提交于 2019-12-02 23:38:02
目录: 1.衡量一个算法的好坏 2.时间复杂度 3.时间复杂度的大O渐进表示法 4.时间复杂度的:最优、平均、最差情况,为什么时间复杂度看的是最差情况 5.求解:二分查找、递归求阶乘、递归斐波那契的时间复杂度 6.空间复杂度 7.求空间复杂度?普通函数& 递归函数 8.分析递归斐波那契数列的:时间、空间复杂度,并对其进行优化,伪递归优化->循环优化 1.针对一个问题可以有很多种的算法方法来解决问题,当然我们最喜欢的还是最简单的、最高效的。如何衡量算法的好坏,是学习算法的重要基础。 1.)最初,用所需要的计算时间来衡量一个算法的好坏 2.)但不同的是机器相互之间无法比较 3.)需要用独立于具体计算机的客观衡量标准 a.)问题的规模 b.)基本运算 c.)算法的计算量函数 2.时间复杂度 算法的时间复杂度是一个函数,他定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表示,不包括这个函数的低阶项和首阶项系数。使用这种方法时,时间复杂度可被称为是渐进的,亦即考察输入值大小趋近无穷时的情况。 3.大O的渐进表示法 实际中我们计算时间复杂度时,并不一定要计算精确的执行次数而只需大概执行次数,这里我们使用大O的渐进表示法 大O(Big O notation):用于描述函数渐进行为的数学符号。 推导大O阶方法: 1.)用常数1取代运行时间中的所有加法常数

顺序表

匿名 (未验证) 提交于 2019-12-02 23:35:02
今天我学习了顺序表,学习了顺序表怎么插入,删除,查找一个元素。顺序表是数据逻辑有连续性,物理存储上也有连续性。看了插入,删除等的时间复杂度。 在顺序表的头部和中间插入的话时间复杂度为O(n),尾部插入的话时间复杂度平均为O(1); 在顺序表的头部和中间删除的话时间复杂度为O(n),尾部删除的话时间复杂度为O(1); 查找一个元素的复杂度为O(n)。 下来准备学习链表的内容。 转载请标明出处: 顺序表 文章来源: https://blog.51cto.com/14232274/2400101

350. 两个数组的交集 II

匿名 (未验证) 提交于 2019-12-02 23:34:01
题目 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 我们可以不考虑输出结果的顺序。 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办? 分析 和两个数组的交集I 相比,这道题要求不去掉重复,而哈希表不能储存重复的key 上一题中哈希表key和value我们只用了一个key而已,所以这道题value再存个元素出现的次数就ojbk了 时间复杂度O(N) 空间复杂度O(N) 代码 public int[] Intersect(int[] nums1, int[] nums2) { if (nums1 == null || nums2 == null || nums1.Length == 0 || nums2.Length == 0) { return new int[] { }; } //调整nums1为小数组 if