数据结构、STL

news2024/11/24 1:15:30

排序

直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序、外部排序
算法稳定性:稳定的:关键字相同的元素在排序后相对位置不变
不稳定:相对位置变化了就是不稳定
排序算法:内部排序和外部排序
内部排序:数据都在内存中(主要管制时间、空间复杂度)
外部排序:数据太多,无法全部放入内存(除时间、空间复杂度还需关注磁盘读写次数)
在这里插入图片描述
直接插入排序
在这里插入图片描述
在这里插入图片描述

希尔排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简单选择排序
在这里插入图片描述
在这里插入图片描述
堆排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

冒泡排序
在这里插入图片描述在这里插入图片描述

快速排序
在这里插入图片描述
在这里插入图片描述

归并排序
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
基数排序
将关键字的三位分为个、十、百三位,第一趟先按照个位参考分配
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

查找

顺序查找、折半查找、分块查找、二叉排序树、平衡二叉树、散列查找
顺序查找

折半查找
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分块查找
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉排序树
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

平衡二叉树
在这里插入图片描述
在这里插入图片描述

散列查找
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

B树、B+树、红黑树、深度优先遍历、广度优先遍历、前序、中序、后序遍历、BFS和Dijkstra和Floyd算法最短路径

红黑树
BST:二叉查找树
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
B树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
B+树
在这里插入图片描述
叶子节点表示47 48 50 56这四个,而不是这四个分开的单独一个一个
也就是说一定要走到叶子节点的部分
在这里插入图片描述
B树和B+树的区别:
在这里插入图片描述
1.B树n哥关键字对应n+1个分叉,B+树n个关键字对应n个分叉
2.B树(m阶)根节点的关键字树n范围[1,m-1],其他节点关键字字数n在[(m/2)(向上取整)-1,m-1]。B+树根节点关键字数n在[1,m],其他节点的关键字数[m/2(向上取整),m]
3.B+树中叶结点包含全部关键字,非叶结点中出现过的关键字也会出现在叶结点中;B书中各节点的关键字是不重复的。
4.在B+树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。B树的结点中都包含了关键字对应的记录的存储地址。

STL

STL(Standard Template Library)是 C++ 标准库的重要组成部分,提供了一系列通用容器、算法和迭代器。STL 中的容器可以分为三大类:顺序容器关联容器无序关联容器。下面将详细介绍每种容器,包括它们的底层数据结构、是否支持随机存取、查找和删除的复杂度、基本用法声明,以及它们的优缺点。


1. 顺序容器(Sequence Containers)

顺序容器存储元素的顺序和插入顺序保持一致,支持按序号访问。常见的顺序容器包括:

1.1 std::vector
  • 底层数据结构:动态数组(支持自动扩展的连续内存块)

  • 是否支持随机存取:支持,时间复杂度 O(1)

  • 查找和删除的复杂度

    • 插入/删除尾部:O(1)(均摊时间复杂度)
    • 插入/删除中间:O(n)
    • 查找:O(n)
  • 用法声明

    std::vector<int> vec;
    vec.push_back(10);  // 插入元素
    vec.pop_back();     // 删除尾部元素
    int val = vec[0];   // 随机存取
    
  • 优点

    • 支持快速的随机存取(O(1))。
    • 内存是连续分配的,适合频繁的尾部插入和访问。
  • 缺点

    • 当容量不足时,需要扩展容量,这时涉及重新分配和拷贝元素,开销较大。
    • 在中间插入和删除元素效率较低(O(n))。
1.2 std::deque
  • 底层数据结构:双端队列(由多个连续内存块构成,类似分段的数组)

  • 是否支持随机存取:支持,时间复杂度 O(1)

  • 查找和删除的复杂度

    • 插入/删除两端:O(1)
    • 插入/删除中间:O(n)
    • 查找:O(n)
  • 用法声明

    std::deque<int> deq;
    deq.push_front(10);  // 在前端插入
    deq.push_back(20);   // 在尾部插入
    int val = deq[1];    // 随机存取
    
  • 优点

    • 支持两端的高效插入和删除(O(1))。
    • 支持随机存取,适合频繁的两端操作。
  • 缺点

    • 随机存取稍慢于 vector,因为内存不是连续的。
    • 中间插入和删除操作效率较低(O(n))。
