复杂度分析之O(logn)、O(nlogn)

对数阶时间复杂度非常常见,同时也是最难分析的一种时间复杂度。我通过一个例子来说明一下。

int i = 1;while (i <= n)  {i = i * 2;}

根据我们前面讲的复杂度分析方法,第三行代码是循环执行次数最多的。所以,我们只要能计算出这行代码被执行了多少次,就能知道整段代码的时间复杂度。从代码中可以看出,变量 i 的值从 1 开始取,每循环一次就乘以 2。当大于 n 时,循环结束。还记得我们高中学过的等比数列吗?实际上,变量 i 的取值就是一个等比数列。如果我把它一个一个列出来,就应该是这个样子的:

所以,我们只要知道 x 值是多少,就知道这行代码执行的次数了。通过 2 x = n 2^{x}=n 2x=n 求解 x 这个问题我们想高中应该就学过了,我就不多说了。 x = log ⁡ 2 n x=\log_{2}n x=log2​n,所以,这段代码的时间复杂度就是 O ( log ⁡ 2 n ) O(\log_{2}n) O(log2​n)。现在,我把代码稍微改下,你再看看,这段代码的时间复杂度是多少?

int i=1;while (i <= n)  {i = i * 3;}

根据我刚刚讲的思路,很简单就能看出来,这段代码的时间复杂度为 O ( log ⁡ 3 n ) O(\log_{3}n) O(log3​n)。

实际上,不管是以 2 为底、以 3 为底,还是以 10 为底,我们可以把所有对数阶的时间复杂度都记为 O ( log ⁡ n ) O(\log_{}n) O(log​n)。为什么呢?我们知道,对数之间是可以互相转换的, O ( log ⁡ 3 n ) O(\log_{3}n) O(log3​n)就等于 O ( log ⁡ 3 2 ) O(\log_{3}2) O(log3​2)* O ( log ⁡ 2 n ) O(\log_{2}n) O(log2​n),所以 O ( log ⁡ 3 n ) O(\log_{3}n) O(log3​n) = O ( C ∗ log ⁡ 2 n ) O(C*\log_{2}n) O(C∗log2​n),其中 C = log ⁡ 3 2 C=\log_{3}2 C=log3​2 是一个常量。基于我们前面的一个理论:在采用大 O \textit{O} O 标记复杂度的时候,可以忽略系数,即 O ( C f ( n ) ) = O ( f ( n ) ) O(Cf(n)) = O(f(n)) O(Cf(n))=O(f(n))。所以, O ( log ⁡ 2 n ) O(\log_{2}n) O(log2​n) 就等于 O ( log ⁡ 3 n ) O(\log_{3}n) O(log3​n)。因此,在对数阶时间复杂度的表示方法里,我们忽对数的“底”,统一表示为 O ( log ⁡ n ) O(\log_{}n) O(log​n)。如果你理解了我前面讲的 O ( log ⁡ n ) O(\log_{}n) O(log​n),那 O ( n log ⁡ n ) O(n\log_{}n) O(nlog​n) 就很容易理解了。还记得我们刚讲的乘法法则吗?

如果一段代码的时间复杂度是 O ( log ⁡ n ) O(\log_{}n) O(log​n),我们循环执行 n 遍,时间复杂度就是 O ( n log ⁡ n ) O(n\log_{}n) O(nlog​n) 了。而且, O ( n log ⁡ n ) O(n\log_{}n) O(nlog​n) 也是一种非常常见的算法时间复杂度。比如,归并排序、快速排序的时间复杂度都是 O ( n log ⁡ n ) O(n\log_{}n) O(nlog​n) 。

换底公式说明

log ⁡ b N = log ⁡ a N log ⁡ a b \log_{b}N =\frac{\log_{a}N}{\log_{a}b} logb​N=loga​bloga​N​
运用换底公式
log ⁡ 3 N = log ⁡ 10 N log ⁡ 10 3 = log ⁡ 10 2 log ⁡ 10 3 ∗ log ⁡ 10 N log ⁡ 10 2 \log_{3}N =\frac{\log_{10}N}{\log_{10}3} = \frac{\log_{10}2}{\log_{10}3}*\frac{\log_{10}N}{\log_{10}2} log3​N=log10​3log10​N​=log10​3log10​2​∗log10​2log10​N​
再次运用换底公式,将两个分数简化。
log ⁡ 3 N = log ⁡ 3 2 ∗ log ⁡ 2 N \log_{3}N = \log_{3}2 * \log_{2}N log3​N=log3​2∗log2​N

总结

常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )。

转自数据结构与算法之美

