时间复杂度:对于O(logn)对数阶的理解(含推导)

算法的时间复杂度分析之O(logn)、O(nlogn) 复杂度分析之O(logn)、O(nlogn) 对数阶时间复杂度非常常见,同时也是最难分析的一种时间复杂度。我通过一个例子来说明一下。 int i = 1; while (i <= n) { i = i * 2; } 根据我们前面讲的复杂度分析方法,第三行代码是循环执行次数最多的。所以,我们只要能计算出这行代码被执行了多少次,就能知道整段代码的时间复杂度。从代码中可以看出,变量 i 的值从 1 开始取,每循环一次就乘以 2。当大于 n 时,循环结束。还记得我们高中学过的等比数列吗?实际上, 阅读详情
AI摘要

博客主要介绍了对数阶 O(logn),复习了对数底数定义,以二分法为例,分析其时间复杂度为 O(log2n)、空间复杂度为 O(1),推导了二分法时间复杂度的计算步骤。还解释了在时间复杂度表示中,O(logn) 的底数通常无关紧要,可直接记为 O(logn)。

对数阶 O(logn)O(logn)O(logn)

先复习下对数底数的定义

对数底数的定义:

对数函数的一般形式为:

log⁡bn=x<=>bx=n \log_b n = x \quad \text{<=>} \quad b^x = n logb​n=x<=>bx=n

其中:

  • b 是对数的底数;
  • n 是输入规模。

常见的对数底数有:

  • 自然对数(底数为 e):ln⁡n=log⁡en\ln n = \log_e nlnn=loge​n;
  • 二进制对数(底数为 2):log⁡2n\log_2 nlog2​n;
  • 常用对数(底数为 10):log⁡10n\log_{10} nlog10​n。

二分法案例

时间复杂度的定义:算法运行所需的时间,通常用输入规模 ( n ) 的函数表示。

  • 时间复杂度:二分法的时间复杂度是 ( O(log⁡2n)O(\log_2 n)O(log2​n) ),这归因于查找范围每次缩小一半的特性。
  • 空间复杂度:二分法的空间复杂度为 ( O(1)O(1)O(1) ),因为不需要额外的存储空间。
  • 效率:二分法适用于静态、排序好的数组,是解决查找问题的经典方法,远优于线性查找。

推导步骤:

(1)每次操作的工作量

在每一步中,二分法的主要操作是:

  • 计算中点索引:(mid=⌊left+right2⌋)( \text{mid} = \lfloor \frac{\text{left} + \text{right}}{2} \rfloor )(mid=⌊2left+right​⌋)
  • 与目标值 ( x ) 进行一次比较。

这些操作的时间复杂度是常数级别的,即 ( O(1) )。


(2)查找范围的变化

二分法每次迭代将查找范围缩小一半:

  • 初始范围是 ( n )(数组长度)。
  • 第一次迭代后,范围变为 (n2)( \frac{n}{2} )(2n​)。
  • 第二次迭代后,范围变为 (n4)( \frac{n}{4} )(4n​)。
  • 以此类推,每次迭代范围缩小为原来的 (12k)( \frac{1}{2^k} )(2k1​),其中 ( kkk ) 是迭代次数。

(3)终止条件

二分法的查找终止条件是:

  • 要么找到目标值;
  • 要么查找范围缩小到 ( 1 )(即 ( n2k=1)\frac{n}{2^k} = 1 )2kn​=1))。

解出 ( k ):[n2k=1  ⟹  2k=n  ⟹  k=log⁡2n][ \frac{n}{2^k} = 1 \implies 2^k = n \implies k = \log_2 n ][2kn​=1⟹2k=n⟹k=log2​n]

因此,二分法的最大迭代次数是 ( log⁡2n\log_2 nlog2​n )。


(4)总时间复杂度

由于每次迭代的操作时间是 ( O(1)O(1)O(1) ),而最多需要 ( log⁡2n\log_2 nlog2​n ) 次迭代,所以二分法的时间复杂度为:
[O(log⁡2n)][ O(\log_2 n) ][O(log2​n)]