1.3 std::list
  • 底层数据结构:双向链表

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除两端:O(1)
    • 插入/删除中间:O(1)
    • 查找:O(n)
  • 用法声明

    std::list<int> lst;
    lst.push_front(10);  // 在前端插入
    lst.push_back(20);   // 在尾部插入
    lst.pop_front();     // 删除前端
    
  • 优点

    • 双向链表,适合频繁的插入和删除操作。
    • 插入和删除操作只需调整指针,效率高。
  • 缺点

    • 不支持随机存取。
    • 查找某个元素时效率低(O(n))。
1.4 std::forward_list
  • 底层数据结构:单向链表

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除头部:O(1)
    • 插入/删除中间:O(1)(需通过迭代器找到位置)
    • 查找:O(n)
  • 用法声明

    std::forward_list<int> flist;
    flist.push_front(10);  // 插入到前端
    flist.pop_front();     // 删除前端
    
  • 优点

    • 单向链表结构,内存占用较少。
    • 适合简单的前端插入和删除操作。
  • 缺点

    • 不支持随机存取。
    • 只能前向遍历,不支持双向遍历。

2. 关联容器(Associative Containers)

关联容器通过键值对存储数据,基于平衡树(通常为红黑树)。常见的关联容器包括:

2.1 std::set
  • 底层数据结构:红黑树(平衡二叉搜索树)

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(log n)
    • 查找:O(log n)
  • 用法声明

    std::set<int> s;
    s.insert(10);  // 插入元素
    s.erase(10);   // 删除元素
    bool found = s.find(10) != s.end();  // 查找元素
    
  • 优点

    • 集合中的元素自动排序。
    • 支持快速的查找、插入和删除操作(O(log n))。
  • 缺点

    • 不支持随机存取。
    • 插入和删除操作相对 unordered_set 较慢。
2.2 std::map
  • 底层数据结构:红黑树

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(log n)
    • 查找:O(log n)
  • 用法声明

    std::map<int, std::string> m;
    m[1] = "one";  // 插入键值对
    m.erase(1);    // 删除键值对
    auto it = m.find(1);  // 查找键
    
  • 优点

    • 键值对按键自动排序。
    • 支持高效的查找、插入和删除操作(O(log n))。
  • 缺点

    • 不支持随机存取。
    • 相比 unordered_map,操作速度较慢。
2.3 std::multiset
  • 底层数据结构:红黑树

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(log n)
    • 查找:O(log n)
  • 用法声明

    std::multiset<int> ms;
    ms.insert(10);  // 插入元素
    ms.erase(10);   // 删除元素
    
  • 优点

    • 允许元素重复,自动排序。
    • 高效的插入、删除和查找操作。
  • 缺点

    • 不支持随机存取。
    • 相较于 set,查找特定值时可能需要遍历多个相同元素。
2.4 std::multimap
  • 底层数据结构:红黑树

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(log n)
    • 查找:O(log n)
  • 用法声明

    std::multimap<int, std::string> mm;
    mm.insert({1, "one"});  // 插入键值对
    mm.erase(1);            // 删除键值对
    
  • 优点

    • 允许重复键,自动排序。
    • 支持高效的查找、插入和删除操作。
  • 缺点

    • 不支持随机存取。
    • 插入和删除效率相较于 map 略低。

3. 无序关联容器(Unordered Associative Containers)

无序关联容器基于哈希表实现,常见的无序容器包括:

3.1 std::unordered_set
  • 底层数据结构:哈希表

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(1)(平均)
    • 查找:O(1)(平均)
  • **用法

声明**:

std::unordered_set<int> us;
us.insert(10);  // 插入元素
us.erase(10);   // 删除元素
bool found = us.find(10) != us.end();  // 查找元素
  • 优点

    • 插入、查找和删除操作的平均时间复杂度是 O(1)。
    • 无序存储,效率高。
  • 缺点

    • 元素无序存储,无法进行有序遍历。
    • 最坏情况下,时间复杂度可能退化到 O(n)。
3.2 std::unordered_map
  • 底层数据结构:哈希表

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(1)(平均)
    • 查找:O(1)(平均)
  • 用法声明

    std::unordered_map<int, std::string> um;
    um[1] = "one";  // 插入键值对
    um.erase(1);    // 删除键值对
    auto it = um.find(1);  // 查找键
    
  • 优点

    • 插入、查找和删除操作的平均时间复杂度是 O(1)。
    • 无序存储,效率高。
  • 缺点

    • 元素无序存储,无法进行有序遍历。
    • 最坏情况下,时间复杂度可能退化到 O(n)。
