算法与数据结构要点速学——时间复杂度(大 O)

时间复杂度 (大 O)

在这里插入图片描述
在这里插入图片描述
首先,我们来谈谈常用操作的时间复杂度,按数据结构/算法划分。然后,我们将讨论给定输入大小的合理复杂性。

数组(动态数组/列表)

规定 n = arr.length,

  • 在结尾添加或删除元素:O(1)
  • 从任意索引中添加或删除元素:O(n)
  • 访问或修改任意索引处的元素:O(1)
  • 检查元素是否存在:O(n)
  • 构建前缀和:O(n)
  • 求给定前缀和的子数组的和:O(1)

字符串 (不可变)

规定 n = s.length,

  • 添加或删除字符:O(n)
  • 任意索引处的访问元素:O(1)
  • 两个字符串之间的连接:O(n+m),其中 m 是另一个字符串的长度
  • 创建子字符串:O(m),其中 m 是子字符串的长度
  • 双指针:O(n*k),其中 k 是每次迭代所做的工作,包括滑动窗口
  • 通过连接数组、StringBuilder 等构建字符串:O(n)

链表

给定 n 作为链表中的节点数,

  • 给定指针位置的后面添加或删除元素:O(1)
  • 如果是双向链表,给定指针位置添加或删除元素:O(1)
  • 在没有指针的任意位置添加或删除元素:O(n)
  • 无指针任意位置的访问元素:O(n)
  • 检查元素是否存在:O(n)
  • 在位置 i 和 j 之间反转:O(j-i)
  • 使用快慢指针或哈希映射完成一次遍历:O(n)

哈希表/字典

给定 n = dic.length,

  • 添加或删除键值对:O(1)
  • 检查 key 是否存在:O(1)
  • 检查值是否存在:O(n)
  • 访问或修改与 key 相关的值:O(1)
  • 遍历所有键值:O(n)

注意,O(1) 操作相对于 n 是常数。然而,实际上哈希算法可能代价很高。例如,如果键是字符串,那么它将花费 O(m) 的时间,其中 m是字符串的长度。这些操作只需要相对于哈希映射大小的常数时间。

集合

给定 n = set.length,

  • 添加或删除元素:O(1)
  • 检测元素是否存在:O(1)

栈操作依赖于它们的实现。栈只需要支持弹出和推入。如果使用动态数组实现:

给定 n = stack.length,

  • 推入元素:O(1)
  • 弹出元素:O(1)
  • 查看(查看栈顶元素):O(1)
  • 访问或修改任意索引处的元素:O(1)
  • 检测元素是否存在:O(n)

队列

队列操作依赖于它们的实现。队列只需要支持出队列和入队列。如果使用双链表实现:

给定 n = queue.length,

  • 入队的元素:O(1)
  • 出队的元素:O(1)
  • 查看(查看队列前面的元素):O(1)
  • 访问或修改任意索引处的元素:O(n)
  • 检查元素是否存在:O(n)

注意:大多数编程语言实现队列的方式比简单的双链表更复杂。根据实现的不同,通过索引访问元素可能比 O(n) 快,但有一个重要的常量除数。

二叉树问题 (DFS/BFS)

给定 n 作为树的节点数,

大多数算法的时间复杂度为 O(n*k),其中 k 是在每个节点上做的操作数,通常是 O(1)。这只是一个普遍规律,并非总是如此。我们在这里假设 BFS 是用高效队列实现的。

二叉搜索树

给定 n 作为树中的节点数,

  • 添加或删除元素:最坏的情况下:O(n),平均情况:O(log n)
  • 检查元素是否存在:最坏的情况下:O(n),平均情况:O(log n)

平均情况是当树很平衡时,即每个深度都接近满。最坏的情况是树只是一条直线。

堆/优先队列

给定 n = heap.length 并讨论最小堆,

  • 添加一个元素:O(log n)
  • 删除最小的元素:O(log n)
  • 找到最小的元素:O(1)
  • 查看元素是否存在:O(n)

二分查找

在最坏的情况下,二分查找的时间复杂度为 O(log n),其中 n 是初始搜索空间的大小。

其他

  • 排序:O(n*log n),其中 n 是要排序的数据的大小
  • 图上的 DFS 和 BFS:O(n*k+e),其中 n 是节点数,e是边数,前提是每个节点处理花费都是 O(1),不需要重复遍历。
  • DFS 和 BFS 空间复杂度通常为 O(n),但如果它在图形中,则可能为
  • O(n+e) 来存储图形 动态规划时间复杂度:O(n*k),其中 n 是状态数,k 是每个状态所需要的操作数
  • 动态规划空间复杂度:O(n),其中 n 是状态数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】力扣OJ题:找出只出现一次的数字

Hello everybody!这是我第一次写关于OJ题目的博客,因为正好学到完了C的STL库,就顺手刷了一些OJ题。 我今天要介绍的题目虽然是力扣上的简单题,但思想很巧妙,我觉得有必要和大家分享一下! 1.题目 2.代码 class Solut…

数据中心配电解决方案及项目案例

安科瑞电气股份有限公司 祁洁 15000363176 一、方案背景 为了确保数据中心供电的可靠性,通常会将数据中心的配电关键组件进行冗余设计,关键组件(例如 UPS 单元、冷却系统和备用发电机)被复制。同时将这些配电设备纳入到监控系…

视频批量高效剪辑,支持将视频文件转换为音频文件,轻松掌握视频格式

在数字化时代,视频内容日益丰富,管理和编辑这些视频变得愈发重要。然而,传统的视频剪辑软件往往操作复杂,难以满足高效批量处理的需求。现在,一款全新的视频批量剪辑神器应运而生,它支持将视频文件一键转换…

Day01-环境准备与镜像案例