💡 O(logn)O(logn)O(logn) 的底数

在时间复杂度的表示中,底数对于 O(log⁡n)O(\log n)O(logn) 的意义通常是无关紧要的。这是因为在计算复杂度时,我们关心的是增长的阶数,而不是精确的数值。下面从多个角度解释为什么 O(log⁡n)O(\log n)O(logn) 的底数并不重要,以及它在分析中的具体作用。


O(logn)O(logn)O(logn) 的底数:

对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。它增长缓慢,是仅次于常数阶的理想的时间复杂度。

以下是一分为m的迭代次数的k的推导:

nmk=1  ⟹  mk=n  ⟹  k=log⁡mn \frac{n}{m^k} = 1 \implies m^k = n \implies k = \log_m n mkn​=1⟹mk=n⟹k=logm​n

含义:

  • m:一分为m
  • n:n个数据
  • k:迭代次数

准确来说,“一分为 m”对应的时间复杂度是 O(logm⁡n)O(log_m⁡n)O(logm​⁡n) 。而通过对数换底公式,我们可以得到具有不同底数、相等的时间复杂度:

O(logmn)=O(log⁡knlog⁡km)=O(log⁡kn) O(log_m n) = O( \frac{\log_k n}{\log_k m})=O(\log_kn) O(logm​n)=O(logk​mlogk​n​)=O(logk​n)

由于底数 log⁡km\log_k mlogk​m 为常数,因此可以忽略。最后将对数阶直接记为 O(log⁡n)O(\log n)O(logn)

【时间复杂度】定义与计算方法 时间复杂度是计算机科学中用来描述算法执行时间效率的一个概念。它表示了算法执行时间与输入数据量之间的关系,通常用大O符号(Big O notation)来表示。 阅读详情

相关推荐

RingBuffer 环形缓冲区----镜像指示位

称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。这个宏定义用于计算向下对齐的地址。size和align。size是要对齐的内存大小,align是所需的对齐大小。这个宏返回一个值,该值是size向下对齐到align边界后的地址。例如,假设我们有一个 32 位的系统,并且我们需要将数据对齐到 64 位的边界。我们可以使用在这个例子中,data数组的大小为 10 个元素,我们需要将其对齐到 8 字节边界。宏返回data。

呵呵哒!的博客 2408

什么是对数logN

什么是对数 软件开发中通过合理的算法能减小计算的空间复杂度和时间复杂度,有的复杂度为logN,什么是logN?通过毕业后的努力工作基本都忘了。 对数 首先,logN被称为对数,是在幂函数的基础上衍生的。例如:3²=9,可以得到log以3为底的9的对数等于2,可以理解为3相乘等于9,这里是两个3相乘,所以结果就是2。 比较经典的二分查找法的时间复杂度就是O(logN)(以2为底),若是用迭代的方式时间复杂度是O(N),N是数据量的个数;我们可以假设若是个数有100个,每一次查询的时间用1毫秒,二分查找

zhanwuguo8346的博客 3万+

玩转openclaw+企业微信

OpenClaw横空出世:AI从问答到执行的范式革命 OpenClaw作为2026年AI领域的重大突破,实现了从对话机器人到智能执行体的进化。其核心价值在于"自主执行"而非简单交互,通过六层解耦架构(表现层、网关层、运行时层、技能层、工具层、记忆层)构建完整执行闭环。关键技术包括Model Context Protocol实现多模型兼容,以及事件驱动架构确保实时响应。安装过程支持多平台,通过Node.js环境即可快速部署,并支持对接主流大模型。OpenClaw标志着AI开始真正&quot

西木风落 1591

logn什么意思

logn” 通常是对以 2 为底的对数(logarithm)的简写,表示 log base 2。在计算机科学和算法分析中,经常使用 logn 来描述算法的时间复杂度。logn 的增长速度较慢,因此算法的运行时间随着输入规模的增加而以较慢的速度增长,这通常是一个好的特性。具体来说,logn 表示对数函数,即如果一个算法的时间复杂度为 O(logn),意味着算法的运行时间与输入规模的对数成正比。这种情况通常在二分搜索等分而治之(divide and conquer)算法中出现。

