各种数据结构的时间复杂度分析

2023-10-26

对于同一个数据结构来说,底层实现的不同往往会呈现出不同的时间复杂度。以数组为例:

. 普通数组实现 顺序数组实现 二分搜索树(平衡)
插入 O(1) O(n) O(logn)
查找 O(n) O(logn) O(logn)
删除 O(n) O(n) O(logn)

1. 动态数组

对于一个基于Java E[]实现的动态数组Array来说,它的时间复杂度如下:

  • 增:O(n)
  • 删:O(n)
  • 改:已知索引 O(1);未知索引 O(n)
  • 查:已知索引 O(1);未知索引 O(n)
  • resize:通过均摊复杂度分析得 O(1)

2. 数组栈

对于一个基于动态数组Array实现的数组栈ArrayStack来说,它的时间复杂度如下:

  • void push(E): O(1) 均摊
  • E pop(): O(1) 均摊
  • E peek(): O(1)
  • int getSize(): O(1)
  • boolean isEmpty(): O(1)

3. 数组队列

对于一个基于动态数组Array实现的数组队列ArrayQueue来说,它的时间复杂度如下:

  • void enqueue(E): O(1) 均摊
  • E dequeue(): O(n)
  • E front(): O(1)
  • int getSize(): O(1)
  • boolean isEmpty(): O(1)

4. 循环数组队列

对于一个基于Java E[]实现的循环队列LoopQueue来说,它的时间复杂度如下:

  • void enqueue(E): O(1) 均摊
  • E dequeue(): O(1) 均摊
  • E front(): O(1)
  • int getSize(): O(1)
  • boolean isEmpty(): O(1)

数组和链表

数组最大的优点:支持随机访问、快速查询。
数组最好用于索引有语义的情况。

链表最大的优点:动态。
链表不适合用于索引有语义的情况。

5. 链表

  • 增:O(n)
  • 删:O(n)
  • 改:O(n)
  • 查:O(n)

链表不适合修改操作;
如果只对链表头进行增删查操作:O(1)

6. 链表栈

  • 与数组栈各操作的时间复杂度上是同一量级 O(1)。
  • 时间上的差异可能在于:数组栈在分配空间方面;链表栈在new寻找内存空间方面。

7. 链表队列

  • 与数组队列各操作的时间复杂度上是同一量级 O(1)。
  • 特别的,链表的head容易做增、删操作,而tail只容易做增操作,故tail端入队,head端出队。

链表是天然的递归结构。递归调用是有代价的:函数调用+系统栈空间。
递归函数的调试:添加一个递归深度变量depth作为函数参数。

8. 双链表

9. 循环链表

10. 数组链表

11. 集合

. LinkedListSet BSTreeSet BSTreeSet最优 BSTreeSet最差
增add O(n) O(h) O(logn) O(n)
删remove O(n) O(h) O(logn) O(n)
查contains O(n) O(h) O(logn) O(n)

基于搜索树的实现:有序集合
基于哈希表的实现:无序集合

多重集合:集合中的元素可以重复

12. 映射

. LinkedListMap BSTreeMap BSTreeMap最优 BSTreeMap最差
增add O(n) O(h) O(logn) O(n)
删remove O(n) O(h) O(logn) O(n)
改set O(n) O(h) O(logn) O(n)
查contains O(n) O(h) O(logn) O(n)
查get O(n) O(h) O(logn) O(n)

基于搜索树的实现:有序映射
基于哈希表的实现:无序映射

多重映射:映射中的键可以重复

13. 优先队列

. 入队 出队(拿出最大元素)
普通线性结构 O(1) O(n)
顺序线性结构 O(n) O(1)
O(logn) O(logn)

14. 最大堆

操作 时间复杂度
add, Sift Up O(logn)
extractMax, Sift Down O(logn)
  • replace:取出最大元素后,放入一个新元素

实现1:先extractMax,再add,两次O(logn)
实现2:先将堆顶元素替换,再Sift Down,一次O(logn)

  • heapify:将任意数组整理成堆的形状

实现1:将n个元素逐个插入到一个空堆中,O(nlogn)
实现2:从最后一个非叶子节点往堆顶遍历,不断进行Sift Down,O(n):证明略。

15. 线段树

  • 线段树不是完全二叉树,线段树和堆都是平衡二叉树。
