C++ STL 关联容器

news2024/9/20 22:51:55

系列文章目录

C++STL迭代器iterator设计 https://blog.csdn.net/surfaceyan/article/details/126772555
C++ STL 序列式容器(一 vector list) https://blog.csdn.net/surfaceyan/article/details/126860166
C++ STL 序列式容器(二 deque slist) https://blog.csdn.net/surfaceyan/article/details/127083966
tinystl_list Debug https://blog.csdn.net/surfaceyan/article/details/128105082


C++11 标准库头文件模拟实现,无锁STL https://blog.csdn.net/surfaceyan/article/details/139887490


文章目录

  • 系列文章目录
  • ● 一、树
    • 基本概念
    • 二叉搜索树 binary search tree
    • 平衡二叉搜索树 balanced binary search tree
    • AVL tree (Adelson-Velskii-Landis tree)
      • 平衡破环情况
      • 单旋转(Single Rotation) 左左,右右
      • 双旋转(Double Rotation)
    • RB-tree(红黑树)
      • 插入节点
      • 由上而下的程序
    • RB_tree的设计
    • RB-tree插入示例
  • 二、set, map, multiset, multimap
  • 三、hashtable
    • hashtable的桶(buckets)与节点(nodes)
  • 总结


● 一、树

基本概念

树由节点(nodes)和边(edges)构成。整棵树有一个最上端节点,称为根节点(root)。每个节点可以有具有方向性的边(directed edges),用来和其它节点相连。父节点(parent),子节点(child)。无子节点者称为叶子节点(leaf)。子节点可以存在多个,如果最多只允许两个子节点,即所谓二叉树(binary tree)。不同的节点如果拥有相同的父节点,则彼此互为兄弟节点(siblings)。根节点至任何节点之间有唯一路径(path),路径所经过的边数,称为路径长度(length)。根节点至任意节点的路径长度,即所谓该节点的深度(depth)。根节点的升读永远是0。某节点至其最深子节点(叶节点)的路径长度,称为该节点的高度(height)。整棵树的高度,便以根节点高度来代表。节点A->B之间如果存在(唯一)一条路径,那么A称为B的祖代(ancestor),B称为A的子代(descendant)。任何节点的大小(size)是指其所有子代(包括自己)的节点总数。
在这里插入图片描述

二叉搜索树 binary search tree

任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。

  • 1
    所以,从根节点一直往左走,直至无路可走,即得最小元素;从根节点一直往右走,直至无路可走,即得最大元素。下图为二叉搜索树
    在这里插入图片描述
  • 2 元素插入
    插入新元素时,从根节点开始,遇键值较大得就向左,遇到键值较小得就向右,一直到尾端,即为插入点。
    在这里插入图片描述
  • 3 元素删除
    1)当A只有一个子节点时,直接将A得子节点连接至A得父节点,并将A删除
    2)A有两个子节点,以右子树内得最小节点取代A。注意右子树得最小节点为:从右子节点开始以指向右走至底即是。
    在这里插入图片描述

二叉搜索数还有个特点:树的节点从最左边到最右边是递增的
在这里插入图片描述

平衡二叉搜索树 balanced binary search tree

二叉搜索树可能失去平衡造成搜寻效率低落得情况,极端情况下二叉搜索树退化为链表。

“平衡”的大致意义是:没有任何一个节点过深。不同的平衡条件,早就处不同的效率表现,以及不同的实现复杂度。有数种特殊结构如AVL-tree, RB-tree, AA-tree,均可实现处平衡二叉搜索树。

AVL tree (Adelson-Velskii-Landis tree)

AVL tree是一个“加上了额外平衡条件”的二叉搜索树。
平衡: 任何节点的左右子树高度相差最多1,若无右(左)子节点则右(左)子树高度为0

当插入新元素11后平衡条件破坏
在这里插入图片描述

平衡破环情况

“插入前平衡,插入后不平衡” 的节点为X

  1. 插入点位于X的左子节点的左子树——左左
  2. 插入点位于X的左子节点的右子树——左右
  3. 插入点位于X的右子节点的左子树——右左
  4. 插入点位于X的右子节点的右子树——右右

单旋转(Single Rotation) 左左,右右

在这里插入图片描述

双旋转(Double Rotation)

图中C可能比B多一层(实际插入到了C子树的叶子节点),也有可能比B少一层(实际插入到了B子树的叶子节点)。
(图中ABCD子树高度为示意图)
在这里插入图片描述

RB-tree(红黑树)

红黑树(balanced binary search tree)是一个二叉搜索树,且必须满足如下规则:

  1. 每个节点不是红色就是黑色(深黑,浅红)
  2. 根节点为黑色
  3. 如果节点为红,其子节点必须为黑
  4. 任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同

