常用的数据结构

本文详细介绍了数据结构中的顺序栈、非循环队列和顺序表的概念及实现,包括链式结构的表示。接着深入探讨了哈希表的哈希函数构造方法和冲突解决策略。此外,还阐述了递归的基本概念以及在分治法中的应用,如折半查找和排序算法。最后,讨论了二叉树的性质、存储方式和遍历方法,特别提到了平衡二叉树(如AVL树)和红黑树的特点与调整策略。这些基础知识对于理解和实现高效算法至关重要。
摘要由CSDN通过智能技术生成

顺序栈(Sequence Stack)

栈结构示意图

typedef struct {
	ElemType *elem;
	int top;
	int size;
	int increment;
} SqStack;

队列(Sequence Queue)

非循环队列

非循环队列
循环队列

typedef struct {
	ElemType * elem;
	int front;//对头
	int rear;//队尾
	int maxSize;
}SqQueue;

注意:对于非循环队列,直接使用SqQueue.rear++即可标记数据位置;对于循环队列,使用
SqQueue.rear = (SqQueue.rear + 1) % SqQueue.maxSize来计算当前的插入位置,以及计算循环队列是否已满等判断。

顺序表(Sequence List)##

顺序表

typedef struct {
	ElemType *elem;//基地址
	int length;//记录当前顺序表的长度,及元素个数
	int size;//表的容量
	int increment;//增量
} SqList;

链式结构

链式队列

typedef struct LNode {
    ElemType data;//当前节点元素的数据
    struct LNode *next;//下一个节点元素的地址
} LNode, *LinkList; 

线性表的链式表示

单链表结构

双向链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DnXojPEP-1629679067462)(https://files.mdnice.com/user/15763/15ea507e-246f-41d8-9a45-61ae579da327.png)]

哈希表

  1. 概念

    • 哈希函数:H(key): K -> D , key ∈ K
  2. 构造方法

  • 直接定址法
  • 除留余数法
  • 数字分析法
  • 折叠法
  • 平方取中法
  • 冲突处理方法
  • 链地址法:key 相同的用单链表链接
  • 开放定址法
  • 线性探测法:key 相同 -> 放到 key 的下一个位置,Hi = (H(key) + i) % m
  • 二次探测法:key 相同 -> 放到 Di = 1^2, -1^2, …, ±(k)^2,(k<=m/2)
  • 随机探测法:H = (H(key) + 伪随机数) % m

线性探测的哈希表数据结构

哈希表结构

应用
typedef char KeyType;

typedef struct {
	KeyType key;
}RcdType;

typedef struct {
	RcdType *rcd;
	int size;
	int count;
	bool *tag;//标志
}HashTable;

递归

  • 概念

    • 函数直接或间接地调用自身
  • 递归与分治

    • 分治法
      • 问题的分解
      • 问题规模的分解
    • 折半查找(递归)
    • 归并排序(递归)
    • 快速排序(递归)
  • 递归与迭代

    • 迭代:反复利用变量旧值推出新值
    • 折半查找(迭代)
    • 归并排序(迭代)

二叉树

性质

  1. 非空二叉树第 i 层最多 2(i-1) 个结点 (i >= 1)
  2. 深度为 k 的二叉树最多 2k - 1 个结点 (k >= 1)
  3. 度为 0 的结点数为 n0,度为 2 的结点数为 n2,则 n0 = n2 + 1
  4. 有 n 个结点的完全二叉树深度 k = ⌊ log2(n) ⌋ + 1
  5. 对于含 n 个结点的完全二叉树中编号为 i (1 <= i <= n) 的结点
  • 若 i = 1,为根,否则双亲为 ⌊ i / 2 ⌋
  • 若 2i > n,则 i 结点没有左孩子,否则孩子编号为 2i
  • 若 2i + 1 > n,则 i 结点没有右孩子,否则孩子编号为 2i + 1

二叉树顺序存储

二叉树顺序存储

二叉树链式存储

二叉树链式存储

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

遍历方法

  • 先序遍历
  • 中序遍历
  • 后续遍历
  • 层次遍历

分类

  • 满二叉树
  • 完全二叉树(堆)
    • 大顶堆:根 >= 左 && 根 >= 右
    • 小顶堆:根 <= 左 && 根 <= 右
  • 二叉查找树(二叉排序树):左 < 根 < 右
  • 平衡二叉树(AVL树):| 左子树树高 - 右子树树高 | <= 1
  • 最小失衡树:平衡二叉树插入新结点导致失衡的子树:调整:
    • LL型:根的左孩子右旋
    • RR型:根的右孩子左旋
    • LR型:根的左孩子左旋,再右旋
    • RL型:右孩子的左子树,先右旋,再左旋

平衡二叉树(AVL树)

  • 性质
    • | 左子树树高 - 右子树树高 | <= 1
    • 平衡二叉树必定是二叉搜索树,反之则不一定
    • 最小二叉平衡树的节点的公式:F(n)=F(n-1)+F(n-2)+1 (1 是根节点,F(n-1) 是左子树的节点数量,F(n-2) 是右子树的节点数量)

平衡二叉树

红黑树

  • 红黑树的特征是什么?
  1. 节点是红色或黑色。
  2. 根是黑色。
  3. 所有叶子都是黑色(叶子是 NIL 节点)。
  4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)(新增节点的父节点必须相同)
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。(新增节点必须为红)
  • 调整
    • 变色
    • 左旋
    • 右旋
  • 应用
    • 关联数组:如 STL 中的 map、set

红黑树、B 树、B+ 树的区别?

  • 红黑树的深度比较大,而 B 树和 B+ 树的深度则相对要小一些
  • B+ 树则将数据都保存在叶子节点,同时通过链表的形式将他们连接在一起。

B 树(B-tree)、B+ 树(B±tree)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YEXAOad-1629679067469)(https://files.mdnice.com/user/15763/374c6550-bd21-4724-a23a-0734fcae2b4d.png)]

  • 特点

  • 一般化的二叉查找树(binary search tree)

  • “矮胖”,内部(非叶子)节点可以拥有可变数量的子节点(数量范围预先定义好)

  • 应用

  • 大部分文件系统、数据库系统都采用B树、B+树作为索引结构,如mysql数据库

  • 区别

    • B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
    • B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
  • B树的优点

    • 对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。
  • B+树的优点

    • 非叶子节点不会带上 ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是 - 一个内部节点可以定位更多的叶子节点。
    • 叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。

公众号
微信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值