Day01-环境准备与镜像案例 1. 容器架构1.1 Iaas Paas Saas (了解)1.2 什么是容器1.3 容器vs虚拟机1.4 Docker极速上手指南1)配置docker源(用于安装docker)2)docker下载镜像加速的配置3)自动补全 1.5 Docker C/S架构1.6 Docker的镜像管理1&…

Java链式编程

一:链式编程 可以简化编程。代码简洁。 定义: 链式编程:顾名思义,链子嘛。它是一种编程范式,它允许将多个函数或操作连接在一起,形成一个链条,以执行复杂的操作。 优点: 编程性…

【Gradio】Could not create share link

【Gradio】Could not create share link 写在最前面在服务器端一直运行一个Python脚本解决:下载frpc_linux_amd64文件,并添加权限原理 完整过程:先找gradio库位置,然后发现缺失文件1. 打开终端2. 使用 find 命令查找 gradio 目录3…

vue学习日记22:非父子通信(拓展)-provideinject

一、概念 二、实践 代码 App <template><div class"app">我是APP组件<button click"change">修改数据</button><SonA></SonA><SonB></SonB></div> </template><script> import SonA …

Java SDK 使用示例

我们使用同样的 Maven 模板去创建 use-test-sdk 项目&#xff0c;不同的是&#xff0c;我们需要在 use-tset-sdk 下创建一个 lib 文件夹&#xff0c;用来存放 test-sdk.jar 文件。 我们将 test-sdk.jar 拖放到 use-test-sdk/lib 下&#xff0c;然后我们就可以编写代码了&#…

每日OJ题_BFS解决最短路④_力扣675. 为高尔夫比赛砍树

目录 力扣675. 为高尔夫比赛砍树 解析代码 力扣675. 为高尔夫比赛砍树 675. 为高尔夫比赛砍树 难度 困难 你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示&#xff0c; 在这个矩阵中&#xff1a; 0 表示障碍&#xff0c;无法触碰1 表示地面&…

知道XRD标准品PDF卡片号,如何直接导出标准物质数据,简单快速一分钟完成(附jade下载安装方法)

知道XRD标准品PDF卡片号&#xff0c;如何直接导出标准物质数据&#xff08;附jade下载安装方法&#xff09; 网上找到的方法都是先检索再导出&#xff0c;我的样品根本检索不到&#xff0c;但是根据参考文献知道了自己的pdf卡片号&#xff0c;可通过jade直接导出数据 1.请安装…

【Linux】磁盘扩容到根目录逻辑卷(LVM)

目录 一、物理卷和逻辑卷 1.物理卷和逻辑卷的区别 2.在Linux系统中查看所有物理卷的信息 3.在Linux系统中查看所有逻辑卷的信息 二、文件系统 三、实操-对root&#xff08;/&#xff09;目录进行扩容 1.使用lsblk命令查看新加入的磁盘信息 2.fdisk -l命令查看系统中磁盘…

git报错

这里写自定义目录标题 git报错Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 有一个原因就是在github上设置对应密钥时&#xff0c;有一个key获取应该设置为…

【Redis 神秘大陆】005 常见性能优化方式

五、Redis 性能优化 5.1 系统层面的优化 https://github.com/sohutv/cachecloud/blob/main/redis-ecs/script/cachecloud-init.sh initConfig() {# 支持虚拟内存分配sysctl vm.overcommit_memory1# 最大排队连接数设置为 511&#xff0c;一般默认是 128echo 511 >/proc/sy…

男生穿什么裤子最百搭?适合男生穿的裤子品牌测评分享

每个伙伴们想必经常都会选择一些裤子&#xff0c;但现在市面上的裤子品牌也实在太多了&#xff0c;好不容易选到了几件好看的裤子&#xff0c;结果质量却很不好。主要就是因为现在有太多商家为了利润而使用一些舒适性、质量差的面料&#xff0c;那么今天就给大家分享一些质量上…

引导和服务(2)

服务 1.systemd服务的简要介绍 &#xff08;1&#xff09;对比5 6 可以解决依赖关系并行启动 &#xff08;2&#xff09;按需启动 &#xff08;3&#xff09;自动解决依赖关系 负责在系统启动或运行时&#xff0c;激活系统资源&#xff0c;服务器进程和其它进程 2.System…

操作系统(第五周 第一二堂总结)

目录 回顾 前景知识 概述 定义 进程和线程的关系 进程和线程的区别 线程优缺点 优点&#xff1a; 缺点&#xff1a; 易混概念 线程实现方式 线程的类型&#xff1a; ​编辑 多线程模型&#xff1a; 线程函数 头文件&#xff1a; 线程创建函数&#xff1a; 线…

vscode i18n Ally插件配置项

.vscode文件&#xff1a; {"i18n-ally.localesPaths": ["src/lang"], //显示语言&#xff0c; 这里也可以设置显示英文为en,// 如下须要手动配置"i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested&#xff1a…

氟化钡与盐酸反应不

结论&#xff1a;反应 氟化钡 名称   中文名称&#xff1a;氟化钡   英文别名&#xff1a;Bariumfluoride 化学式   BaF2 相对分子质量   175.32 性状   无色透明立方结晶或白色粉末。溶于盐酸、硝酸、氢氟酸和氯化铵溶液&#xff0c;微溶于水。 相对密度4.83。 熔…

MongoDB 使用

1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2 配置文件配置mongodb资料 # MongoDB连接信息 spring.data.mongodb.host 192.168.23.…

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 本文将介绍如何使用VS2022克隆下载《植物大战僵尸C自制版本》。 Gitee项目地址&#xff1a; Gitee仓库地址https://gitee.com/GITLZ/PlantsVsZombies Github项目地址&#xff1a; Github仓库地址https://github…