算法的时间复杂度分析之O(logn)、O(nlogn)相关推荐

  1. 【基础】算法的时间复杂度分析

    1.什么是时间复杂度? 首先,解决一个问题肯定有许多种方式可以实现,那么如何评价一个算法的好坏?处理相同的数据量,用时更少,用的空间更少. 那么如何估算一个程序的运行时间与数据量的关系,这个函数就是算 ...

  2. 算法的时间复杂度分析

    算法的时间复杂度是一个函数,它定性描述该算法的运行时间.这是一个代表算法输入值的字符串的长度的函数.时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数.使用这种方式时,时间复杂度可被称为是渐 ...

  3. 基础算法-2: 时间复杂度为O(N*logN)的排序算法

    时间复杂度 O(N*logN): 归并排序,堆排序(大根堆,小根堆,heapInsert/heapify),快速排序(荷兰国旗问题). 归并排序 L - Mid - R 先让 左有序,右有序. 归并 ...

  4. 芯片测试算法及时间复杂度分析

    一.蛮力算法与分治算法 #include <stdio.h> #include <math.h> #define OVERFLOW -2 #define OK 1 #defin ...

  5. 字符串匹配KMP算法及其时间复杂度分析

       字符串匹配算法是非常常见的算法.考虑长度为nnn的文本(text)字符串A[1,2,⋯,n]A[1,2,\cdots,n]A[1,2,⋯,n],长度为mmm的匹配(pattern)字符串B[1, ...

  6. 算法学习——时间复杂度分析与渐进符号

    时间复杂度 时间复杂度:算法执行运算的操作数丢掉低阶数,再去掉所有系数. 例如 a = 1#操作数1 b = 2#操作数1 c = 3#操作数1 for i in n:#操作数nprint(a,b,c ...

  7. DQN算法的时间复杂度分析

    DQN算法的算法流程如下: 时间复杂度: 设: Initialize replay memory D \mathcal{D} D to capacity N N N (运行消耗 t 0 t_0 t0​ ...

  8. java快速排序的时间复杂度_程序猿必备排序算法及其时间复杂度分析

    常用的时间复杂度 常数阶\(O(1)\) 说明: 只要代码中没有复杂的循环条件,无论代码的函数是多少,一律为常数阶\(O(1)\) int i=1; int j=3; int m=0; m=i+j; ...

  9. 算法的时间复杂度与空间复杂度介绍

    本文主要介绍算法的时间复杂度和空间复杂度的相关知识. 1 概述 算法(Algorithm)是指用来操作数据.解决程序问题的方法. 对于同一个问题,使用不同的算法,也许最终得到的结果是相同的,但在执行该 ...

最新文章

  1. 安装wxpython——python程序GUI图形界面使用
  2. Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习
  3. djangorestframework源码分析2:serializer序列化数据的执行流程
  4. 更适合程序员使用的Vim配置 显示行号 语法高亮 智能缩进
  5. 连州技工学校学计算机要交多少学费,技校学费一年大约需要多少
  6. Netfilter深度解剖
  7. 【无标题】物联网安全挑战:为什么企业现在必须评估它们
  8. 判断用户名和密码是否正确java_facebook中如何判断用户名和密码是否正确
  9. Leetcode 9. 回文数(Palindrome Number)
  10. 所谓中央空调VRV指的是什么
  11. java 局部变量垃圾回收_java局部变量对垃圾回收的影响
  12. c语言寻找子字符串拷贝,C语言:字符串拷贝(截取)、查找
  13. xampp mysql3306_xmapp_mysql端口冲突解决---Port 3306 in use by......
  14. 【JSON】JSON入门详解(一)
  15. 1-8代酷睿全部中招,英特尔处理器再曝漏洞
  16. Androidapk安装流程之adb安装
  17. 激发数据潜力,“东数西算”带动数据中心新发展
  18. 2023最新大数据毕设题目推荐100例
  19. 移动互联网APP运营技巧分享
  20. CardView属性简介

热门文章

  1. Elasticsearch集成SpringBoot
  2. linux windows 运维比较,linux与windows的比较_系统运维_linux操作_linux系统_课课家
  3. Ogre中SDL转为OIS相关内容
  4. 中文文献怎么查找,带你了解中文文献查找途径及方法
  5. SpringCloud学习之(十八)SpringCloud Alibaba Nacos服务注册和配置中心
  6. 基于JTT808协议的车载终端接入网关中间件
  7. Synplify Premier使用教程
  8. ps磨皮插件Portraiture分享
  9. 概要设计怎么写?全面而具体的描述
  10. LeTex 常用操作