【漫话机器学习系列】017.大O算法(Big-O Notation)
大 O 表示法(Big-O Notation)
大 O 表示法是一种用于描述算法复杂性的数学符号,主要用于衡量算法的效率,特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。
基本概念
-
时间复杂度
- 描述算法所需的运行时间如何随输入数据规模 n 增大而增长。
- 表示形式:如
,
,
,
。
-
空间复杂度
- 描述算法所需的内存空间如何随输入数据规模 n 增大而增长。
- 表示形式:与时间复杂度类似,常见为
,
等。
-
渐进性描述
- 大 O 表示法不关注常数因子,只关注随着输入规模无限增长时的增长趋势。例如,若运行时间为
,其渐进复杂度为
。
- 大 O 表示法不关注常数因子,只关注随着输入规模无限增长时的增长趋势。例如,若运行时间为
常见的时间复杂度
以下列举了一些常见的时间复杂度,从快到慢排序:
-
常数时间
- 算法的运行时间与输入规模无关。
- 示例:数组索引访问、变量赋值。
def constant_example(arr):return arr[0] # 只访问一次,无论数组多大
-
对数时间
- 每次操作将问题规模缩小(如二分查找)。
- 示例:二分查找。
def binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1
-
线性时间
- 算法需要逐个处理输入的每个元素。
- 示例:线性搜索。
def linear_search(arr, target):for i, val in enumerate(arr):if val == target:return ireturn -1
-
线性对数时间
- 通常出现在排序算法(如归并排序、快速排序)。
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result
-
平方时间
- 通常出现在嵌套循环中(如冒泡排序)。
- 示例:冒泡排序。
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]
-
指数时间
- 通常出现在递归问题中(如穷举所有子集)。
- 示例:斐波那契数列递归计算。
def fibonacci_recursive(n):if n <= 1:return nreturn fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
-
阶乘时间
- 通常出现在全排列问题中,增长极快。
- 示例:旅行商问题暴力求解。
大 O 表示法的特性
-
忽略低阶项
- 复杂度表示只关注增长最快的项。例如,若
,则复杂度为
。
- 复杂度表示只关注增长最快的项。例如,若
-
忽略常数因子
- 只关注输入规模的增长趋势。例如,若
,则复杂度为
,忽略常数 5。
- 只关注输入规模的增长趋势。例如,若
-
渐进上界
- 大 O 表示的是最坏情况下的增长速度,是算法复杂度的上界。
常见的空间复杂度
-
:常数空间
- 算法只使用固定数量的额外空间(如简单变量)。
-
:线性空间
- 算法需要额外的内存来存储与输入规模相等的数据量(如递归调用栈或结果数组)。
-
:平方空间
- 通常在动态规划表中出现,例如计算最长公共子序列。
优化算法复杂度的思路
-
降低循环嵌套层数
- 优化嵌套循环,减少重复计算。
-
利用分治法
- 将问题分解为更小的子问题,例如归并排序。
-
使用高效数据结构
- 选择合适的数据结构(如哈希表替代数组查找)。
-
动态规划
- 通过记录中间结果避免重复计算。
-
启发式算法
- 在复杂问题中,使用启发式方法找到近似解而不是穷举。
总结
大 O 表示法是描述算法性能的重要工具,帮助开发者选择和优化算法。理解常见的时间和空间复杂度,并结合问题特性选择适当的算法和数据结构,是提升算法效率的关键。
相关文章:
【漫话机器学习系列】017.大O算法(Big-O Notation)
大 O 表示法(Big-O Notation) 大 O 表示法是一种用于描述算法复杂性的数学符号,主要用于衡量算法的效率,特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。 基本概念 时间复杂度 描述算法所需的运行时间如何随输入数…...

