数据结构与算法
文章平均质量分 78
Luyeguang
学无止境!
展开
-
C++实现二叉树的层序遍历
#include <iostream>#include <queue>#include <functional>using namespace std;struct TreeNode { int value; TreeNode *left; TreeNode *right; TreeNode(int value, TreeNode *left, TreeNode *right) :value(value), left(lef原创 2021-11-07 13:55:53 · 695 阅读 · 0 评论 -
C++实现DFS以及BFS
#include <iostream>#include <vector>#include <queue>#include <functional>using namespace std;// 有向图class Graph {public: // 初始化 Graph(int size) :table(vector<vector<int>>(size)), size(size) { f原创 2021-11-07 13:31:44 · 954 阅读 · 0 评论 -
查找-散列表查找
散列表查找(哈希表)存储位置 = f(关键字)散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。我们把这种对应关系f称为散列函数,又称为哈希(Hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或者哈希表。散列技术既是一种存储方法也是一种查找方法。但是它主要是面向查找的存储结构。散列技术最适合求解问题是查找与给定值相等的记录。散列函数构造方法直接定址法:f(key) = a x原创 2020-08-25 14:09:49 · 886 阅读 · 0 评论 -
查找-二叉排序树
二叉排序树二叉排序树(Binary Search Tree)又称为二叉查找树。他或是一颗空树,或者是具有下列性质的二叉树。若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;它的左右子树也分别为二叉排序树。二叉排序树的查找操作#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0typedef int原创 2020-08-21 15:52:32 · 2026 阅读 · 0 评论 -
查找-线性索引查找
线性索引查找索引就是把一个关键字与它对应的记录相关联的过程,一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引按照结构可以分为线性索引、树形索引和多级索引。这里只探讨线性索引,即将索引项集合组织为线性结构,也称为索引表。其中又分为:稠密索引、分块索引和倒排索引。稠密索引稠密索引是指在线性索引中,将数据集中的每一个记录对应一个索引项。对于稠密索引这个索引表来说,索引项一定是按照关键码有序的排列。而如原创 2020-08-20 15:05:47 · 178 阅读 · 0 评论 -
查找-有序表查找
折半查找我们把每次取中间记录查找的方法叫做折半查找。又称为二分查找。他的前提是线性表中的记录必须是关键码(数据项)有序的(通常是从小到大有序)。线性表必须采用顺序存储。其时间复杂度为O[logn]其时间复杂度远远小于顺序查找,但是对于需要频繁执行插入或者删除操作的数据集来说,维护有序的排序会带来不少开销,不建议使用。int Binary_Search(int *a, int n, int key){ int low, high, mid; low = 1; high = n原创 2020-08-20 14:31:44 · 278 阅读 · 0 评论 -
图-关键路径算法
关键路径(CriticalPath)我们把路径上各个活动所持续时间之和称为路径长度,从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动叫做关键活动.。AOV网和AOE网算法用到的4个关键变量:**etv (Earliest time of vertex):**事件的最早发生时间,即顶点k的最早发生时间**ltv(Latest time of vertex):**事件最晚发生时间,即顶点k的最晚发生时间**ete(Earliest time of edge):**活动最早开工时间原创 2020-08-17 13:49:08 · 2241 阅读 · 1 评论 -
图-拓扑排序
拓扑排序我们会把施工过程、生产流程、软件开发、教学安排等都当成一个项目工程来对待,所有的工程都可分为若干个活动的子工程。由这而来的图首先一定是一个无环图。而之前学习的最短路径问题和最小生成树问题是关于有环图的。在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系。这样的有向图为顶点表示活动的网,我们成为AOV网(Activity On Vertex Network )。AOV网中的弧表示活动之间存在某种制约关系,比如在学习数据结构这门课之前必须先学习C语言等等。这个场景在我们生活中很常原创 2020-08-15 13:52:34 · 152 阅读 · 0 评论 -
图-最短路径之弗洛伊德算法
多源点最短路径-弗洛伊德算法(Floyd)求所有顶点到所有顶点的最短路径,而迪杰斯特拉是求单源点到所有顶点的最短路径。几个用到的变量和数组的含义:变量k:中转顶点坐标数组P:存放顶点之间的中转结点的数组,比如:P[1][4] = 2;//顶点1到顶点4途径顶点2P[2][4] = 3;//顶点2到顶点4又途径顶点3P[3][4] = 4;//顶点3到顶点4经过顶点4,即表明3->4之间无中转顶点了。从而得: 当P[v][k] == k的时候,即走到了路径的最后。原创 2020-08-14 14:19:48 · 157 阅读 · 0 评论 -
图-最短路径之迪杰斯特拉算法
最短路径在网图和非网图中,最短路径的含义是不同的。对于非网图,由于其边上没有权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径。而对于网图,最短路径,是指两顶点之间经过的边上权值之和最少的路径。和最小生成树的区别:最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。最短路径是从一点出发,到达目的地的路径最小。Prim 和 Dijkstra 代码非常相似,都是这样一个大体步骤:初始化,找最小值,更新权值数组。注意对比他们的代码。迪杰斯特拉算法(Dij原创 2020-08-13 14:24:38 · 230 阅读 · 0 评论 -
图-最小生成树之克鲁斯卡尔算法
克鲁斯卡尔算法(Kruskal)克鲁斯卡尔(Kruskal)算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止 [2] 。和普利姆算法以顶点去构建最小生成树不同的是,克鲁斯卡尔算法以边来构建最小生成树。克鲁斯原创 2020-08-12 15:56:49 · 581 阅读 · 0 评论 -
图-最小生成树之Prim算法
普利姆算法(Prim)1).输入:一个加权连通图,其中顶点集合为V,边集合为E;2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;3).重复下列操作,直到Vnew = V:a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;4).原创 2020-08-10 18:16:05 · 270 阅读 · 0 评论 -
图-深度优先搜索和广度优先搜索
深度优先搜索(Depth First Search, DFS)深度优先遍历图的方法是,从图中某顶点v出发:(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。可以看到这里面运用了递归的思想,下面给出了DFS算法基于邻接矩阵与邻接表的不同算法。对于基于邻接矩阵的算法,由于其是一个二维数组,要查找每个顶点的邻接点需要访问原创 2020-08-10 18:14:11 · 236 阅读 · 0 评论 -
图-邻接矩阵与邻接表
邻接矩阵邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn} [1] 。G的邻接矩阵是一个具有下列性质的n阶方阵:①对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。②在无向图中,任一顶点i的度为第i列(或第i行)所有非零元素的个数,在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个数。③用邻接矩阵法表示图共需要n^2原创 2020-08-10 08:12:11 · 1228 阅读 · 0 评论