当前位置: 首页 > news >正文

时间复杂度

时间复杂度是用来衡量算法执行时间随着输入数据规模(通常用 nnn 来表示)增长而变化的趋势。在这里,O(log n) 表示随着数组大小 n增大,算法的运行时间增长非常缓慢,实际上是对数增长。

好的,我来给你详细解释一下复杂度的概念,特别是 O(log n)O(n)

1. 时间复杂度的概念

时间复杂度是用来衡量算法执行所需时间与输入规模之间的关系的。在实际应用中,我们关注的是随着输入规模的增大,算法执行时间是如何变化的。

  • O(1):常数时间复杂度,表示无论输入规模有多大,算法所需的时间都是固定的。

  • O(n):线性时间复杂度,表示随着输入规模的增大,算法所需的时间也会按比例增加。

  • O(log n):对数时间复杂度,表示随着输入规模的增大,算法所需的时间增长得比较慢。

  • O(n^2):平方时间复杂度,表示输入规模增加时,算法的时间复杂度会以平方的方式增加。

2. 举个例子:O(n) 与 O(log n)

例子 1: O(n) - 线性时间复杂度

假设你有一个数组,数组长度是 nn,你要在数组中查找某个值。

代码如下:

def linear_search(nums, target):for i in range(len(nums)):  # O(n)if nums[i] == target:return ireturn -1
  • O(n) 是线性时间复杂度,意味着随着数组大小的增大,查找操作的次数会线性增加

  • 例如:假设你有一个包含 10 个元素的数组,最坏情况下你需要检查 10 次;如果数组有 1000 个元素,你最坏情况下需要检查 1000 次。

线性增长的例子

  • 输入 10 个元素:最多检查 10 次。

  • 输入 1000 个元素:最多检查 1000 次。

  • 输入 1 万个元素:最多检查 1 万次。

3. 举个例子:O(log n) - 对数时间复杂度

现在你要在一个 有序数组 中查找某个值。你可以使用 二分查找,它的时间复杂度是 O(log n),这意味着随着数组大小的增大,查找操作的次数增长得比较慢。

代码如下:

def binary_search(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2  # O(1)if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid - 1return -1
  • O(log n) 是对数时间复杂度,表示每次查找时都把问题规模减半。

  • 例如:假设你有一个包含 16 个元素的数组,最多需要查找 4 次就可以确定目标的位置。

    • 第一次查找:数组中间的元素。

    • 第二次查找:剩下的一半元素。

    • 第三次查找:剩下的四分之一元素。

    • 第四次查找:剩下的八分之一元素。

    这样,只需要4次操作就能确定目标,即使数组增加到 1024 个元素,也只需要 10 次操作。

对数增长的例子

  • 输入 16 个元素:最多需要 4 次操作。

  • 输入 1024 个元素:最多需要 10 次操作。

  • 输入 1 万个元素:最多需要 14 次操作。

4. 对比 O(n) 和 O(log n)

  • O(n):随着输入规模增大,操作次数按比例增加。如果输入从 10 增加到 1000,操作次数大约增加了 100 倍。

  • O(log n):随着输入规模增大,操作次数增加得比较慢。输入从 10 增加到 1000,操作次数大约增加了 3 次(从 4 次增加到 10 次)。

5. 举个更具体的对比例子

假设你有一个包含 1,000,000(100 万)个元素的数组,分别使用 O(n) 和 O(log n) 算法进行查找:

  • O(n)

    • 最多需要检查 1,000,000 次。

  • O(log n)

    • log⁡21000000≈20\log_2 1000000 \approx 20,最多只需要进行 20 次查找。

6. 总结

  • O(n) 表示随着数据量的增加,算法的执行时间成比例地增加(线性增长)。

  • O(log n) 表示随着数据量的增加,算法的执行时间增长得很慢,因为每次操作都会将问题规模减半(对数增长)。

log lg ln 分别表示以2为底,10为底,e为底

常见的对数底数

  1. 底数 2(log₂ n):在计算机科学中,常用 底数 2 的对数,通常写作 log₂ n 或简称 log n,表示“2 的多少次幂等于 n”。

    • 例如,log₂ 8 = 3,因为 23=82^3 = 8。

    • 这个对数在计算机算法中尤其常见,因为计算机内部是基于二进制的,所有的操作都是通过 2 这个基数来进行的。

  2. 底数 10(log₁₀ n)底数为 10 的对数也很常见,尤其在数学和工程中,通常写作 log₁₀ nlg n,表示“10 的多少次幂等于 n”。

    • 例如,log₁₀ 1000 = 3,因为 103=100010^3 = 1000。

  3. 自然对数(logₑ n)底数为 e(自然对数)的对数,也写作 ln n,在数学和物理中经常用到,其中 e ≈ 2.718。

    • 例如,ln e = 1,因为 e1=ee^1 = e。

http://www.xdnf.cn/news/1359955.html

相关文章:

  • C++STL底层原理:探秘标准模板库的内部机制
  • 大数据毕业设计选题推荐:基于Spark+Django的学生创业数据分析可视化系统详解 毕业设计/选题推荐/深度学习/数据分析/数据挖掘/机器学习/随机森林
  • Go语言IDE安装与配置(VSCode)
  • wpf之DockPanel
  • Python 闭包详解
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十三)菜单、右键菜单
  • JDK版本报错
  • Function + 枚举 + Map:轻量路由器的最佳实践
  • [GeographicLib] LocalCartesian用法
  • 时序数据库选型“下半场”:从性能竞赛到生态博弈,四大主流架构深度横评
  • Palantir Foundry 领先其他数据平台5到10年:一位使用者的深入观察
  • 门面设计模式
  • 第4章 SPSS简介与数据库构建
  • 网络协议---TCP
  • 最大连续1的个数Ⅲ-滑动窗口
  • 2025/8/24 DockerDesktop安装使用
  • 【网络运维】Shell 脚本编程:while 循环与 until 循环
  • 审核问题——应用未配置图标的前景图和后景图
  • JUC——AQS
  • 客流特征识别误报率↓76%!陌讯多模态时序融合算法在智慧零售的实战解析
  • 蓝凌EKP产品:从 XML 到 JSON ——表单存储的性能优化实践
  • [自用笔记]上传本地项目至github
  • 【嵌入式开发 Linux 常用命令系列 8 -- git checkout 解冲突详细介绍】
  • Qt工具栏中图标槽函数没有响应的问题分析
  • 十一、redis 入门 之 数据持久化
  • 基于FPGA的情绪感知系统设计方案:心理健康监测应用(一)
  • yggjs_rlayout框架v0.1.2使用教程 01快速开始
  • 基于RBF-GA的铝/镁异材FSLW工艺参数优化研究
  • Qt---架构文件.pro
  • 02-开发环境搭建与工具链