时间复杂度logn的底数

时间复杂度logn的底数

作者 | OverRedMaple

责编 | Carol

来源 | CSDN 博客

封图 | CSDN付费下载于东方 IC

如果你还在发愁究竟怎么计算时间复杂度和空间复杂度,那你是来对地方了!

名词解释:

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

时间复杂度logn的底数

时间复杂度的表示方法

其实就是算法(代码)的执行效率,算法代码的执行时间。我们来看下面一个简单的代码:

int sumFunc(int n) {int num = 0; // 执行一次for (int i = 1; i <= n; ++i) { // 执行n次num = num + i; // 执行n次} return num;}

假设,每行代码的执行时间为t,那么这块代码的时间就是(2n+2)*t

由此得出:代码执行时间T(n)与代码的执行次数是成正比的!

那么我们来看下一个例子:

int sumFunc(int n) {int num = 0; // 执行一次for (int i = 1; i <= n; ++i) { // 执行n次for (int j = 1; j <= n; ++j) { //执行n*n次num = num + i * j; // 执行n*n次}}}

同理,该代码执行时间为(2n*n+n+1)*t,没意见吧?继续往后看!

注意:在数据结构/算法中,通常使用T(n)表示代码执行时间,n表示数据规模大小,f(n)表示代码执行次数综合,所以上面这个例子可以表示为f(n)=(2n*n+n+1)*t,其实就是一个求总和的式子,O(大写O)表示代码执行时间与f(n) 成正比例。

根据上面两个例子得出结论:代码的执行时间 T(n)与每行代码的执行次数 n 成正比,人们把这个规律总结成这么一个公式:T(n) = O(f(n))

所以呢,第一个例子中的 T(n)=O(2n+1),第二个例子中的 T(n)=O(2n*n+n+1),这就是时间复杂度表示法,也叫大O时间复杂度表示法。

但是,大O时间复杂度并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度,简称时间复杂度

与泰勒公式相反的是,算了,扯哪去了…

当n变得越来越大时,公式中的低阶,常量,系数三部分影响不了其增长趋势,所以可以直接忽略他们,只记录一个最大的量级就可以了,所以上述两个例子实际他们的时间复杂度应该记为:T(n)=O(n) ,T(n)=O(n*n)

我想你应该明白大致是怎么回事了,那么我们来看看如何去计算它?

时间复杂度logn的底数

时间复杂度的分析与计算方法

(1)循环次数最多原则

我们上面说过了,当n变得越来越大时,公式中的低阶,常量,系数三部分影响不了其增长趋势,可以直接忽略他们,只记录一个最大的量级就可以了。因此我们在计算时间复杂度时,只需关注循环次数最多的那段代码即可。

int sumFunc(int n) {int sum = 0; //执行1次,忽略不计for (int i = 0; i < n; i++) {sum += i; // 循环内执行次数最多,执行次数为n次,因此时间复杂度记为O(n)} return sum; //执行1次,忽略不计}

(2)加法原则

int sumFunc(int n) {int sum = 0; //常量级,忽略for (int i = 0; i < 99; i++) {sum += i; //执行100次,还是常量级,忽略}

for (int i = 0; i < n; i++) {sum += i; //执行n次}

for (int i = 0; i < n; i++){for (int j = 0; j < n; j++) {sum += i; //执行n*n次}}return sum;}

上述例子中,最大的两块代码时间复杂度分别为 O(n)和O(n*n),其结果本应该是:T(n)=O(n)+O(n*n),我们取其中最大的量级,因此整段代码的复杂度为:O(n * n)

所以得出结论:量级最大的那段代码时间复杂度=总的时间复杂度

(3)乘法原则

嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

void Func1(int n) {for (int i = 0; i < n; i++) {Func2(n); //执行n次,每次都会调用Func2函数执行n次}}void Func2(int n) {int sum = 0;for (int i = 0; i < n; i++){sum += 1; //执行n次}}

因此这段代码时间复杂度为O(n) * O(n) = O(n*n) = O(n*n)

同理,如果将其中一个n换成m,那么它的时间复杂度就是O(n*m)

时间复杂度logn的底数

常见的几种时间复杂度

(1)O(1)常量级时间复杂度

void Func(void) {for (int i = 0; i < 100; i++) {printf("hello"); //执行一百次,也是常量级,记为O(1)}}

void Func(void) {printf("hello");printf("hello"); printf("hello");//各执行一次,还是记为O(1)}

相信你也看明白了,O(1)不是说代码只有一行,这个1它代表的是一个常量,即使它有以前一万行这样的也是O(1),因为它是固定的不会变化(也就是常量),所以凡是常量级复杂度代码,均记为O(1)

(2)常见的O(n)复杂度

void Func(int n) {for (int i = 0; i < n; i++) {printf("hello");}}

不用多说了吧!继续!

(3)O(logn),O(nlogn) ,这就有点难度了!

首先我们来回忆以下换底公式:

时间复杂度logn的底数

记住公式啊,来看例子:

void Func(int n) {for (int i = 1; i < n; i++) {i = i * 2;}}

可以看出,i = i * 2这行代码执行次数是最多的,那么到底执行了多少次呢?

第一次 i=2,执行第二次 i=4,执行第三次 i=8…

假设它执行了x次,那么x的取值为:

时间复杂度logn的底数

当上述代码的2改成3的时候,x的取值也就是:

时间复杂度logn的底数

当然不管log的底数是几,是e也好,是10也罢,统统记为:

时间复杂度logn的底数

这是为啥子念?由换底公式可以计算出:

时间复杂度logn的底数

换底之后,可以看出log3(2)其实就是一个常数,忽略它!而在这场游戏中,log默认就是以2为底的,所以统统记为O(logn)。

void Func(int n) {for (int i = 0; i < n; i++) {Func2(n); //执行n次,嵌套调用,每次调用执行logn次}}void Func2(int n) {for (int i = 0; i < n; i++){i = i * 2; //执行logn次}}

所以这个O(nlogn)也很好理解了吧!

本文【时间复杂度logn的底数】由作者: 递归 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4196.html

(0)
上一篇 2023-03-10 08:46:03
下一篇 2023-03-10 08:51:32

相关推荐

  • java正则表达式提取字符串,java提取字符串中的指定字符

    往往有很多需求,需要取出指定字符之间的字符串,取的方式有多种,关系到重复使用的问题,如abc123abc456abc,如果使用正则取出abc之间的内容,这里可能有两种结果, 结果1: 123 456 结果2: 123 为什么有两种结果呢 这里的一个区别就是,abc能否重复使用的问题,结果1就是abc重复使用了,而结果2中取法,abc不可重复使用 下面代码取出…

    2023-03-17
    300
  • linux软件安装在哪个目录

    1、通过rpm查看 1)、查看是否安装,如果安装显示安装的文件,如果没有安装不返回任何值 2)、rpm -ql 列出软件包安装的文件 3)、rpm -qal |grep mysql 查看所有安装包的文件存储位置 rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。…

    2023-03-12
    400
  • markdown语法菜鸟教程 markdown适合做笔记吗

    在我的工作中,我经常要写代码、写与代码相配套的文档、创建网页、进行文本恢复项目。我在学校的时候还写过几篇正式的论文,也包括写课堂笔记,几乎每节课都写。 我几乎在我所有的写作中都使用 Markdown,它对我来说是一个节省时间的好工具。 在这篇文章中,我将分享我使用 Markdown 的体会。你将会了解以下内容: 什么是 Markdown ? 它是怎么工作的?…

    2023-03-14
    500
  • 整型转字符串函数 java_字符串转整形java

    QString(字符串类) 直接支持字符串和整形互相转换、不同字符编码的相互转换、str::string和str::wstring的相互转换、支持正则表达式的应用 1.QString QString提供了一个二元的“+”操作符用于组合两个字符串,并提供了一个“+=”操作符用于将一个字符串追加到另一个字符串的末尾。例如: QString ster=”hello…

    2023-03-11
    400
  • 正则表达式不包含空格

    前言 正则表达式作为一名合格的程序员的必备的基本技术之一,其有用性不言而喻。但是它为什么会非常难以掌握,甚至想用一用也都感觉难以下手呢?本文将会让你一次就看会如何使用Python正则表达式。 1. 正则表达式的组成 在介绍如何使用Python的正则表达式时,我们需要先认识一下正则表达式的各种功能,以及其组成形式如何。 正则表达式可以从非结构化的文本中提取到我…

    2023-03-17
    100
  • 致远a8安装手册(致远a8企业版和集团版区别)

    公司使用的是致远协同A8+企业版,版本::V7.1SP1,之前使用的A8企业版,版本:V5.0SP1。新版本支持了谷歌浏览器,总算不用纠结IE和360浏览器的兼容问题。升级后,相应的辅助程序又得重新安装,才能正常使用。 步骤如下: 1、输入协同登录地址后,如网页界面下方弹出需要安装加载的插件,则点击允许。 2、点击登录按钮下方的“辅助程序安装”,第一次点击弹…

    2023-03-17
    000
  • 量子计算机与普通计算机的区别_量子计算机是几进制

    在我们自己的量子计算原型机“九章”问世后,不少人对量子计算机这个看起来有点神秘的新鲜事物感兴趣,但又不知道具体量子计算机跟电子计算机有什么区别。 而且新闻里提到的量子计算机的性能数据有点太过于“惊人”。 “九章”量子计算机,在处理“高斯玻色采样”问题时,速度是目前最快的超级计算机的100万亿倍。 也就是说九章量子计算机只要花200秒就能处理好的事情,目前世界…

    2023-03-11
    600
  • 五笔入门教程 自学五笔技巧

    作为一个用了10年五笔的计算机行业从业者。 每次有人见到我用五笔,都惊讶不已!!! 哇塞,你用的五笔输入法吗? 今天抽时间整理了一下,我学习五笔的方法,用时三个月,希望可以帮助到您~ 第一步:树立信念 不管是做什么事,信念是第yi步,有了信念,那才能有动力。 我们当时全班有五十多位同学,五笔学习呢,一共学了一个月,许多人一开始没学几天就放弃了。 zui后坚持…

    2023-03-21
    100
  • 二分法查找是什么意思

    引入: 二分法思想无处不在,我们经常玩的猜数字游戏,0-99的范围,最多需要多少次我就可以猜对呢? 使用二分法思想,最多仅仅需要7次就可以查找到。 二分法查找是非常恐怖的,以2的倍数缩小范围。所以时间复杂度O(logn) 局限性: 1.针对二分法查找的数据必须是有序的。 2.二分法查找依赖于顺序表结构,也就是数组。因为二分法需要随机访问元素,也就是O(1)的…

    2023-03-12
    300
  • dos命令大全及详解pdf

    基本DOS 命令集详细解说 path 指向路径命令: path=c:\dos;c:\windows;c:\ 这条命令就是说,当我们执行一个文件时, 电脑先在当前目录下查找这个文件,找到则执行,如果没有找到,则电脑按照 path命令所指定的目录顺序去查找,先在C盘dos目录下,然后在windows目录 下,最后在C盘根目录下寻找这个文件 edit 编辑命令: …

    实用教程 2023-03-17
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!