操作 使用数组实现 使用线段树
更新 O(n) O(logn)
查询 O(n) O(logn)

16. Trie前缀树

应用:查询一个字符串字典,例如通讯录。

操作 使用树状字典 使用Trie
查询 O(logn) O(w)

如果有100万个条目(2^20),logn约为20;
Trie中w为查询单词的长度,大多数单词的长度小于10。

17. 并查集

数组实现,数组结构的Quick Find版:
查看元素p和元素q是否所属一个集合,时间复杂度是O(1)
合并元素p和元素q所属的集合,时间复杂度是O(n)

数组实现,树状结构的Quick Union版(由孩子指向父亲的特殊树结构):
查看元素p和元素q是否所属一个集合,时间复杂度是O(h)
合并元素p和元素q所属的集合,时间复杂度是O(h)

路径压缩有的并查集:时间复杂度为O(log*n) -> iterated logarithm
比O(logn)要快,略慢于O(1)

18. AVL树

名称来源:发明者的名字开头字母。
1962年提出,最早的自平衡二分搜索树结构。

平衡二叉树:对于任意一个节点,左子树和右子树的高度差不能超过1(平衡因子绝对值不超过1)

真正的O(logn)

19. 2-3树

是一种绝对平衡的搜索树。即根节点到任意一个叶子节点所经过的节点数量一定相同。

20. 红黑树

是一种保持“黑平衡”的二叉树。
不是平衡二叉树,最大高度为2logn,时间复杂度都是O(logn)
与AVL树的对比:
增删操作:红黑树更快,因为维持平衡的时间消耗少
查询操作:AVL更快

21. 哈希表

链地址法解决哈希冲突时,总共有M个地址,如果放入哈希表的元素为N:
(1)每个地址用链表实现,则时间复杂度:O(N/M)
(2)每个地址用平衡树实现,则时间复杂度:O(log(N/M))

