数据结构的一些算法

数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合
三要素:逻辑结构、存储结构和数据的运算。主要讲的时逻辑结构,下面会分别说明各结构。
在这里插入图片描述


线性结构链接

线性结构特征应用
后进先出表达式求值;递归中
队列先进先出层次遍历 ;计算机系统中应用
模式匹配算法-KMP
数组存储特殊矩阵:对称矩阵、三角矩阵、稀疏矩阵(十字链表法)

树形结构链接

二叉树,先序遍历(PreOrder)、中序遍历(InOrder)、后序遍历(PostOrder)、层次遍历;
线索二叉树,为方便找到直接前驱和后继,内容有线索二叉树构造、遍历、找前驱和找后继;

树,孩子兄弟表示法、双亲表示法和孩子表示法,应用:哈夫曼编码
先根遍历 ⇔ \Leftrightarrow 二叉树先序遍历
后根遍历 ⇔ \Leftrightarrow 二叉树中序遍历


图状结构链接

图存储:邻接矩阵、邻接表、十字链表(有向图)、邻接多重表(无向图)
图的遍历:广度优先搜索 (BFS),深度优先搜索 (DFS)

图的应用:
最小生成树 【Prim(普里姆)、Kruskal(克鲁斯卡尔)】
最短路径 【Dijkstra(迪杰斯特拉)、Floyd(弗洛伊德)】
拓扑排序(AOV网)
关键路径


查找算法

因为文章篇幅太长了,把查找和排序也加个链接,这里就简单说下是个什么东西
查找算法链接(相同)
在这里插入图片描述

顺序查找法

思想:从头到尾挨个找(反过来也行)
顺序查找时间复杂度: O ( n ) O(n) O(n)

在这里插入图片描述


折半查找法

又称“二分查找”,仅适用于有序的顺序表
折半查找时间复杂度= O ( log ⁡ 2 n ) O(\log_2n) O(log2n)

在这里插入图片描述

在这里插入图片描述


分块查找法

思想:
索引表中记录每个分块的最大关键字、分块的区间;
先查索引表(顺序或折半),再对分块内进行顺序查找.
块内无序,块间有序
在这里插入图片描述

设索引查找和块内查找的平均查找长度分别为 L 1 L_1 L1 L s L_s Ls,则分块查找的平均查找长度为 A S L = L 1 + L s ASL=L_1 + L_s ASL=L1+Ls
A L S = s 2 + 2 s + n 2 s ,当 s = n 时, A L S 最小 = n + 1 ALS = \frac{s^2+2s+n}{2s},当s=\sqrt n时,ALS_{最小}=\sqrt{n}+1 ALS=2ss2+2s+n,当s=n 时,ALS最小=n +1

在这里插入图片描述


树形查找法

n个结点的二叉树最小高度为 ⌊ log ⁡ 2 n ⌋ + 1 \lfloor{\log_2n}\rfloor + 1 log2n+1 或是 ⌈ log ⁡ 2 ( n + 1 ) ⌉ \lceil{\log_2(n+1)}\rceil log2(n+1)
对具有n个关键字的树型结构,具有n+1个叶结点

二叉排序树,BST

左子树节点值 ≤ \leq 根节点值 ≤ \leq 右子树结点值

查找思路:
若树非空,目标值与节点的值比较:
若相等,则查找成功;
若小于根节点,则在左子树上查找,否则在右子树上查找;
查找成功返回节点指针,失败返回NULL

在这里插入图片描述

平衡二叉排序树,AVL

AVL Tree链接
∣ 左子树高 − 右子树高 ∣ ≤ 1 \lvert 左子树高 -右子树高 \rvert \leq 1 左子树高右子树高1,平衡因子只可取-1、0或1。
平衡二叉树平均查找长度为 O ( log ⁡ 2 n ) O(\log_2n) O(log2n)

平衡二叉树

红黑树,RBT

Red/Black Tree链接

简要特点:
左右跟,根叶黑
不红红,黑路同

查找时间复杂度: O ( log ⁡ 2 n ) O(\log_2n) O(log2n)

插入步骤
这张图笑死我了

B树

B-Tree 链接