3.3 std::unordered_multiset
  • 底层数据结构:哈希表

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(1)(平均)
    • 查找:O(1)(平均)
  • 用法声明

    std::unordered_multiset<int> ums;
    ums.insert(10);  // 插入元素
    ums.erase(10);   // 删除元素
    
  • 优点

    • 允许重复元素,插入、删除和查找的平均时间复杂度为 O(1)。
  • 缺点

    • 元素无序存储,无法有序遍历。
    • 最坏情况下,时间复杂度退化到 O(n)。
3.4 std::unordered_multimap
  • 底层数据结构:哈希表

  • 是否支持随机存取:不支持

  • 查找和删除的复杂度

    • 插入/删除:O(1)(平均)
    • 查找:O(1)(平均)
  • 用法声明

    std::unordered_multimap<int, std::string> umm;
    umm.insert({1, "one"});  // 插入键值对
    umm.erase(1);            // 删除键值对
    
  • 优点

    • 允许重复键,插入、查找和删除的平均时间复杂度为 O(1)。
  • 缺点

    • 元素无序存储,无法有序遍历。
    • 最坏情况下,时间复杂度退化到 O(n)。
      在这里插入图片描述

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

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

相关文章

OrionX vGPU 研发测试场景下最佳实践之CodeServer模式

在之前的文章中&#xff0c;我们讲述了OrionX vGPU基于SSH模式、以及Jupyter模式下的最佳实践&#xff08;文末附回顾链接~&#xff09;&#xff0c;今天&#xff0c;让我们走进CodeServer模式的最佳实践。 • CodeServer模式&#xff1a;微软的VSCode的服务器版本&#xff0c;…

匿名管道详解

进程间通讯的目的 数据传输&#xff1a;一个进程需要把它的数据发送给另一个数据资源共享&#xff1a;多个进程需要共享同样的资源通知事件&#xff1a;一个进程需要向另一个或者一组进程发送消息&#xff0c;通知它发生了某种事件&#xff08;如进程终止时要通知父进程&#…

Python数据分析-Steam 收入排名前 1500 的游戏

一、研究背景 随着全球数字化进程的加速&#xff0c;电子游戏产业已成为全球娱乐产业的重要组成部分&#xff0c;吸引了越来越多的资本与消费者关注。特别是基于互联网的游戏平台&#xff0c;如Steam&#xff0c;已成为全球范围内发行和销售游戏的重要渠道。Steam平台不仅为玩…

高通Liunx 系统镜像编译

本文将会介绍如何在编译高通Liunx代码, 具体可以在高通 Linux | 高通下查看相关信息。 编译服务器配置 首先&#xff0c;准备一台Ubuntu 22.04版本主机或者服务器 1&#xff0c;编译Yocto 系统&#xff0c;需要如下一些配置 sudo apt update sudo apt install repo gawk wg…

钢轨缺陷检测-目标检测数据集(包括VOC格式、YOLO格式)

钢轨缺陷检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1h7Dc0MiiRgtd7524cBUOFQ?pwdfr9y 提取码&#xff1a;fr9y 数据集信息介绍&#xff1a; 共有 1493 张图像和一一对应的标注文件 标…

STM32—I2C

1.I2C I2C总线(Inter l0 BUs)是由Philips公司开发的一种通用数据总线两根通信线:SCL(Serial Clock)、SDA(Serial Data)同步&#xff0c;半双工带数据应答支持总线挂载多设备(一主多从、多主多从) MPU6050模块&#xff1a;可以进行姿态测量&#xff0c;使用了12C通信协议 第3个…

IAPP发布《2024年人工智能治理实践报告》

文章目录 前言一、黑箱问题►透明度、可理解性与可解释性二、法律和政策中的注意事项►欧盟的《通用数据保护条例》►欧盟的AI法案►NIST的AI风险管理框架►美国的第14110号行政命令►《生成式人工智能服务管理暂行办法》►新加坡的AI验证三、实施人工智能治理►模型卡与系统卡…

2023高教社杯全国大学生数学建模竞赛C题 Python代码演示

目录 问题一1.1 蔬菜类商品不同品类或不同单品之间可能存在一定的关联关系&#xff0c;请分析蔬菜各品类及单品销售量的分布规律及相互关系。数据预处理数据合并提取年、月、日信息对蔬菜的各品类按月求销量均值 季节性时间序列分解STL分解加法分解乘法分解 ARIMALSTM import p…

热成像目标检测数据集

热成像目标检测数据集 V2 版本 项目背景 热成像技术因其在安防监控、夜间巡逻、消防救援等领域的独特优势而受到重视。本数据集旨在提供高质量的热成像图像及其对应的可见光图像&#xff0c;支持热成像目标检测的研究与应用。 数据集概述 名称&#xff1a;热成像目标检测数据…