IntelliJ IDEA中设置激活的profile
在IntelliJ IDEA中设置激活的profile,可以通过以下步骤进行: 通过Run/Debug Configurations设置 打开Run/Debug Configurations对话框: 在IDEA的顶部菜单栏中,选择“Run”菜单,然后点击“Edit Configurations...”或者…...
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)
Qt 的信号槽机制详解:之因信号槽误用引发的 Segmentation Fault 问题拆析(上) 前言一. 信号与槽的基本概念信号(Signal)槽(Slot)连接信号与槽 二. 信号槽机制的实现原理元对象系统(M…...
uniapp中实现APP调用本地通知栏通知、震动、本地提示音或者mp3提醒
要在uniapp中实现APP调用本地通知栏通知、震动和本地提示音或者mp3提醒,你可以使用uni-app提供的原生API和插件来实现。 通知栏通知: 你可以使用uni-app的原生API uni.showToast() 或者 uni.showModal() 来实现通知栏通知的功能。可以在需要发送通知的地…...
ADB 上传文件并使用脚本监控上传百分比
有个需求,需要测试 emmc的外部连续写入性能,使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度,因此需要一个额外的监控脚本。 上传脚本: echo off setloc…...
【数据库】PostgreSQL(持续更新)
目录 K8S 部署基本使用高级特性 K8S 部署 # pg.yaml --- apiVersion: v1 kind: PersistentVolume metadata:name: tv-postgres-pvnamespace: locallabels:storage: tv-postgres-pv spec:accessModes:- ReadWriteOncecapacity:storage: 50Gi # 按需修改,需要保持与…...

overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案
在插入pdf 配图后,编译出错提示信息如图,很可能的一个原因是pdf文件大小太大了,最好压缩一下,压缩到1MB以内。...

pyqt5冻结+分页表
逻辑代码 # -*- coding: utf-8 -*- import sys,time,copy from PyQt5.QtWidgets import QWidget,QApplication, QDesktopWidget,QTableWidgetItem from QhTableWidgetQGN import Ui_QhTableWidgetQGN from PyQt5.QtCore import Qt from PyQt5 import QtCore, QtGui, QtWidgets…...

一起学Git【第四节:添加和提交文件】
通过前三节的学习,基本上对Git有了初步的了解,下面开始进行文件的添加和提交的流程。 这里主要涉及四个命令: git init 创建仓库git status查看仓库状态git add添加至暂存区git commit提交文件之前已经使用过git init命令了,此处不再具体讲解。参照一起学Git【第二节:创建…...

【鸿蒙实战开发】HarmonyOS集成高德地图定位实现
背景 随着HarmoneyOS 应用的井喷式增长,各大厂商也都加快了自己原生应用鸿蒙化的脚步,今天使用高德打车的时候忽然间想到高德在鸿蒙上有没有实现呢?打开next bate 版本的手机发现高德已经上架了,但是功能还不是特别完善。那么几乎每个应用都…...

ECharts散点图-气泡图,附视频讲解与代码下载
引言: ECharts散点图是一种常见的数据可视化图表类型,它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图,包括图表效果预览、视频讲解及代码下载,让你轻松掌握…...
python操作Elasticsearch执行增删改查
文章目录 基本操作更多查询方法1. 查询全部数据2. 针对某个确定的值/字符串的查询:term、match3. 在多个选项中有一个匹配,就查出来:terms4. 数值范围查询:range5. 多个条件同时触发 bool6. 指定返回值个数 size7. 返回指定列 _so…...

学习C++:关键字
关键字: 作用:关键字是C预先保留的单词(标识符) 在定义变量或者常量时候,不要用关键字 不要用关键字给变量或者常量起名称...

FFmpeg在python里推流被处理过的视频流
链式算法处理视频流 视频源是本地摄像头 # codinggbk # 本地摄像头直接推流到 RTMP 服务器 import cv2 import mediapipe as mp import subprocess as sp# 初始化 Mediapipe mp_drawing mp.solutions.drawing_utils mp_drawing_styles mp.solutions.drawing_styles mp_holis…...
为什么推荐使用构造函数注入而非@Autowired注解进行字段注入
在 Spring 框架中,推荐使用构造函数注入而非Autowired注解进行字段注入,主要有以下几个原因: 1. 依赖不可变和空指针安全 构造函数注入:使用构造函数注入时,依赖在对象创建时就必须提供,一旦对象创建完成&…...

如何卸载和升级 Angular-CLI ?
Angular-CLI 是开发人员使用 Angular 的必备工具。然而,随着频繁的更新和新版本的出现,了解如何有效地卸载和升级 Angular-CLI 对开发人员来说至关重要。本指南提供了一个全面的、循序渐进的方法来帮助您顺利过渡到最新版本。 必备条件 确保您的系统上…...
在线excel编辑(luckysheet)
项目地址:Luckysheet: 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 可以下载项目使用npm安装运行,也可以用cdn 加载excel文件(使用luckyexcel): …...
【ES6复习笔记】Symbol 类型及其应用(9)
一、Symbol 简介 Symbol 是 JavaScript 中的一种基本数据类型,它表示唯一的标识符。Symbol 的主要目的是防止属性名冲突,尤其是在多个代码库或模块中共享对象时。Symbol 值可以用作对象的属性名,这样可以确保属性名是唯一的,不会…...

[原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…...
【ES6复习笔记】Class类(15)
介绍 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...