总结:根节点为黑色,新节点必须为红色,并且只能插入在黑色节点下,若不满足插入条件需要调整红黑树

插入节点

  • 情况1
  • 情况2
  • 情况3
  • 情况4

由上而下的程序

RB_tree的设计

在root节点之前插入一个header节点:
在这里插入图片描述
在这里插入图片描述

在构造rb_tree是header节点随之建立

struct node
{
  node* parent;
  node* left;
  node* right;
  node_color color;

  V value;
};
header->parent = 0;  header->parent = root;

header的left指向整个数的最左边的节点,right指向最右边的节点,parent指向root
begin()返回header->left, end()返回header

RB-tree插入示例

一次插入10, 7,8,15,5,6,11,13,12

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

二、set, map, multiset, multimap

它们的底层实现都是基于红黑数的,所有的操作只是将其传递给红黑树,具体操作都是由该数完成。

typedef set/map/mulset/multimap container_type

class container_type{
private:
	rb_tree t;
public:
	return_type insert(value_type)
	{ insert_unique(x)(set,map)  insert_equal(x) (multixxx) }
};

三、hashtable

最简单的哈希表就是数组。将数组用作哈希有两个问题:1.如果元素是64-bits则数组大小过大。 2.如果key不是整数则无法将key作为索引。
对于第二个问题,可以将非整形的key编码为整形,如可将字符串“jjhou”编码为’j’*128^4 + ‘j’*128^3 + ‘h’*128^2 + ‘o’*128^1 + ‘u’*128^0 = 超级大的数
对于第一个问题,如果避免超级大的数组索引,使用hash function将其映射为小数。如 X % TableSize会得到一个[0, TableSize-1]之间的数。

引入hash必然会有哈希碰撞问题。

线性探测(linear probing):

负载系数(loading factor),元素个数/表格大小。负载系数一般在[0,1]
当哈希函数计算出某个元素的插入位置,而该位置上的空间已不再可用时,最简单的办法就是循序往下一一寻找(如果到达尾端就绕道头部继续寻找),直到找到一个可用空间为止。只要表格(array)足够大,总能找到一个可用空间,只是花费时间不确定。进行元素搜索时,如果哈希函数计算出来的位置上的元素值与我们的搜寻目标不符就一一往下搜索,直到找到或者遇上空格元素。元素的删除必须采用惰性删除,即只是标记删除记号,实际删除操作则等待表格重新整理(rehashing)时在进行。
在这里插入图片描述

二次探测:

二次探测主要用来解决主集团(primary clustering)的问题。其命名由来是因为解决碰撞问题的方程F(i) = i^2是个二次方程。如果哈希函数计算处新元素的位置为H,而该位置已被占用,那么则依次尝试 H+1^2, H+2^2, H+3^2, H+4^2, , , H+i^2,而不是像线性探测那样依次尝试H+1, H+2, H+3, H+4, … , H+i
在这里插入图片描述

开链(separate chaining):

每一个表格元素中维护一个list,哈希函数为我们分配一个list,然后在那个list中执行元素的插入、搜索、删除等操作。
开链法的负载系数会大于1。SGI STL的哈希表便是采用这种做法。

hashtable的桶(buckets)与节点(nodes)

开链法的hash table表格内的每个元素称为桶。
在这里插入图片描述

template<class Value>
struct __hashtable_ndoe{
  __hashtable_ndoe* next;
  Value val;
};

hashtable的元素插入示意图
unordered_map中的bucket个数为 1, 13,xxx 59等
当插入元素时会向对应的bucket中插
在这里插入图片描述
当负载系数达到要求后会触发重整:
在这里插入图片描述


总结

containerimpl
setrb-tree
multisetrb-tree
maprb-tree
multimaprb-tree
unordered_sethashtable
unordered_multisethashtable
unordered_maphashtable
unordered_multimaphashtable

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

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

相关文章

Vue中的methods方法与computed计算属性的区别

在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的…

求解向量中连续子向量的最大和

开篇 本篇文章旨在求解向量中n个连续子向量的最大和。题目来源是《编程珠玑》第8章《算法设计技术》。 问题描述 输入:具有n个浮点数的向量x; 输出:输入向量的任何连续子向量中的最大和; 例如&#xff1a;输入向量为31,-41,59,26,-53,58,97,-93,-23,84; 那么输出就是从59到97五…

基于java+springboot+mysql校园预约自习室网站43642-计算机毕业设计项目选题推荐(免费领源码)

摘要 在社会快速发展的影响下&#xff0c;教育事业蓬勃发展&#xff0c;大大增加了学校的数量、多样性、教育质量等要求&#xff0c;使教育的管理和运营比过去更加困难。依照这一现实为基础&#xff0c;设计一个快捷而又方便的校园预约自习室网站是一项十分重要并且有价值的事情…

