【漫话机器学习系列】017.大O算法(Big-O Notation)

大 O 表示法(Big-O Notation)

大 O 表示法是一种用于描述算法复杂性的数学符号,主要用于衡量算法的效率,特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。


基本概念

  1. 时间复杂度

    • 描述算法所需的运行时间如何随输入数据规模 n 增大而增长。
    • 表示形式 :如 , , ,
  2. 空间复杂度

    • 描述算法所需的内存空间如何随输入数据规模 n 增大而增长。
    • 表示形式 :与时间复杂度类似,常见为 , 等。
  3. 渐进性描述

    • 大 O 表示法不关注常数因子,只关注随着输入规模无限增长时的增长趋势。例如,若运行时间为 ,其渐进复杂度为

常见的时间复杂度

以下列举了一些常见的时间复杂度,从快到慢排序:

  1. 常数时间

    • 算法的运行时间与输入规模无关。
    • 示例:数组索引访问、变量赋值。
    python 复制代码
    def constant_example(arr):
        return arr[0]  # 只访问一次,无论数组多大
  2. 对数时间

    • 每次操作将问题规模缩小(如二分查找)。
    • 示例:二分查找。
    python 复制代码
    def binary_search(arr, target):
        low, high = 0, len(arr) - 1
        while low <= high:
            mid = (low + high) // 2
            if arr[mid] == target:
                return mid
            elif arr[mid] < target:
                low = mid + 1
            else:
                high = mid - 1
        return -1
  3. 线性时间

    • 算法需要逐个处理输入的每个元素。
    • 示例:线性搜索。
    python 复制代码
    def linear_search(arr, target):
        for i, val in enumerate(arr):
            if val == target:
                return i
        return -1
  4. 线性对数时间

    • 通常出现在排序算法(如归并排序、快速排序)。
    python 复制代码
    def merge_sort(arr):
        if len(arr) <= 1:
            return arr
        mid = len(arr) // 2
        left = merge_sort(arr[:mid])
        right = merge_sort(arr[mid:])
        return merge(left, right)
    
    def merge(left, right):
        result = []
        i = j = 0
        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                result.append(left[i])
                i += 1
            else:
                result.append(right[j])
                j += 1
        result.extend(left[i:])
        result.extend(right[j:])
        return result
  5. 平方时间

    • 通常出现在嵌套循环中(如冒泡排序)。
    • 示例:冒泡排序。
    python 复制代码
    def bubble_sort(arr):
        n = len(arr)
        for i in range(n):
            for j in range(0, n-i-1):
                if arr[j] > arr[j+1]:
                    arr[j], arr[j+1] = arr[j+1], arr[j]
  6. 指数时间

    • 通常出现在递归问题中(如穷举所有子集)。
    • 示例:斐波那契数列递归计算。
    python 复制代码
    def fibonacci_recursive(n):
        if n <= 1:
            return n
        return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
  7. 阶乘时间

    • 通常出现在全排列问题中,增长极快。
    • 示例:旅行商问题暴力求解。

大 O 表示法的特性

  1. 忽略低阶项

    • 复杂度表示只关注增长最快的项。例如,若 ,则复杂度为
  2. 忽略常数因子

    • 只关注输入规模的增长趋势。例如,若 ,则复杂度为 ,忽略常数 5。
  3. 渐进上界

    • 大 O 表示的是最坏情况下的增长速度,是算法复杂度的上界。

常见的空间复杂度

  1. :常数空间

    • 算法只使用固定数量的额外空间(如简单变量)。
  2. :线性空间

    • 算法需要额外的内存来存储与输入规模相等的数据量(如递归调用栈或结果数组)。
  3. :平方空间

    • 通常在动态规划表中出现,例如计算最长公共子序列。

优化算法复杂度的思路

  1. 降低循环嵌套层数

    • 优化嵌套循环,减少重复计算。
  2. 利用分治法

    • 将问题分解为更小的子问题,例如归并排序。
  3. 使用高效数据结构

    • 选择合适的数据结构(如哈希表替代数组查找)。
  4. 动态规划

    • 通过记录中间结果避免重复计算。
  5. 启发式算法

    • 在复杂问题中,使用启发式方法找到近似解而不是穷举。

总结

大 O 表示法是描述算法性能的重要工具,帮助开发者选择和优化算法。理解常见的时间和空间复杂度,并结合问题特性选择适当的算法和数据结构,是提升算法效率的关键。

相关推荐
桃花键神几秒前
AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
人工智能
野蛮的大西瓜21 分钟前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
CountingStars6191 小时前
目标检测常用评估指标(metrics)
人工智能·目标检测·目标跟踪
tangjunjun-owen1 小时前
第四节:GLM-4v-9b模型的tokenizer源码解读
人工智能·glm-4v-9b·多模态大模型教程
冰蓝蓝1 小时前
深度学习中的注意力机制:解锁智能模型的新视角
人工智能·深度学习
橙子小哥的代码世界1 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
新加坡内哥谈技术2 小时前
苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
大数据·人工智能·语言模型
fanstuck2 小时前
Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
人工智能·数据挖掘·openai
lovelin+v175030409662 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
唐小旭3 小时前
python3.6搭建pytorch环境
人工智能·pytorch·python