408王道数据结构强化——应用题(三)

简介: 408王道数据结构强化——应用题

3.图

3.1.最小生成树(Prim和Kruskal)

408数据结构学习笔记——图的应用_江南江南江南丶的博客-CSDN博客_408数据结构

MST不唯一优先使用Kurskal

1.Prim算法:每次选择一个新的未连通的顶点(选点

①从某一个顶点开始构建最小生成树,依次加入当前剩余顶点中代价最小的顶点,直到加入所有顶点

②时间复杂度:O(|gif.gif|)

③适用:稠密图f9dd4d6fc019447e8f396aacad041c9f.png

2.Kruskal:每次选择未被选取过且权值最低的边(选边

每次选择代价最小的一条边,使该边的两个顶点相通,但是,如果原本就相通的两个顶点的边就不选,直到所有顶点相通

②时间复杂度:O(gif.gif)

③适用:稀疏图

64b99bccc0bb45a3bf7b9fa7f15549a2.png

3.2.最短路径(Dijkstra和Flyod)

408数据结构学习笔记——图的应用_江南江南江南丶的博客-CSDN博客_408数据结构

1.Dijkstra(单源最短路径):每次选择一个当前已知最短路径的顶点加入顶点集,然后再经过改顶点更新路径

038222154feb4cf68ce34dea5911e6aa.png

①选择v1:ee3946fbd9154ce08a3d711402062e78.png

②选择v6:

31bf7c9d9aaa418f8695337db33aa79b.png

③选择v5:729177cf8ce14cc08275179528149758.png

④选择v2:4670731da498461eb9a2263894a0d8e1.png

⑤选择v495c98e78c2d643ab958766fe42405a13.png

⑥选择v3:

dd6fc51e1f034135859c348402f084e3.png

时间复杂度:O(gif.gif

不适用:权值出现负值

2.floyd(多源最短路径):依次选择图中的顶点加入路径,若经过改顶点到达其他顶点的权值更低,则将该顶点加入到达该点的路径

空间复杂度:创建两个二维数组O(n2)

时间复杂度:三个for循环O(n3)

3.3.有向无环图

3.3.1.描述算式e95eb6705e564cf9947f43430ce4b9e0.png6d96862e07674b29905e24c8c6c9671b.png

3.3.2.拓扑排序

  1. 从AOV网中选择一个没有前驱的顶点输出
  2. 在AOV网中删除该顶点和所有以它为起点的顶点
  3. 重复1、2直到AOV网中没有顶点eb01451d0c884c6397fe727016cf4677.png

1→2→4→3→5

3.3.3.关键路径

408数据结构学习笔记——图的应用_江南江南江南丶的博客-CSDN博客_408数据结构

3.4.图的数据结构

1.邻接矩阵(顺序存储):无向图是实对称矩阵

#define MAXVEX 100    //最大顶点数
typedef struct Graph {
    char vexData[MAXVEX];    //一维数组,存放顶点数据
    int Edge[MAXVEX][MAXVEX];    //二维数组,存放邻接矩阵
    int vexNum, edgeNum;    //顶点数和弧数
}Graph;

b0f70545113e4d55b14b14238831045d.png

2.邻接表(链式存储)

6.2.2图的存储结构——邻接表法_123_YQH的博客-CSDN博客_邻接表法

#define MAXVEX 100
typedef struct EdgeNode {    //邻接边
    struct EdgeNode *next;    //指向邻接的下一条边
    int adjVex;    //该邻接边对应的数组下标
}EdgeNode;
typedef struct VexNode{    //邻接顶点
    int data;    //该结点的数据
    EdgeNode *firstEdge;    //指向该顶点第一条邻接边
}VexNode, AdjList[MAXVEX];
typedef struct Graph{    //邻接表
    AdjList adjList;    //申明一个VexNode类型长度为MAXVERTEXNUM的一维数组存储顶点
    int vexNum, edgeNum;    //该表的顶点数和弧数
}Graph;

9007c08ef6fa4dce97265ba5f3cec6f7.png

4.查找

4.1.顺序查找

408数据结构学习笔记——顺序查找、折半查找、分块查找_江南江南江南丶的博客-CSDN博客_顺序查找效率

从头到尾逐一对比元素

int Ssq_Search(int arr[], int key, int n){
    int i;
    for (i = 0; i < n && arr[i] != key; i++ ) {
        if (arr[i] == key ) return i;
    }
    return -1;
}

4.2.折半查找

1.算法思想:申明一个mid指针始终指向数组的正中心元素,判断该元素是否为key元素;若是则返回mid(该元素的数组下标);若不是则判断大小去左右子树查找

该查找方法要求以数组(支持随机访问),并且有序

int Binary_Search(int arr[], int n, int key) {
    int low = 0, high = n - 1, mid;    //初始化low和high指针
    while (low <= high) {    //当low > high 时结束循环
        mid = (low + high) / 2; //每轮循环将mid重置
        if (arr[mid] == key) return mid;    //mid和key相等,返回mid数组下标
        else if (arr[mid] < key) low = mid + 1;    //key比mid更大,则去右边
        else high = mid - 1;    //key比左子树更小,则去左边
    }
    return -1;    //循环内没有return则说明数组中没有该元素,返回-1
}

2.ASL:需要注意一点,查找失败的情况下仅需找到存在的最底层叶子结点,不需要找到空结点

3.时间空间复杂度(顺序查找和折半查找的时间复杂度对比)

4.3.分块查找

1.手算模拟过程

2.ASL

4.4.二叉搜索树和二叉排序树

408数据结构学习笔记——二叉排序树、二叉平衡树、红黑树_江南江南江南丶的博客-CSDN博客_二叉排序树和红黑树

1.算法思想:和折半查找类似

2.代码实现:

BiTNode* Search(BiTree T, int key) {
    BiTNode *p = T;
    while (p && p->value != key) {
        if (p->value > key) p = p->lchild;
        else p = p->rchild;
    }
    return p;
}

3.ASL

4.时间复杂度:计算方式与折半查找相同,特别注意查找失败情况下

4.5.散列表

408数据结构学习笔记——B树、B+树、散列表_江南江南江南丶的博客-CSDN博客

1.处理冲突的方法

①线性探测:注意散列因子求散列表长的方式计算散列表查找成功和查找不成功的平均查找长度(利用线性探测法处理冲突)_叫我蘑菇先生的博客-CSDN博客_线性探测法查找失败的平均查找长度

②拉链

2.ASL

①线性探测:注意查找失败时,只需计算散列函数的初始可能取值的个数,即mod 7 只计算开始的 0 - 6号散列表元素各自到第一个空元素的和(并非整个散列表)

②拉链:注意查找失败时,空指针不算一次查找次数

4.6.kmp算法

408数据结构学习笔记——串、朴素模式匹配、kmp算法及其改进_江南江南江南丶的博客-CSDN博客

1.next数组

2.next[j]的定义(next[1] = 0,next[2] = 1)

3.nextval(next[next[j]])

5.排序

1.记忆口诀:

马士兵说:30秒让你记住所有排序算法-宋词记忆法_哔哩哔哩_bilibili

选泡插,快归堆希统计基:选择,冒泡,插入;快速,归并,堆,希尔,桶,计数,基数

恩方恩老恩一三,对恩加K恩乘K:选择,冒泡,插入为O(n2);快速,归并,堆为O(nlogn);希尔为O(n1.3);桶和计数(不要求)为一对的O(n+K);基数为O(n * K)

不稳稳稳不稳稳,不稳不稳稳稳稳:分别按上面对应

2.

408数据结构学习笔记——直接插入排序、折半排序、希尔排序_江南江南江南丶的博客-CSDN博客

408数据结构学习笔记——简单选择排序、堆排序_江南江南江南丶的博客-CSDN博客

408数据结构学习笔记——冒泡排序、快速排序_江南江南江南丶的博客-CSDN博客

408数据结构学习笔记——归并排序、基数排序_江南江南江南丶的博客-CSDN博客

408数据结构学习笔记——外部排序_江南江南江南丶的博客-CSDN博客

3.对比次数、稳定性、时间/空间复杂度、手绘过程(希尔、堆、基数)

相关文章
|
4天前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
11 2
|
1天前
|
算法
【初阶数据结构篇】堆的应用(堆排序与Top-K问题)
即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。
|
1月前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景
|
2月前
|
机器学习/深度学习 存储 算法
PHP中的数据结构及其在机器学习中的应用
本文探讨了PHP在机器学习中的作用,强调了数据结构的重要性。文中列举了PHP中的常见数据结构,如数组、对象、字典、链表、树和图,并解释了它们在机器学习场景下的应用。例如,数组用于特征向量,对象封装模型,字典存储特征映射,链表和树实现特定算法。通过示例代码展示了如何使用这些数据结构进行特征标准化和模型预测。文章总结指出,PHP的数据结构为机器学习提供了有效工具,随着技术发展,PHP在数据处理领域的应用将持续扩展。
32 4
|
1月前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景
|
3月前
|
存储 缓存 监控
中间件应用合理使用缓存和数据结构
【5月更文挑战第4天】中间件应用合理使用缓存和数据结构
58 3
中间件应用合理使用缓存和数据结构
|
2月前
|
算法 程序员 数据处理
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
|
2月前
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
2月前
|
存储 算法
【数据结构和算法】---二叉树(2)--堆的实现和应用
【数据结构和算法】---二叉树(2)--堆的实现和应用
14 0