数据结构C++
新时代&农民
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【数据结构基础C++】索引堆-Index Heap
为什么要引入索引堆在堆排序中,比如最小堆,我们从最后一个非叶子结点开始(上图示例中索引 8/2 = 4)一直到索引1,经过不断的调整(shiftDown),使得最小值调整到堆顶。在这个调整的过程中,进行了元素的交换。若这个元素是较为复杂的结构的话,会产生较大性能的消耗;还有一个问题就是,成最小堆之后,原来的data[1] = 92 将变成最小值 30,若我们想改变原来data[1] = 92 的值,就很难找到92在成堆之后的位置,元素位置发生改变,只能重新遍历数组。由此引出索引堆来解决这个问题。voi.原创 2021-12-27 22:08:17 · 826 阅读 · 0 评论 -
【数据结构基础C++】图论10-单源最短路径(Dijkstra’s shortest path algorithm)
过程假设上图中的顶点代表各个城市,每条边的权值代表城市间的路程长度。0->5 表示可以从城市 0 直达城市 5,路程长度 10;0->2->3->5 代表可以经过城市 2,3 到达城市 5,路程长度 7。你想要找到从城市0到城市5的最短路程,或者从城市0到其余各个城市的最短路程。这就是单源最短路径问题:给定带权图G和源点v,求从v到图G中其余各顶点的最短路径。如何求得这些路径?迪杰斯特拉(Dijkstra)提出了一个按路径长度递增的次序产生最短路径算法。(条件:所有边的权值为原创 2021-12-25 23:30:30 · 1709 阅读 · 0 评论 -
【数据结构基础C++】图论09-基于克鲁斯卡尔算法的最小生成树(Kruskal)
基本思想假设要在V个城市之间建立通信网络,则连通n个城市只需要V-1条线路。如何在最节省经费的前提下建立通信网络?可以用连通图表示V个城市以及V个城市间可能设置的通信线路,其中顶点表示城市,边表示城市之间的线路,边的权值表示相应的代价。现在要选择这样一棵树,使得总的代价最小,这就是最小生成树的问题。克鲁斯卡尔算法的思想是,每次从边集中选出最小的边,若这条边加入后不会形成环,则这条边属于最小生成的边。-1. 对连通无向图中的所有带权边进行排序(可以使用最小堆(最小堆))2.选出最小权值的边,检查是原创 2021-12-24 18:51:03 · 862 阅读 · 0 评论 -
【数据结构基础C++】并查集(Disjoint Set or Union-Find))
并查集应用1-用于检测无向图中是否有环并查集是一种树形的数据结构,用于处理一些不相交集合的合并(Union)及查询问题(Find)。Find: 确定特定元素在哪个子集中。这可用于确定两个元素是否在同一子集中。Union: 将两个子集连接成一个子集。首先检查这两个子集是否属于同一集合,如果不是,就不能执行联合。并查集算法可以用来检查一个给定无向图是否包含环。假设顶点不带自环。可以用一个1维数组进行跟踪。父亲数组 parent[ ]考虑如下图:对于每条边,使用边的两个顶点创建子集。 如果两个顶原创 2021-12-23 16:26:37 · 1217 阅读 · 0 评论 -
【数据结构基础C++】图论08-Prim 算法实现最小生成树
1.最小生成树Minimum Span Tree在一个含有n个顶点,m条边,带权无向连通图中,存在一个含有n个顶点,n-1条边,且权值总和最小的一棵树;1.1 存在个数最小生成树可能有多个,当有相同权值的边时,可以选择其中一条边。当图中每一条边的权值都相同,该图的左右生成树都是最小生成树;唯一性:当图中的每一条边的权值都不相同时,最小生成树是唯一的。1.2 切分定理 Cut Property在图中找到n-1条边,连接n个顶点,总权值最小;【切分】:把图中的结点分为两部分;【横切边】:如果一原创 2021-12-20 23:16:38 · 1419 阅读 · 1 评论 -
【数据结构C++基础】最小堆,min-heap
实现:最小堆:用二叉树构造,堆顶为最小元素用数组存储数据;从索引 0 开始存储;对于任意给定的 i 结点:如果该结点有左孩子,左孩子的结点所在的索引为 [2i];如果该结点有右孩子,右孩子的结点所在的索引为 [2i+1];该结点的父亲结点所在的索引为 [i/2]当树构造好之后,从索引 1 开始,将结点与左右孩子比较,若该结点比左右孩子都小,不用交换;继续下一个索引的结点;若当前结点比左右孩子其中一个大,与较小的交换;shifDown(int k) { while (2 * k原创 2021-12-17 01:58:58 · 2882 阅读 · 0 评论 -
【数据结构基础C++】图论07-构造带权图
用一个Edge类描述顶点与边#pragma once#include <iostream>#include <cassert>using namespace std;template<typename Weight>class Edge {private: int a, b; Weight weight;public: Edge(int a, int b, Weight weight) { this->a = a; this-原创 2021-12-11 18:50:53 · 817 阅读 · 0 评论 -
【数据结构基础C++】图论应用-用四种颜色对地图上的国家涂色
思想存储:国家之间只有相邻和不相邻两种关系。把国家看作顶点,用边表示两个国家相邻。考虑到每个国家都要考虑相邻关系,用邻接矩阵存储。四种色号编号为1,2,3,4;国家序号用 0…n 表示;用色号循环方式,给国家涂色。在涂色前,先判断与当前国家相邻的国家的涂色情况:若与之相邻的国家的色号与当前国家色号相同,则用下一个色号涂色;核心函数:graphColor(int k);isSafe(int k,int color); 掌握这两个函数就可以了!以这几个省份为例:抽象成顶点与边的关系:代原创 2021-12-10 23:54:15 · 2844 阅读 · 0 评论 -
【数据结构基础C++】图论06-广度优先,无权图的最短路径
写一个最短路径的类,利用广度优先遍历算法记录无权图的最短路径代码#pragma once#include <iostream>#include <vector>#include <queue>#include <cassert>#include <stack>using namespace std;template<typename Graph>class shortestPath {private: G原创 2021-12-09 23:07:34 · 466 阅读 · 0 评论 -
【数据结构基础C++】图论05-利用深度优先算法查询路径
单独写一个路径的类,传入图和顶点,记录路径代码#pragma once#include <vector>#include <cassert>#include <iostream>#include <stack>using namespace std;template<typename Graph>class Path {private: Graph& G; bool* visited; int s;原创 2021-12-09 14:56:27 · 667 阅读 · 0 评论 -
【数据结构基础C++】图论04-深度优先遍历,图的连通分量个数
单独写一个连通分量的类代码#pragma once#include <iostream>using namespace std;template <typename Graph>class component {private: Graph& G; bool* visited; int ccount; int* connected; //将深度优先遍历写在私有里 void dfs(int v) { visited[v] = true原创 2021-12-08 22:58:15 · 717 阅读 · 0 评论 -
【数据结构基础 C++】图论03-以存储顶点和边的文件构造图
将边的信息放在txt中,以文件形式构造图,单独封装成一个类#pragma once#include <iostream>#include <fstream>#include <cassert>#include <string>#include <sstream>using namespace std;template<typename Graph>class readGraph {public: //从文件f原创 2021-12-08 21:37:04 · 422 阅读 · 0 评论 -
【数据结构基础C++】图论02-添加迭代器
在上一次的头文件中再添加一个类-迭代器,可用作后面测试用例稠密图迭代器代码class adjIterator { private: DenseGraph& G; int index; int v; public: //构造函数 adjIterator(DenseGraph& g, int v):G(g) { assert(v >= 0 && v < G.n); this->v = v; this->in原创 2021-12-07 21:05:15 · 820 阅读 · 0 评论 -
【数据结构基础C++】图论01
稠密图用邻接矩阵表示顶点之间的关系(是否有边)。有向图和无向图的区别:无向图顶点 v 到 w,w 到 v 都要在矩阵中标注,但是边数只加 1 次!写一个函数判断两个顶点之间是否有边,避免重复记录边数。用 vector<vector> 表示二维数组。//头文件#pragma once#include <iostream>#include <vector>#include <cassert>using namespace std;c原创 2021-12-04 23:31:25 · 560 阅读 · 0 评论
分享