B树结构:
B树

  • k = ⌈ m / 2 ⌉ k=\lceil{m/2}\rceil k=m/2
    高度为 h 的 m 阶 B 树,含有关键字个数至少是: 2 ⋅ k h − 1 − 1 高度为h的m阶B树,含有关键字个数至少是:2 \cdot k^{h-1}-1 高度为hmB树,含有关键字个数至少是:2kh11
    高度为h的3阶B树,含有关键字个数至少是: 2 h − 1 2^h-1 2h1,同完全二叉树(满二叉)
    高度为h的5阶B树,含有关键字个数至少是: 2 ⋅ 3 h − 1 − 1 2 \cdot 3^{h-1}-1 23h11
    高度为h的完全二叉树至少 2 h − 1 2^{h-1} 2h1个结点,最多 2 h − 1 2^{h}-1 2h1个结点

B树

B+树

在这里插入图片描述

在这里插入图片描述


散列表(哈希表)

在这里插入图片描述

装填因子 α \alpha α越大,平均查找长度变大,“冲突”越多,查找效率越低

处理冲突方法

  • 拉链法,下图:
    在这里插入图片描述
  • 开放定址法,下图:
    在这里插入图片描述
    • 线性探测法: d i = 0 , 1 , 2 , 3 , ⋯   , m − 1 d_i=0,1,2,3,\cdots,m-1 di=0,1,2,3,,m1,发生冲突,紧挨着往后移
    • ②平方探测法,当 d i = 0 2 , 1 2 , − 1 2 , 2 2 , − 2 2 , ⋯   , k 2 , − k 2 d_i=0^2, 1^2, -1^2, 2^2, -2^2, \cdots , k^2, -k^2 di=02,12,12,22,22,,k2,k2,其中 k ≤ m / 2 k \leq m/2 km/2。比起线性探测法更不容易产生“聚集(堆积)”问题。
      在这里插入图片描述
    • ③伪随机序列法, d i d_i di是一个伪随机序列,自己定义的,如 d i = 0 , 3 , 5 , 11 , … di= 0, 3, 5, 11, \ldots di=0,3,5,11,
    • 再散列法(再哈希法):除了原始的散列函数 H ( k e y ) H(key) H(key)之外,多准备几个散列函数,当散列函数冲突时,用下一个散列函数计算一个新地址,直到不冲突为止。

排序

排序算法链接
就看上面这个链接!
在这里插入图片描述

排序算法平均时间复杂度空间复杂度稳定性
直接插入排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
折半插入排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
希尔排序不确定,与增量d选择有关,比插入排序好 O ( 1 ) O(1) O(1)仅顺序表不稳定
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
快速排序 O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2n),划分平均最快,有序或逆序最慢 O ( n 2 ) O(n^2) O(n2)平均 O ( log ⁡ 2 n ) O(\log_2n) O(log2n),最好: O ( log ⁡ 2 n ) O(\log_2n) O(log2n),最坏: O ( n ) O(n) O(n)不稳定
简单选择排序 O ( n 2 ) O(n^2) O(n2),与序列初始状态无关 O ( 1 ) O(1) O(1)不稳定
堆排序 O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2n) O ( 1 ) O(1) O(1)不稳定
归并排序 O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2n),与序列初始状态无关 O ( n ) O(n) O(n)稳定
基数排序 O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)),与初始序列次序无关 O ( r ) O(r) O(r),一般用队列稳定

插入排序

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


交换排序

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

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


选择排序

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


归并排序

在这里插入图片描述


基数排序

在这里插入图片描述


外部排序

