时间复杂度简述及例题
一,时间复杂度
一个算法需要的运算时间常与问题规模有关,问题规模是一个和输入有关的量n,通常把算法运行需要的时间T表示为n的函数,为T(n)
不同的算法中,n增长时,T增长的快慢很不相同,一个算法所需的执行时间就是该算法中所有语句执行次数之和,当n逐渐增大时,T(n)的极限情况,简称为时间复杂度
二,常用的时间复杂度大小次序
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
数量级越大,该算法效率越低
三,分析算法时间复杂度
x=0;y=0;for(k=1;k<=n;k++)x++;for(i=1;i<=n;i++)for(j=1;j<=n;j++)y++;分析:
其包含两个循环体,第一个循环的时间复杂度为n
第二个是双重循环,其时间复杂度为n^2,所以以上程序的时间复杂度是:T(n)=n+n^2则其时间复杂度为:T(n)=O(n^2)
i=1;
while(i<=n)i=2*i;分析:
第3行执行次数是f(n),则2^f(n)<=n所以T(n)=O(log2n)
void mult(int a[][N],int b[][N],int c[][N])
{for(i=0;i<n;i++)for(j=0;j<n;j++){c[i][j]=0;for(k=0;k<n;k++)c[i][j]+=a[i][k]*b[k][j];}
}分析:
嵌套循环为每层循环次数的乘积,因为该函数三重循环
所以时间复杂度为:T(n)=O(n^3)
四,例题
例题一:(洛谷) P2249 查找
分析:
1,一般测试点都会有一个极限数据,所以要分析时间复杂度,确保能过所有测试点。
2,如果用平常的循环访问查找,n个系数,处理m个访问,其时间复杂度是O(nm)=10^6 * 10^5 = 10^11,而测评机1秒只会执行10^9次运算,所以一定会超时,因此要寻找其他算法来解题。
3,查找算法中,根据不同情况有不同解法,我们先接触到的是二分算法,其时间复杂度是O(log2n),所以值得一试。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define N 1000006int n,m,a[N],s;int find(int s){//二分算法本体int r=n,l=1;while (r>l){int mid = (r+l)/2;if(a[mid] >= s)r = mid;else l = mid+1;}if(a[l] == s)return l;else return -1;
}int main(){cin>>n>>m;for(int i = 1;i <= n;i++){cin>>a[i];}for(int j = 1;j <= m;j++){cin>>s;cout<<find(s)<<" ";}return 0;
}
例题二:(洛谷) P8780 [蓝桥杯 2022 省 B] 刷题统计
分析:
先看问题规模,如果用普通循环来计算,必超时,但是这题又不用查找,所以要想办法,把不必要的计算部分舍掉。
代码如下(简单版):
#include<iostream>
using namespace std;int main(){long long a,b,c,i,weeks,left,sum=0;cin>>a>>b>>c;weeks = c / (a*5+b*2);//需要几个星期left = c % (a*5+b*2);//几个星期之后剩的题for(i =1;i <= 7;i++){//剩下的题会在这个星期之内做完if(i>5){sum += b;if(sum >= left)break;//如果剩下的题能在这次sum中做完,就结束}else {sum += a;if(sum >= left)break;}}if(left == 0)cout<<weeks*7<<endl;else cout<<weeks*7+i<<endl;return 0;
}
时间复杂度简述及例题相关推荐
- 时间复杂度的简单例题
时间复杂度 1.概念:时间复杂度是指在算法中基本操作重复执行的次数,可表达为O(1),O(n)等. 2.例题 (1)for(i=1;i<=n;i++) K++; for(j=1,j<=n; ...
- 详解时间复杂度计算公式(附例题细致讲解过程)
这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度和空间复杂度,题目虽然写出来了,但是很没底.印象里数据结构老师讲过一点,沉睡的记忆苏醒了.只记得一个时间复杂度是O(n),空间复杂度是S(n). ...
- 时间复杂度详解+例题分析
目录 导语简言 1.what-什么是时间复杂度 2.How-如何表示时间复杂度--大O表示法 概念 表达式推导 3.example-例题解析 导语简言 1.算法时间复杂度:算法执行时间与算法的语句执行 ...
- [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)
文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...
- 创新实践部第一次培训---算法入门
文章目录 引言--我们为什么要学算法 常见基础错误 手(shou)误(jian) 浮点数判等 声明变量和使用变量太远 忘记初始化 数组开小了 变量开小了 建议的代码书写方式 ACM输入输出 ACM错误 ...
- [-算法篇-] 开篇前言
零.前言 [1].从冒泡排序和快速排序引入算法 [2].时间复杂度的引入 [3].空间复杂度的引入 [4].数据结构和算法之间的杂谈 复制代码 关于程序的执行 输入: 原生可用数据 = 数据获取 + ...
- (五)Vue 面试真题演练
Vue 面试真题演练 v-show和v-if的区别 为何在v-for中用key 描述vue组件生命周期(父子组件) vue组件如何通讯(常见) 描述组件渲染和更新的过程 双向数据绑定v-model的实 ...
- 判断是否为二叉排序树的递归算法_左神直通BAT算法笔记(基础篇)
时间复杂度 空间复杂度 经典例题 找出B中不属于A的数 荷兰国旗问题 矩阵打印问题 岛问题 经典结构和算法 字符串 KMP算法 前缀树 数组 冒泡排序 选择排序 插入排序 归并排序 快速排序 堆排序 ...
- 算法(5)-leetcode-explore-learn-数据结构-字符串
leetcode-explore-learn-数据结构-数组3-字符串 1.简述 2.例题 2.1 二进制求和 2.2实现strStr() 2.3最长公共前缀 本系列博文为leetcode-explo ...
最新文章
- Silverlight实用窍门系列:66.Silverlight的数据模板DataTemplate(二)获取数据模板控件...
- STL源代码分析(ch 1)组态2
- 怎么把两个盒子显示在同一行_1个机顶盒2台电视机,怎么同时看电视?竟用一个分配器就行...
- vue tabs 动态组件
- 使用域超级管理员打开Exchange 2010发现没有权限
- End User 访问SharePoint URL获取数据流程
- 服务器将office转pdf文件,Windows服务-Office转PDF文件
- linux 内存使用很大,在32位和64位Linux上,为什么同一进程的pmap的内存使用量会有很大差异?...
- drupal_prepare_form 大致是如何工作的 ?
- 底部菜单控件BottomNavigationView的使用
- 鸿蒙之主的武器,各职业武器使用介绍 各职业一般用什么武器
- VMware vSphere 8 新增功能
- Ocelot对Consul进行配置,通过Ocelot访问502错误问题
- 华为系统gps定位服务器地址,很多手机的定位功能都叫GPS,为什么偏偏华为手机的定位功能叫“位置信息”?...
- 学习笔记-应用光学 第一章 几何光学的基本定律
- 2022这一年:阳了、变轨和逆风
- 【java毕业设计】基于javaEE+原生Servlet+SqlServer的医院管理住院系统设计与实现(毕业论文+程序源码)——医院管理住院系统
- 程设大作业之魔兽世界
- 用STM32+OV2560自己做一个USB摄像头
- HPE SPP镜像下载