首页 > 其他分享 >浅谈时间复杂度

浅谈时间复杂度

时间:2024-07-16 21:20:05浏览次数:8  
标签:代码 浅谈 复杂度 算法 时间 2n 常数

时间复杂度

定义

衡量一个算法的快慢,一定要考虑数据规模的大小。所谓数据规模,一般指输入的数字个数、输入中给出的图的点数与边数等等。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即 时间复杂度

​ ——OI Wiki

在算法中,使用时间复杂度来衡量程序运行时间的多少。每条语句执行的次数称为该语句的频度,整段代码的总执行次数则称为整段代码的频度。在算法竞赛中,由于输入可以在给定的数据范围内任意给定,我们为保证算法能够通过某个数据范围内的任何数据,一般考虑最坏时间复杂度。

下面,我将用更通俗易懂的语言,解释时间复杂度。

分析

在推导的时候,我们应该采用无限大的思想来简化大 \(O\) 表达式,具体如下:

1.用常数 \(1\) 代替运行时间中的所有加法的常数。无论常数是多少都使用 \(1\) 替换。因为执行函数和问题规模 \(n\) 的大小无关,它是执行时间恒定的,像时间复杂度为\(O(1)\) 的又被称作常数阶。如:执行 \(100\) 次 \(1 \to n\) 的循环,这份代码的时间复杂度为 \(O(n)\) 而并非 \(O(100n)\)。

2.如果最高阶项存在且系数不为 \(1\),则去除掉与这个项相乘的系数,例如 \(O(2n^2)\) 系数为 \(2\),直接简化为 \(O(n^2)\)。

3.如果表达式有多项含有无限大变量的式子,只保留一个拥有指数最高的变量的式子。如 \(O(2n^2+2n)\) 应简化为 \(O(n^2)\)。

经过上面三个步骤推到出来的结果就是算法对应的大 \(O\) 阶。

注意,在遇到类似于 \(O(2n+m)\) 的时间复杂度时,由于 \(n\) 和 \(m\) 之间没有联系,所以这份代码的时间复杂度应是 \(O(n+m)\)。在遇到类似于 \(O(n^2+nq)\) 的时间复杂度时,由于我们无法确定 \(n^2\) 和 \(nq\) 的大小(\(n\) 和 \(q\) 的大小不确定),因此这份代码的时间复杂度依然是 \(O(n^2+nq)\)。

举例:

  • \(O(12)\to O(1)\)

  • \(O(2n+3)\to O(n)\)

  • \(O(3n^2+2n+1)\to O(n^2)\)

  • \(O(5\log_2 n+20)\to O(\log n)\)

  • \(O(2n+3n\log_2 n+19)\to O(n\log n)\)

  • \(O(6n^3+2n^2+3n+4)\to O(n^3)\)

  • \(O(2^n+n^4)\to O(2^n)\)

Another

哪些数是常数?

我们曾提到,“用常数 \(1\) 代替运行时间中的所有加法的常数”,那么,什么是常数呢?

我们一个例子看起。

const int n=114514;
for (int i=1;i<=n;i++){
    cout<<"hello world\n";
}

代码中,\(MAXN\) 虽然是一个变量,但是它的值是固定的,所以它不被看做输入数据规模,所以代码的时间复杂度是 \(O(1)\) 而不是 \(O(n)\)。

进行时间复杂度计算时,哪些变量被视作输入规模是很重要的,而所有和输入规模无关的量都被视作常量,计算复杂度时可当作 \(1\) 来处理。

标签:代码,浅谈,复杂度,算法,时间,2n,常数
From: https://www.cnblogs.com/shimingxin1007/p/18306144

相关文章

  • PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附
    全文下载链接:http://tecdat.cn/?p=22617最近我们被客户要求撰写关于MRS的研究报告,包括一些图形和统计输出。本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑器  %matplot......
  • Day06 (find查找、时间同步)
    一、find查找命令1.find查找根据路径、选项、选项的值来查找文件-name  根据文件名称包含来查找-type   根据文件类型来查找-mtime 根据文件最后修改时间搜索+号 搜索前几天的文件信息-号 搜索几天之内的文件信息find/opt/-name"*.txt"-mtime+3......
  • 通过chrony实现内网自建时间同步服务器
    服务端安装chrony服务端yuminstall-ychrony配置chrony服务端#chrony默认配置文件路径#yum:一般为/etc/chrony.conf#apt:一般为/etc/chrony/chrony.conf#在chrony.conf中加入以下行serverntp.aliyun.comiburstmanualallow0.0.0.0/0localstratum8......
  • 声明一个数组为什么需要花费大量时间?
    声明一个数组需要花费大量时间,主要原因有以下几点:内存申请:创建数组时,需要申请一块连续的内存空间。如果系统内存不足或者剩余的内存不连续,可能会导致创建失败。此外,对于大数组,存储需求呈指数级增长,例如一个四维字符数组需要2,160字节的内存,而存储双精度浮点数则需要17,280字......
  • 浅谈AI是在帮助开发者还是取代他们?
    在软件开发领域,生成式人工智能(AIGC)确实正在改变开发者的工作方式,但它的作用更多是辅助而非替代。以下是对这一问题的详细分析:AI作为开发者的助手代码生成:AI工具如GitHub的Copilot可以根据上下文自动生成代码片段,极大地提高了编码效率。这并不意味着AI可以完全取代开发者,因......
  • linux配置时间同步
    1、配置 systemctlstatuschronyd  //查看同步服务状态yum-yinstallchrony //如果没有服务就装包systemctlstartchronyd //开启服务systemctlenablechronyd //设置开机自启vim/etc/chrony.conf //修改配置文件server172.25.0.254iburst //......
  • 数据结构和算法--2.算法复杂度
    算法复杂度算法分析➢同一算法用不同语言实现,用不同编译器,或是在不同计算机上运行,效率均不同➢使用绝对时间衡量算法效率不合适➢基本操作重复执行的次数作为算法的时间度量判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数算法......
  • 浅谈图论
    图的基本概念多个点连成的线就构成了图图的种类(加权)有向图   (加权)无向图度无向图中有几条边连接该节点,该节点就有几度有向图中,每个节点有出度和入度出度:从该节点出发的边的个数入度:指向该节点边的个数 连通性连通图无向图中,任何两个节点都是可以到达的,我们称......
  • MySQL时间戳转成日期格式
    将时间戳转换为日期格式:--如果时间戳为毫秒级长度为13位,需要先除以1000SELECTid,`task_name`,FROM_UNIXTIME(`task_register_begin_time`/1000,'%Y-%m-%d%H:%i:%s')astask_register_begin_time,FROM_UNIXTIME(`task_register_end_time`/1000,'%Y-%m-%d%H:%i:%s')ast......
  • 数据结构的基础(集合框架算法,复杂度和泛型)
    一.什么是集合框架        Java集合框架JavaCollectionFramework,又被称为容器container,是定义在java.util包下的一组接口interfaces和其实现类classes。        其主要表现为将多个元素element置于一个单元中,用于对这些元素进行......