在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
12篇学通csharp网络编程——第四篇 TCP应用编程 12篇学通csharp网络编程——第三篇 HTTP应用编程(下) 12篇学通csharp网络编程——第二篇 HTTP应用编程(上) 12篇学通csharp网络编程——第一篇 基础之进程线程 Lucene(1)lucene,你也会(7篇)——第一篇 快速入门 MongoDB(8)8天学通MongoDB——第八天 驱动实践 8天学通MongoDB——第七天 运维技术 8天学通MongoDB——第六天 分片技术 8天学通MongoDB——第五天 主从复制 8天学通MongoDB——第四天 索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之UML——用例图 团队沟通利器之UML——活动图 wcf系列(5)wcf系列学习5天速成——第五天 服务托管 wcf系列学习5天速成——第四天 wcf之分布式架构 wcf系列学习5天速成——第三天 事务的使用 wcf系列5天速成——第二天 binding的使用(2) wcf系列5天速成——第一天 binding的使用(1) wpf系列(8)8天入门wpf—— 第八天 最后的补充 8天入门wpf—— 第七天 画刷 8天入门wpf—— 第六天 细说控件 8天入门wpf—— 第五天 数据绑定 8天入门wpf—— 第四天 模板 8天入门wpf—— 第三天 样式 8天入门wpf—— 第二天 xaml详解 8天入门wpf—— 第一天 基础概念介绍 并行开发(8)8天玩转并行开发——第八天 用VS性能向导解剖你的程序 8天玩转并行开发——第七天 简要分析任务与线程池 8天玩转并行开发——第六天 异步编程模型 8天玩转并行开发——第五天 同步机制(下) 8天玩转并行开发——第四天 同步机制(上) 8天玩转并行开发——第三天 plinq的使用 8天玩转并行开发——第二天 Task的使用 8天玩转并行开发——第一天 Parallel的使用 多线程系列(5)5天不再惧怕多线程——第五天 线程池 5天不再惧怕多线程——第四天 信号量 5天不再惧怕多线程——第三天 互斥体 5天不再惧怕多线程——第二天 锁机制 5天不再惧怕多线程——第一天 尝试Thread 经典算法专题(21)经典算法题每日演练——第二十一题 十字链表 经典算法题每日演练——第二十题 三元组 经典算法题每日演练——第十九题 双端队列 经典算法题每日演练——第十八题 外排序 经典算法题每日演练——第十七题 Dijkstra算法 经典算法题每日演练——第十六题 Kruskal算法 经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 经典算法题每日演练——第十题 树状数组 经典算法题每日演练——第九题 优先队列 经典算法题每日演练——第八题 AC自动机 经典算法题每日演练——第七题 KMP算法 经典算法题每日演练——第六题 协同推荐SlopeOne 算法 经典算法题每日演练——第五题 字符串相似度 经典算法题每日演练——第四题 最长公共子序列 经典算法题每日演练——第三题 猴子吃桃 经典算法题每日演练——第二题 五家共井 经典算法题每日演练——第一题 百钱买百鸡 开发利器系列(1)介绍一个小工具 Linqer 那点所谓的分布式(2)那点所谓的分布式——memcache 那点所谓的分布式——redis 树结构专题(5)6天通吃树结构—— 第五天 Trie树 6天通吃树结构—— 第四天 伸展树 6天通吃树结构—— 第三天 Treap树 6天通吃树结构—— 第二天 平衡二叉树 6天通吃树结构—— 第一天 二叉查找树 算法速成系列(15)算法系列15天速成——第十五天 图【下】(大结局) 算法系列15天速成——第十四天 图【上】 算法系列15天速成——第十三天 树操作【下】 算法系列15天速成——第十二天 树操作【中】 算法系列15天速成——第十一天 树操作(上) 算法系列15天速成——第十天 栈 算法系列15天速成——第九天 队列 算法系列15天速成——第八天 线性表【下】 算法系列15天速成——第七天 线性表【上】 算法系列15天速成——第六天 五大经典查找【下】 算法系列15天速成——第五天 五大经典查找【中】 算法系列15天速成——第四天 五大经典查找【上】 算法系列15天速成——第三天 七大经典排序【下】 算法系列15天速成——第二天 七大经典排序【中】 算法系列15天速成——第一天 七大经典排序【上】 算法洗脑系列(8)算法洗脑系列(8篇)——第八篇 概率思想 算法洗脑系列(8篇)——第七篇 动态规划 算法洗脑系列(8篇)——第六篇 回溯思想 算法洗脑系列(8篇)——第五篇 分治思想 算法洗脑系列(8篇)——第四篇 枚举思想 算法洗脑系列(8篇)——第三篇 贪心思想 算法洗脑系列(8篇)——第二篇 递归思想 算法洗脑系列(8篇)——第一篇 递推思想 天籁数学(3)天籁数学——数列篇(3) 天籁数学——数列篇(2) 天籁数学——数列篇(1) 图形图像(1)玩玩图形图像——第一篇:图片灰度化 小爬虫系列(4)玩玩小爬虫——抓取时的几个小细节 玩玩小爬虫——抓取动态页面 玩玩小爬虫——试搭小架构 玩玩小爬虫——入门
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值