回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序

回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序 文章目录 前言回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序 一、NGO-LSSVM模型1. LSSVM&#xff08;最小…

联网可视化:引领智能出行新时代

图扑车联网可视化系统整合数据监测与分析&#xff0c;提升交通管理效率&#xff0c;优化车辆调度&#xff0c;提高道路安全&#xff0c;为用户提供智能化、便捷的出行体验。

使用Python实现方波信号傅里叶变换

目录 概述 1 方波信号 1.1 问题描述 1.2 傅里叶级数的数学实现 2 函数实现 2.1 方波信号实现 2.2 方波信号的傅里叶函数 3 测试函数 3.1 测试原理 3.2 改变K值的波形变化 概述 本文主要介绍使用使用Python实现方波信号傅里叶变换的方法&#xff0c;笔者首先介绍了方…

如何使用ssm实现基于java的奶茶店管理系统的设计与实现

TOC ssm140基于java的奶茶店管理系统的设计与实现jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于奶茶店管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、奶茶分类管…

Kubectl基础命令使用

一.Kubectl 基础命令 格式&#xff1a; kubectl [command] [TYPE] [NAME] [FLAGS] kubectl 是 Kubernetes 的命令行工具&#xff0c;用于管理 Kubernetes 集群。以下是一些常用的 kubectl 命令及其选项&#xff1a; 常用命令 获取资源 列出所有资源类型&#xff08;Pods、De…

【C++】OJ习题 篇1

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、string&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…

【奇某信-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

(论文解读)Domain Adaptation via Prompt Learning

摘要 无监督域适应( UDA )旨在将从带有标签的源域数据中学习到的模型适应到未标注的目标域数据集。现有的UDA方法通过对齐源域和目标域特征空间来学习领域不变特征。这种对齐是通过约束实现的&#xff0c;例如统计差异最小化或对抗学习。 然而&#xff0c;这些约束会导致语义…

【自动驾驶】控制算法(四)坐标变换与横向误差微分方程

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

浙大版循环结构程序设计 7-6-1 贪心法-找零钱

7-6-1 贪心法-找零钱 #include <stdio.h>int main(){int n5,n2,n1,money,total;int flag 1; //判断是否符合条件然后跳出循环scanf("%d",&money);if(money>100){printf("Invalid.");}for(n5money/5;(flag1)&&(n5>0);n5--){for(n2…

2-75 基于matlab的多尺度小波核svm预测

基于matlab的多尺度小波核svm预测&#xff0c;数据归一化操作&#xff0c;尺度小波核函数作为核函数进行训练&#xff0c;训练后的模型进行预测。程序已调通&#xff0c;可直接运行。 2-75 多尺度小波核 SVM预测 - 小红书 (xiaohongshu.com)

Java 认识String类

1. 创建字符串 常见的构造 String 的方式 //方式一&#xff1a;String str "hello world";//方式二&#xff1a;String str2 new String("Hello world");//方式三&#xff1a;char[] array {a,b,c};String str3 new String(array);注意事项&#xff1…

Promise学习之初步认识Promise

目录 前言 一、认识Promise (一) 含义 (二) 代码演示 二、Promise状态 三、总结 前言 在上一篇的学习中&#xff0c;我们已经认识到了同步与异步&#xff0c;异步代码在解决同步代码问题的同时&#xff0c;也会产生一些新的问题&#xff0c;比如常说的回调地狱&#xff0…

DBSCAN算法及Python实践

DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的空间聚类应用&#xff09;算法是一种基于密度的聚类算法&#xff0c;它在机器学习和数据挖掘领域有广泛的应用。以下是DBSCAN算法的主要原理和特点&#xff1a…

系统编程-管道

管道 目录 管道 1、管道的特点 2、无名管道的使用步骤 &#xff08;1&#xff09;在进程中使用 pipe 函数来获取管道的文件描述符 &#xff08;2&#xff09;使用 fork 函数来创建子进程 &#xff08;3&#xff09;通过获取到的文件描述符来进行数据的传输 &#xff08…

第八周:机器学习

目录 摘要 Abstract 一、注意力机制V.S.自注意力机制 1、引入 2、注意力机制 3、自注意力机制 二、自注意力机制 1、输入 2、输出 3、序列标注 4、Multi-head Self-attention 5、比较 总结 摘要 前两周学习了CNN的基本架构&#xff0c;针对全局信息的考虑问题&…

【Kotlin设计模式】Kotlin实现单例模式

前言 单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。在 Android 中&#xff0c;有许多系统服务和 API 使用了单例模式&#xff0c;比如&#xff1a; Context: 通过getApplication…