侯捷 C++ STL学习记录 (二)

p15 Iterator 需要遵守的原则

std :: __iterator_category 分类
difference_type
value_type
iterator 需要五种方法
在这里插入图片描述
容器 vector 实现
1 2倍增长空间
在这里插入图片描述
vector 容器本身大小是 12 三个指针 start finish end_of_storage
size () 通过函数来调用 end() - start()



data : 2020/7/6

vector 继续视频学习
在这里插入图片描述在这里插入图片描述
扩充原理
在这里插入图片描述
1 求得原vector size
2 判断 是否为0
3 2倍成长
4 需要考虑 insert 操作 try 函数
5 新的地址空间 形成后 释放原来的地址空间

vector 迭代器
在这里插入图片描述
新版本4.9
array 容器数组 (必须指定大小,不能扩充)
1 灭有构造 ,没有析构函数
在这里插入图片描述
forward_list (没有详细阐述)

p18 deque
在这里插入图片描述
边界靠 first 和last 确定 ,cur 指向当前元素 回到控制中心靠node 确定

在这里插入图片描述
一个迭代器 有四个变量在这里插入图片描述
cur first last 即绿色部分也为指针 方框部分可以理解为指针数组

deque :: insert() 插入函数插入位置推测
1 如果是 头部直接插入头
2 如果是尾部 直接尾部
在这里插入图片描述
3 如果 都不是 调用辅助函数
insert_aux()
判断距离 size()/2 位置的远近 距离头近则插入头
deque 模拟连续空间
在这里插入图片描述
减号进行了重载 (需要计算当前值有多少个 以及跳过了几个满的的格子 )
在这里插入图片描述
node 是控制中心的格子 (首尾相减-1(buffer个数) )* buffers _size

deque
在这里插入图片描述

一个 deque object 对象
map map_size start finish
map 控制中心 map_size 控制中心size
如果map 满了 2 倍扩容vector 会copy到中间部分,方便向前扩展或者向后扩展在这里插入图片描述在这里插入图片描述
容器 queue
在这里插入图片描述为什么 选 deque 作为 stack 和queue 作为底层
1 也可以选择 list 作为底部 deque 比较快
2 queue 不可以选择vector 作为底层结构
原因是没有 push_front() 局部不行

stack 和 queue 不能选择set 和map 作为底部支撑
不满足基本条件

数据结构知识补充
红黑树 b+树 二叉搜索树
1 二叉搜索树(BST)
(1) 添加 删除 搜索 最坏时间复杂度到达 l2g(n)
(2) 任意一个 节点的值都大于 其左子树所有节点的值 . 都小于其 右子树所有节点的值
char在这里插入图片描述
bst 插入逻辑
插入操作类似于查找,是个递归过程,只不过插入操作在查找不到的时候创建一个新节点并将其加入树,需考虑下面4种情形:

  1. 当前节点的关键值等于待插入节点关键值,则不做任何处理(若需要可更新该节点),返回;
  2. 当前节点的关键值小于待插入节点关键值,根据BST的定义,待插入节点应插入当前节点的左子树:
    a) 若当前节点的左子树为空,则待插入节点应为当前节点的左孩子,新建节点并插入,
    b) 若当前节点的左子树非空,则递归插入;
  3. 当前节点的关键值大于待插入节点关键值,根据BST的定义,待插入节点应插入当前节点的右子树:
    a) 若当前节点的右子树为空,则待插入节点应为当前节点的右孩子,新建节点并插入,
    b) 若当前节点的右子树非空,则递归插入;
  4. 若当前节点为空,则说明当前为空树,待插入节点应为树根。

判断完全二叉树
在这里插入图片描述
二叉搜索树复杂度 (log(n)) 添加删除时 可能会退化成为链表 O(n)
平衡二叉搜索树
在这里插入图片描述
平衡因子 : 某节点的左右子树的高度差
在这里插入图片描述
在这里插入图片描述


避免导致失衡 方法一 LL(left-left ) 右旋(当旋 )
p 的left g的left 都是左边
在这里插入图片描述
旋转之后 依然保持BST树的性质 (神奇神奇 )
在这里插入图片描述
p的right g的right 都是右边 左旋

在这里插入图片描述平衡因子的计算 
node 节点 必须要维护一个高度属性 或者 banlance因子属性 (但是不是所有二叉树搜需要高度这个结点),在AVL 数中写一个 高度属性
在这里插入图片描述
添加节点node 之后一定是叶子结点 ,在查找最小不平衡结点的时候 ,顺便更新 parent 结点的额高度
统一旋转操作
观察交换后的规律得到 强行改变 结点的指向
删除操作 只会影响父亲结点失衡,除父亲结点外不会影响其他结点平衡.在这里插入图片描述
在这里插入图片描述
删除只会导致 一个结点失衡父节点 或者祖先结点失衡(只有一个失衡)

红黑树

在这里插入图片描述

B树 (B-tree)

在这里插入图片描述
B 树性质 (多用于 文件系统 和数据库)
1 一个结点可以储存超过2个元素 ,可以拥有超过2个子节点
2 拥有二叉搜索树的一些性质
3 平衡,每个节 点的所有子树高度一致
4 比较矮

m 阶B树的性质(m>=2)

在这里插入图片描述
在这里插入图片描述
B树搜索
在这里插入图片描述
上溢处理
1 向上合并 ,一直溢出一直向上合并,最终可以形成新的结点
在这里插入图片描述
删除操作
在这里插入图片描述
添加
1 新添加的元素必定在叶子节点中
删除
在这里插入图片描述
删除 下溢 解决
在这里插入图片描述

红黑树
五条性质

在这里插入图片描述
如何等价变换 黑色结点和他的红色等价于一个B树

添加的所有情况
在这里插入图片描述


在这里插入图片描述
一共12 种情况 4 种不用处理
会
会和黑色结点融合成B树

在这里插入图片描述
以上8 种需要 修复

在这里插入图片描述
没有一条路径大于其他路径的两倍
是一种弱平衡,黑高度平衡.
红黑树的最大树高 2* log(n+1) ;

平均时间复杂度
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值