tanwu1的博客 5750

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

swindy博客 2407

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3473

logN的底数

1、如果a(a>0,且a≠1)的b次幂等于N,即a^b=N,那么数b叫做以a为底N的对数,记作:logaN=b,其中a叫做对数的底数,N叫做真数。 2、以10为底的对数叫常用对数,记作log10N,简记为lgN; 3、以无理数e(e=2.718 28…)为底的对数叫做自然对数,记作logeN,简记为lnN。 log不写底数的时候,有默认的底数,物理上常用e,数学计算中常用10,计算机相关常用...

De_lovely_crane的博客 1万+

接口电路设计的关键要点

接口电路设计是嵌入式硬件开发的核心环节,本文系统阐述了五大关键设计要点:1)电平匹配技术,详细分析了3.3V/5V系统互连方案及转换电路计算;2)阻抗匹配原理,包括高速信号反射机制及差分信号处理;3)滤波与去耦设计,提出多级电容配置和"先电容后过孔"布局原则;4)接地设计规范,重点说明模拟/数字地分离及高速信号回流路径;5)防护电路设计,涵盖防反接、过流保护及ESD防护方案。文章通过具体计算公式、器件选型指南和布局技巧,为接口电路设计提供了系统化的解决方案,并附有设计检查清单和典型问题分

weiyvyy的博客 454

时间复杂度:O(1)、O(n)、O(n^2)、O(logn) 哪种情况下会出现

时间复杂度往往用来衡量一个算法的好坏程度,这里就来介绍一下如何推导时间复杂度即各种时间复杂度出现的情况。 如何推导时间复杂度? 时间复杂度的推导遵循3个原则: 如果运行时间跟n无关,是常数,则时间复杂度是O(1); 只保留时间函数中的最高阶项; 去掉高阶项前面的系数; O(1)出现情况 若运行时间跟n的取值无关,即无论n取什么值,我的运行时间都不会变,则时间复杂度为O(1) public vo...

X女王的博客 6852

论文必备 - YOLOv12热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv12热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 1706

麒麟系统无法进入单用户模式该怎么办?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1820

时间复杂度如何计算

前言   时间复杂度用于描述一个算法的运行时间消耗。刷题(leetcode等)也会有部分题要求写出一些进阶解法。 一、简介 1、时间频度T(n)   一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多少就可以了。一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 2、时间复杂度   时间频度T(n)中,n

Shenkh的Java壁橱 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

logn是什么意思_时间复杂度 O(log n) 意味着什么?

原文作者:Maaz译文出自:掘金翻译计划译者:cdpath校对者:zaraguo (zaraguo), whatbeg (Qiu Hu)预先知道算法的复杂度是一回事,了解其后的原理是另一件事情。不管你是计算机科班出身还是想有效解决最优化问题,如果想要用自己的知识解决实际问题,你都必须理解时间复杂度。先从简单直观的 O(1) 和 O(n) 复杂度说起。O(1) 表示一次操作即可直接取得目标...

weixin_39888180的博客 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法时间复杂度:O(logn)的底数是多少?

大家好,我是老三,最近裸辞了,在面试。 前两天一个面试,只面了十分钟就结束了—— 事情是这样的: 面试官:你能说说HashMap的数据结构吗? 老三:数组+链表+红黑树,阿巴阿巴…… 面试官:那你说说红黑树的查找复杂度是多少? 老三:O(logn)。 面试官:那这个复杂度的底数是多少? 老三:时间复杂度O(logn)有底数? 面试官:没有吗? 尬住…… 面试官:那你再说一下快速排序的时间复杂度?底数是多少? 老三露出智(尴)慧(尬)的微笑…… 面试官:好了,我没什么要问的了,这

Java搜索工程技术栈 4137

奇葩面试题,O(logn)的底数是多少?