动态空间的哈希表:均摊复杂度是O(1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

各种数据结构的时间复杂度分析 的相关文章

  • mybatis中的typeAlias

    mybatis 的 xml 文件中需要写类的全限定名 较繁琐 可以配置自动扫描包路径给类配置别名 有两种配置方式 方式一 mybatis config xml 中配置
  • AB32VG1项目之智能晾衣架

    智能晾机架项目 开发过程 前期准备 分离工程 导入工程 安装包 安装最近的rt thread 包 AB32VG1的 SDK包 RISC V GCC工具链 下载 硬件搭建 开发板上的3 3V能否可用的问题 大体的硬件规划 软件设计 控制逻辑设
  • 关于Unrecognized Windows Sockets error: 5: socket write error 错误

    最近有个需求是从A数据库读取数据导入到B数据库 demo的数据量也就几万条 但是遇到了一个非常罕见的问题 后端框架是mybatis plus spring boot 在insertBatch到数据库B时 没有立即报错 而是执行插入了几百条数
  • 小程序通过webView打开H5页面并传参(包含webView业务域名配置)、H5页面实现返回小程序并实现传参

    小程序内嵌webview实现跳转 传参 1 小程序通过webView打开H5页面并传参 2 H5接收小程序传参 H5返回小程序并实现传参 小程序接收H5传参 目录 一 小程序通过webView打开H5页面并传参 1 业务域名 2 在小程序中
  • (转)认识SAP SD销售模式之跨公司销售

    跨公司销售 销售订单的发货工厂对应的公司和销售组织对应的公司不同 比如 9801公司为销售性公司 9901为生产性的公司 当公司9801接到订单后 直接从9901公司发货 如果不通过跨公司销售 需要9801像9901公司下虚拟的采购订单 然
  • win10 下 Linux使用方法笔记

    最近想学习一下比特币源码 官方推荐是在Linux系统下学习 且推荐在win10 下的Linux系统进行编译运行 所以下面将学习过程记录一下 1 参考了这篇文章中的方法 进行安装WSL https www cnblogs com JettTa
  • agoda获取酒店数据

    最近改了改代码 正好解决了一些报错问题 更新出来 个别处会加蜜 数据库以及线程控制 from DBUtils PooledDB import PooledDB import requests import demjson import ti
  • 堆和栈的区别

    1 1内存分配方面 堆 一般由程序员分配释放 若程序员不释放 程序结束时可能由OS回收 注意它与数据结构中的堆是两回事 分配方式是类似于链表 可能用到的关键字如下 new malloc delete free等等 栈 由编译器 Compil
  • leetcode622-设计循环队列

    本题重点 1 选择合适的数据结构 2 针对选择的数据结构判断 空 和 满 这两点是不分先后次序的 在思考时应该被综合起来 事实上 无论我们选择链表还是数组 最终都能实现题中描述的 循环队列 的功能 只不过选择不同结构时 我们面临和需要解决的
  • 不是一个PDF文件或该文件已损坏

    之前用公司电脑打开PDF文档的时候 出现了这样的一种现象 就是提示格式错误 不是一个PDF文件或该文件已被损坏 有三种解决方法 1 有可能是电脑上自带的PDF阅读软件版本太低 出现了不兼容的现象 换个最新的PDF阅读器吧 我用了福昕阅读器很
  • 【死磕NIO】— 探索 SocketChannel 的核心原理

    大家好 我是大明哥 一个专注于 死磕 Java 系列创作的程序员 死磕 Java 系列为作者 chenssy 倾情打造的 Java 系列文章 深入分析 Java 相关技术核心原理及源码 死磕 Java https www cmsblogs
  • oracle不小心将表update修改了如何回滚

    oracle提供了一种闪回的方法 可以将某个时间的数据给还原回来 SELECT FROM T DIS EVENT RELATION TYPE AS OF TIMESTAMP TO TIMESTAMP 2023 08 08 15 31 00
  • python opencv 在线读取网络图片图像资源

    opencv在线读取网络图片图像资源 照例打开opencv3 3 0 python3 6官方文档 https docs opencv org master d8 dfe classcv 1 1VideoCapture html 详解 官方文
  • Adam和AdamW的区别

    Adam 与 Adamw的区别 一句话版本 Adamw 即 Adam weight decate 效果与 Adam L2正则化相同 但是计算效率更高 因为L2正则化需要在loss中加入正则项 之后再算梯度 最后在反向传播 而Adamw直接将
  • python框架和模型库_一个pytorch库,拥有最先进的架构,预训练模型和实时更新结果...

    PytorchInsight This is a pytorch lib with state of the art architectures pretrained models and real time updated results
  • first season last episode,Rachel finds out Ross likes her,what would she do???

    Scene Central Perk the whole gang is there Ross is showing pictures of his new baby boy Ben to the group Ross And here s
  • Flex布局

    之前一直都是使用position来定位块的位置 现在新学了一个比较主流的flex来定位块的位置 感觉确实比之前的好多了 现在总结下大概的用法 flex是把一个div分成主轴和交叉轴 其中主轴方向的定位有三个 1 flex direction
  • [OpenAirInterface实战-13] :OAI 基站配置文件详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120791987 目录 第1章 基站配
  • Java中为什么数组没有实现Iterable接口,但可以使用foreach语句遍历?

    本质是转成fori形式的循环 上界是数组的size 直接上代码 package com finchina public class TstMain1 public static void main String args int ints

随机推荐

  • 西门子dcs系统组态手册下载_什么是PCS?----西门子PCS7篇

    PCS 7 PCS7是西门子的DCS系统 基于过程自动化 从传感器 执行器到控制器 再到上位机 自下而上形成完整的TIA 全集成自动化 架构 主要包括Step7 CFC SFC Simatic Net和WinCC以及PDM等软件 组态对象选
  • 华为OD题目: 租车骑绿道

    package com darling boot order od od19 import com google common base Strings import java util 租车骑绿道 p 题目 部门组织绿岛骑行团建活动 租用
  • ArrayBlockingQueue

    在java多线程操作中 BlockingQueue
  • [系统安全] 十七.Windows PE病毒概念、分类及感染方式详解

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • Intellij Idea插件开发-创建项目层级的右键菜单

    在使用Android Studio的过程中 发现自带的一些插件无法满足项目的实际需要 便着手自己开发对应的插件 下面是我开发插件过程中的一个记录 会持续和大家分享 分享一 创建Project右键菜单 1 按照项目向导一步一步创建一个Demo
  • 刷脸支付通过人脸识别就可以完成付款

    发展个人码质优价廉所以说 刷脸支付是建立在长达几年的技术积累和市场认可的基础上建立起来的产品 并非是一蹴而就的 刷脸支付的到来 让我们的支付交易手段迈入一个新的阶梯 也可以说是进入了支付的时代 刷脸支付成为新的支付趋势的原因 缓解对外部媒介
  • 最小二乘法

    首先给出公式 最小二乘法的公式 y a x b 其中式中N是数据点的个数 注意 以上两式具有相同的分母 指逐项加法计算 取和 x指对所有的x值求和 y指对所以的y值求和 x 2 指对所有x的平方求和 xy指对所有的积xy进行取和计算 应注意
  • java-es查询

    目录 1 检索ES数据库 2 检索下级数据 3 1 检索多个字段 匹配同一个值 3 2 must 3 3 should 3 3 1 should 一个key多个value 4 java中匹配ES中多个字段查询 为什么加上 keyword反而
  • iis多进程下的全局变量_全局变量初始化顺序探究

    缘起 上一篇文章 调试实战 dll 加载失败之全局变量初始化篇 中 跟大家分享了一个由于全局变量初始化顺序导致的 dll 加载失败的例子 感兴趣的小伙伴儿可以点击阅读 虽然我们知道了是由于全局变量初始化顺序导致的问题 也给出了解决方案 但是
  • 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(四)

    贴接上回 往期FAQ参考 HarmonyOS FAQ HarmonyOS应用开发相关问题解答 一 HarmonyOS FAQ HarmonyOS应用开发相关问题解答 二 HarmonyOS FAQ HarmonyOS应用开发相关问题解答 三
  • 穷举法解锁华为手机bootloader

    理论 理论一次解锁0 025s 穷举要9999999999999999 0 025 60 60 24 365 190258751年 建议大家还是用dc unlocker解锁 shell 脚本 运气好的可以试试 bin bash gt unl
  • 10_react页面跳转方式

    一 声明式导航 react router 6 之前 match
  • 【PCIe】1: PCIe 硬件时序初始化过程

    目录 1 前言 2 PCIe理论带宽 3 PCIe连接器引脚定义 4 关键信号描述 4 1 PERST 4 2 REFCLK 和REFCLK 信号
  • Java运行时动态加载类之ClassLoader加载class及其依赖jar包

    需求场景是 通过ClassLoader动态加载外部class文件 class文件又依赖某个具体jar包 需要动态加载jar包 采用URLClassLoader 1 xml配置文件
  • 封装v-loading全局自定义指令

    当我们刷新页面或者是首次加载的时候 如果后端数据请求比较慢的情况下 页面是会出现白屏情况的 所以我们可以使用 v loading 去优化一下 增加用户的体验性 我们可以有两种方式去实现 1 定义一个 loading 的组件 然后在每一个需要
  • Python---自动生成二维码

    专栏 python 个人主页 HaiFan 专栏简介 本专栏主要更新一些python的基础知识 也会实现一些小游戏和通讯录 学时管理系统之类的 有兴趣的朋友可以关注一下 自动生成二维码 二维码的本质上 就是一段字符串 我们可以把任意的字符串
  • 一位大三学生(准大四)面试网络工程师后的一些想法

    首先声明 这是我面试一家公司的网络工程师后想要表达的一些东西 早就面试完了 但是一直现在才发 以上均为个人想法 本科大学就不说名字了吧 非211 985 是省重点建设高校 省内知名 省外无名 本人专业通信 但是对这个专业无感 所以投身于了网
  • 成为一名黑客(网络安全),需要掌握哪些黑客技能?

    前言 黑客技能是一项非常复杂和专业的技能 需要广泛的计算机知识和网络安全知识 你可以参考下面一些学习步骤 系统自学网络安全 在学习之前 要给自己定一个目标或者思考一下要达到一个什么样的水平 是学完找工作 进大厂 还是兴趣学习提升 成为一个黑
  • Etcd恢复报错:error listing data dir: /var/lib/etcd/default.etcd

    通过systemd托管的etcd数据备份还原无法启动服务并且报错 error listing data dir var lib etcd default etcd 但是单独执行启动命令可以 usr bin etcd debug name d
  • 各种数据结构的时间复杂度分析

    对于同一个数据结构来说 底层实现的不同往往会呈现出不同的时间复杂度 以数组为例 普通数组实现 顺序数组实现 二分搜索树 平衡 插入 O 1 O n O logn 查找 O n O logn O logn 删除 O n O n O logn