当前位置: 首页 > 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.dtcms.com/a/348346.html

相关文章:

  • 多核多线程应用程序开发可见性和乱序如何处理
  • ESNP LAB 笔记:配置MPLS(Part2)
  • Java Stream API详解
  • iptables 防火墙核心知识梳理(附实操指南)
  • VS2022的MFC中关联使用控制台并用printf输出调试信息
  • GPT 模型详解:从原理到应用
  • 构建AI智能体:十二、给词语绘制地图:Embedding如何构建机器的认知空间
  • 大白话解析:多证明验证(Merkle Multi-Proof)​
  • 【Python】CSV批量转Excel工具 (Tkinter版)
  • 【Docker基础】Docker-compose多容器协作案例示例:从LNMP到分布式应用集群
  • 复杂姿态误报率↓78%!陌讯多模态算法在跌倒检测的医疗落地
  • 恶劣天气下漏检率↓79%!陌讯多模态时序融合算法在道路事故识别的实战优化
  • 第16届蓝桥杯C++中高级选拔赛(STEMA)2025年1月12日真题
  • 大模型面试题剖析:模型微调和蒸馏核心技术拆解与考点梳理
  • 爆肝三周,我终于上线了自己的第一个小程序
  • 01-鸿蒙系统概览与发展历程
  • 鸿蒙中Frame分析
  • 线段树相关算法题(1)
  • mybatis过渡到mybatis-plus过程中需要注意的地方
  • 自由学习记录(87)
  • 《飞算Java开发实战:从入门安装到项目部署》
  • FPGA 时序分析(一)
  • ubuntu中的nginx.conf和windows中的nginx.conf内容对比
  • LeetCode 101 刷题 - (1) 第一章 最易懂的贪心算法
  • K8S核心知识点
  • Teams Bot机器人实时语音识别的多引擎的处理
  • 【大语言模型 17】高效Transformer架构革命:Reformer、Linformer、Performer性能突破解析
  • 【机器人零件】蜗轮蜗杆减速器
  • Android面试指南(五)
  • 数据挖掘 4.1~4.7 机器学习性能评估参数