一个没有注意到的点,懵了……

三分恶的博客 2930

数据结构《二》算法时间复杂度 — 大O记法

1、算法时间复杂度的定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作T(n) = O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。其中f(n) 是问题规模n的某个函数。 O() 来体现算法时间复杂度的记法,称之为 大O记法。 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。 2、推导大O阶

weixin_43235580的博客 845

时间复杂度(大O符号表示法)

(1)时间频度一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。(2)时间复杂度在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。为此,我们引入时间复杂度概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)

2402_88000128的博客 1055

如何分析算法的时间复杂度!

复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。

b_r_ight的博客 3137

时间复杂度详解

详细介绍时间复杂度与空间复杂度

m0_56799144的博客 8930

Java算法入门以及常见时间复杂度的推导

详细介绍了算法的入门知识,比如算法的定义,以及算法的时间复杂度推导和常见算法的时间复杂度。

终生学习践行者 3144

Time Complexity (时间复杂度)

概念 什么是时间复杂度 时间复杂度 用来定性的描述算法的执行时间的一个函数,更类似于一个耗时的趋势,函数表示为: O(f(n)) 名词解释 n :问题的规模,重复执行的次数 T(n) :一段程序运行,各种操作代码所执行的总次数 f(n) :存在的某个函数,使得T(n)/f(n)=非零常数,那么f(n)称为T(n)的同数量级函数 O :大O符号,一种符号,表示渐进于无穷的行为 算法中各种代码操作所执...

SToNE的博客 3709

数据结构与算法——时间复杂度

众所周知,设计算法需要提高效率。那么,如何度量一个算法的执行时间呢?我们的计算机前辈们,为了对算法的评判更加科学,研究出了一种叫做事前分析估算的方法。实际上,就是通过在程序运行前通过对代码语句执行的次数进行求和,以此来评判一个算法的效率。所谓的时间复杂度,也就跟这个代码语句的执行次数密切相关。提示以下是本篇文章正。...

xzt12138的博客 4028

快速幂:从O(n)到O(logn)的神奇优化

幂运算是数学中的基本操作。计算2的10次方很简单,但计算2的10亿次方呢?暴力乘10亿次?快速幂算法用二进制优化,只需要30次左右的乘法。我并没有能力让你成为数学优化大师,我只是想让你理解快速幂的核心思想、二进制分解的巧妙之处、以及快速幂取模在大数运算中的应用。从"计算幂次方超时"问题出发,剖析快速幂的二进制优化原理。通过幂运算的递归分解、二进制表示的巧妙利用、以及快速幂取模的防溢出技巧,揭秘如何把幂运算从O(n)优化到O(logn)。配合详细推导与代码实现,给出快速幂的完整解法。南北绿豆核心思想。

比较是偷走幸福的小偷 4286

【数据结构手札】时间复杂度详解:概念 | 大O渐进表示法 | 习题

本文系统讲解了算法时间复杂度的核心概念,详细剖析了大O渐进表示法的推导法则,并通过8个经典实例由浅入深地展示了常见复杂度的分析与计算方法,旨在帮助读者建立算法效率分析的完整框架。

聆风吟的博客 5728

LCA与树上倍增:最近公共祖先的O(logn)解法

最近公共祖先(LCA)是树上查询的经典问题。暴力向上爬需要O(n),而倍增算法只需要O(logn)。很多人只记住"跳2的幂次",却不知道为什么要预处理祖先、为什么能快速查询。我并没有能力让你成为树算法专家,我只是想让你彻底理解LCA的定义、倍增思想的数学原理、以及为什么预处理能加速查询。每个优化都会详细推导,讲透本质。从"求两节点最近公共祖先"问题出发,剖析倍增算法的核心思想与优化原理。通过暴力向上爬到倍增跳跃的优化过程、2的幂次预处理的数学推导,揭秘如何把LCA查询从O(n)优化到O(logn)。

比较是偷走幸福的小偷 4242
上一篇: Charles抓包工具-笔记
下一篇: React 低代码项目:项目创建
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值