多目标优化算法求解LSMOP(Large-Scale Multi-Objective Optimization Problem)测试集,MATLAB代码

LSMOP&#xff08;Large-Scale Multi-Objective Optimization Problem&#xff09;测试集是用于评估大规模多目标优化算法性能的一组标准测试问题。这些测试问题通常具有大量的决策变量和目标函数&#xff0c;旨在模拟现实世界中的复杂优化问题。 LSMOP测试集包含多个子问题&am…

深度学习之微积分预备知识点

极限&#xff08;Limit&#xff09; 定义&#xff1a;表示某一点处函数趋近于某一特定值的过程&#xff0c;一般记为 极限是一种变化状态的描述&#xff0c;核心思想是无限靠近而永远不能到达 公式&#xff1a; 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…

2024 VMpro 虚拟机中如何给Ubuntu Linux操作系统配置联网

现在这是一个联网的状态 可以在商店里面下载东西 也能ping成功 打开虚拟网络编辑器 放管理员权限 进行设置的更改 选择DNS设置 按提示修改即可 注意的是首选的DNS服务器必须是114.114.114.114 原因 这边刚刚去查了一下 114.114.114.114 是国内的IP地址 8.8.8.8 是国外的I…

【人工智能】OpenAI最新发布的o1-preview模型,和GPT-4o到底哪个更强?最新分析结果就在这里!

在人工智能的快速发展中&#xff0c;OpenAI的每一次新模型发布都引发了广泛的关注与讨论。2023年9月13日&#xff0c;OpenAI正式推出了名为o1的新模型&#xff0c;这一模型不仅是其系列“推理”模型中的首个代表&#xff0c;更是朝着类人人工智能迈进的重要一步。本文将综合分析…

PFC和LLC的本质和为什么要用PFC和LLC电路原因

我们可以用电感和电容的特性&#xff0c;以及电压和电流之间的不同步原理来解释PFC&#xff08;功率因数校正&#xff09;和LLC&#xff08;谐振变换器&#xff09;。 电感和电容的基本概念 电感&#xff08;Inductor&#xff09;&#xff1a; 电感是一种储存电能的组件。它的…

PhotoZoom Pro / Classic 9.0.2激活版安装激活图文教程

图像格式中&#xff0c;位图格式的图像是由点阵像素组成的数据文件&#xff0c;所以呢在把位图图像放大的时候&#xff0c;就会发现看到它是由于许多点构成&#xff0c;这就是为什么数码照片在使用普通的工具放大时会失真的原因。不过呢由于一些日常需求&#xff0c;我们经常需…

图神经网络模型扩展5--3

以图卷积网络为例&#xff0c;在每一层卷积中&#xff0c;我们需要用到两个输入A∈Rnn 和X∈Rnd。 很容易想象&#xff0c;当输入的图数据很大时(n 很大),图卷积网络的计算量是很大的&#xff0c;所需要的内存也是很大的。推广到更一般的信息传递网络&#xff0c;在每一层中&am…

Python 课程12-Python 自动化应用

前言 Python 自动化应用 可以帮助开发者节省时间和精力&#xff0c;将重复性、手动操作变为自动化脚本。例如&#xff0c;Python 可以用于自动化处理文件、邮件、生成报表&#xff0c;甚至可以控制浏览器执行复杂的网页操作任务。借助 Python 的强大库和工具&#xff0c;可以轻…

Kubernetes 常用指令2

kubernetes 常用命 令 1. 编写 yaml 文件 2. kubectl create 通过配置文件名或标准输入创建一个集群资源对象&#xff0c;支 持 json 和 yaml 格式的文件 语法&#xff1a; kubectl create -f 文件名 kubectl create deployment 资源名 --image镜像名 kubectl create deplo…

视频格式转为mp4(使用ffmpeg)

1、首先安装ffmpeg&#xff0c;下载链接如下 https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1.1-full_build.7z 安装后确保ffmpeg程序加到PATH路径里&#xff0c;cmd执行ffmpeg -version出现下图内容表示安装成功。 2、粘贴下面的脚本到文本文件中&#xff0c;文件后缀…

【Linux进程控制】进程创建|终止

目录 一、进程创建 fork函数 写时拷贝 二、进程终止 想明白&#xff1a;终止是在做什么&#xff1f; 进程退出场景 常见信号码及其含义 进程退出的常见方法 正常终止与异常终止 exit与_exit的区别 一、进程创建 fork函数 在Linux中fork函数是非常重要的函数&#x…