iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#图表算法之有向图
  • 829
分享到

C#图表算法之有向图

2024-04-02 19:04:59 829人浏览 薄情痞子
摘要

目录1.术语2.有向图的数据类型有向图表示有向图取反顶点的符号名3.有向图的可达性4.环和有向无环图调度问题有向图中的环顶点的深度优先次序与拓扑排序拓扑排序5.有向图中的强连通性强连

在有向图中,边是单向的:每条边连接的两个顶点都是一个有序对,它们的邻接性是单向的。许多应用都是天然的有向图,如下图。为实现添加这种单向性的限制很容易也很自然,看起来没什么坏处。但实际上这种组合性的结构对算法有深刻的影响,使得有向图和无向图的处理大有不同。

1.术语

虽然我们为有向图的定义和无向图几乎相同(将使用的部分算法和代码也是),但为了说明边的方向性而产生的细小文字差异所代表的结构特性是重点。

定义:一幅有方向性的图(或有向图)是由一组顶点和一组有方向的边组成的,每条有方向的边都连着有序的一对顶点。

我们称一条有向边由第一个顶点指出并指向第二个顶点。在一幅有向图中,一个顶点的出度为由该顶点指出的边的总数;一个顶点的入度为指向该顶点的边的总数。一条有向边的第一个顶点称为它的头,第二个顶点则称为它的尾。用 v->w 表示有向图中一条由v 指向 w 的边。一幅有向图的两个顶点的关系可能有四种:没有边相连;v->w; w-> v;v->w 和 w->v。

在一幅有向图中,有向路径由一系列顶点组成,对于其中的每个顶点都存在一条有向边从它指向序列中的下一个顶点。有向环为一条至少含有一条边且起点和终点相同的有向路径。路径或环的长度即为其中所包含的边数。

当存在从 v 到 w 的有向路径时,称顶点 w 能够由顶点 v 达到。我们需要理解有向图中的可达性和无向图中的连通性的区别。

2.有向图的数据类型

有向图API

有向图表示

我们使用邻接表来表示有向图,其中边 v -> w 表示顶点 v 所对应的邻接链表中包含一个 w 顶点。这种表示方法和无向图几乎相同而且更明晰,因为每条边都只会出现一次。

有向图取反

Digraph 的 API 中还添加了一个 Reverse 方法。它返回该有向图的一个副本,但将其中所有边的方向反转。在处理有向图时这个方法有时很有用,因为这样用例就可以找出“指向”每个顶点的所有边,而 Adj 方法给出的是由每个顶点指出的边所连接的所有顶点。

顶点的符号名

在有向图中,使用符号名作为顶点也很简单,参考SymbolGraph。

namespace Digraphs
{
    public class Digraph
    {
        private int v;
        private int e;
        private List<int>[] adj;

        public Digraph(int V)
        {
            this.v = V;
            this.e = 0;
            adj = new List<int>[v];
            for (var i = 0; i < v; i++)
            {
                adj[i] = new List<int>();
            }
        }

        public int V()
        {
            return v;
        }

        public int E()
        {
            return e;
        }

        public List<int> Adj(int v)
        {
            return adj[v];
        }

        public void AddEdge(int v, int w)
        {
            adj[v].Add(w);
            e++;
        }

        public Digraph Reverse()
        {
            Digraph R = new Digraph(v);
            for (var i = 0; i < v; i++)
                foreach (var w in Adj(i))
                    R.AddEdge(w,i);

            return R;
        }
    }
}

3.有向图的可达性

在无向图中介绍的深度优先搜索DepthFirstSearch ,解决了单点连通性的问题,使得用例可以判定其他顶点和给定的起点是否连通。使用完全相同的代码,将其中的 Graph 替换成 Digraph 也可以解决有向图中的单点可达性问题(给定一幅有向图和一个起点 s ,是否存在一条从 s 到达给定顶点 v 的有向路径?)。

在添加了一个接受多个顶点的构造函数之后,这份 API 使得用例能够解决一个更加一般的问题 -- 多点可达性 (给定一幅有向图和顶点的集合,是否存在一条从集合中的任意顶点到达给定顶点 v 的有向路径?)

下面的DirectedDFS 算法使用了解决图处理的标准范例和标准的深度优先搜索来解决。对每个起点调用递归方法 Dfs ,以标记遇到的任意顶点。

namespace Digraphs
{
    public class DirectedDFS
    {
        private bool[] marked;

        public DirectedDFS(Digraph G, int s)
        {
            marked = new bool[G.V()];
            Dfs(G,s);
        }

        public DirectedDFS(Digraph G, IEnumerable<int> sources)
        {
            marked = new bool[G.V()];
            foreach (var s in sources)
            {
                if (!marked[s])
                    Dfs(G,s);
            }
        }

        private void Dfs(Digraph G, int V)
        {
            marked[V] = true;
            foreach (var w in G.Adj(V))
            {
                if (!marked[w])
                    Dfs(G,w);
            }
        }

        public bool Marked(int v)
        {
            return marked[v];
        }
    }
}

在有向图中,深度优先搜索标记由一个集合的顶点可达的所有顶点所需的时间与被标记的所有顶点的出度之和成正比。

有向图的寻路

在无向图中的寻找路径的算法,只需将 Graph 替换为 Digraph 就能够解决下面问题:

  • 1.单点有向路径:给定一幅有向图和一个起点 s ,从 s 到给定目的顶点是否存在一条有向路径?如果有,找出这条路径。
  • 2.单点最短有向路径:给定一幅有向图和一个起点 s ,从 s 到给定目的顶点 v 是否存在一条有向路径?如果有,找出其中最短的那条(所含边数最少)。

4.环和有向无环图

在和有向图相关的实际应用中,有向环特别的重要。没有计算机的帮助,在一幅普通的有向图中找出有向环可能会很困难。从原则上来说,一幅有向图可能含有大量的环;在实际应用中,我们一般只重点关注其中一小部分,或者只想知道它们是否存在。

调度问题

一种应用广泛的模型是给定一组任务并安排它们的执行顺序,限制条件是这些任务的执行方法和开始时间。限制条件还可能包括任务的耗时以及消耗的资源。最重要的一种限制条件叫做优先级限制,它指明了哪些任务必须在哪些任务之前完成。不同类型的限制条件会产生不同类型不同难度的调度问题。

下面以一个正在安排课程的大学生为例,有些课程是其他课程的先导课程:

如果假设该学生一次只能修一门课程,就会遇到优先级下的调度问题:给定一组需要完成的任务,以及一组关于任务完成的先后次序的优先级限制。在满足限制条件的前提下应该如何安排并完成所有任务?

对于任意一个这样的问题,我们先画出一幅有向图,其中顶点对应任务,有向边对应优先级顺序。为了简化问题,我们以整数为顶点:

在有向图中,优先级限制下的调度问题等价于一个基本问题--拓扑排序:给定一幅图,将所有顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素(或者说明无法做到这一点)。

如图,所有的边都是向下的,所以清晰地表示了这幅有向图模型所代表的有优先级限制的调度问题的一个解决方法:按照这个顺序,该同学可以满足先导课程限制的条件下修完所有课程。

有向图中的环

如果任务 x 必须在任务 y 之前完成,而任务 y 必须在任务 z 之前完成,但任务 z 又必须在任务 x 之前完成,那肯定是有人搞错了,因为这三个限制条件是不可能被同时满足的。一般来说,如果一个优先级限制的问题中存在有向环,那么这个问题肯定是无解的。要检查这种错误,需要解决 有向环检测:给定的有向图中包含有向环吗?如果有,按照路径的方向从某个顶点并返回自己来找到环上的所有顶点。

一幅有向图中含有环的数量可能是图的大小的指数级别,因此我们只需找到一个环即可,而不是所有环。在任务调度和其他许多实际问题中不允许出现有向环,因此有向无环图就变得很特殊。

基于深度优先搜索可以解决有向环检测的问题,因为由系统维护的递归调用的栈表示的正是“当前”正在遍历的有向路径。一旦我们找到了一条有向边 v -> w 且 w 已经存在于栈中,就找到了一个环,因为栈表示的是一条由 w 到 v 的有向路径,而 v -> w 正好补全了这个环。如果没有找到这样的边,就意味着这副有向图是无环的。DirectedCycle 基于这个思想实现的:

namespace Digraphs
{
    public class DirectedCycle
    {
        private bool[] marked;
        private int[] edgeTo;
        private Stack<int> cycle;//有向环中的所有顶点(如果存在)
        private bool[] onStack;//递归调用的栈上的所有顶点

        public DirectedCycle(Digraph G)
        {
            onStack = new bool[G.V()];
            edgeTo = new int[G.V()];
            marked = new bool[G.V()];

            for (int v = 0; v < G.V(); v++)
            {
                if (!marked[v])
                    Dfs(G,v);
            }
        }

        private void Dfs(Digraph G, int v)
        {
            onStack[v] = true;
            marked[v] = true;
            foreach (var w in G.Adj(v))
            {
                if (hasCycle())
                    return;
                else if (!marked[w])
                {
                    edgeTo[w] = v;
                    Dfs(G, w);
                }
                else if (onStack[w])
                {
                    cycle = new Stack<int>();
                    for (int x = v; x != w; x = edgeTo[x])
                        cycle.Push(x);
                    cycle.Push(w);
                    cycle.Push(v);
                }
            }
            onStack[v] = false;
        }

        private bool hasCycle()
        {
            return cycle != null;
        }

        public IEnumerable<int> Cycle()
        {
            return cycle;
        }
    }
}

该类为标准的的递归 Dfs 方法添加了一个布尔类型的数组 onStack 来保存递归调用期间栈上的所有顶点。当它找到一条边 v -> w 且 w 在栈中时,它就找到了一个有向环。环上的所有顶点可以通过 edgeTo 中的链接得到。

在执行 Dfs 时,查找的是一条由起点到 v 的有向路径。要保存这条路径,DirectedCycle 维护了一个由顶点索引的数组onStack,以标记递归调用的栈上的所有顶点(在调用 Dfs 时将 onStack[ v ] 设为 true,在调用结束时将其设为 false)。DirectedCycle 同时也使用了一个edgeTo 数组,在找到有向环时返回环中的所有顶点。

顶点的深度优先次序与拓扑排序

优先级限制下的调度问题等价于计算有向无环图中的所有顶点的拓扑排序:

下面算法的基本思想是深度优先搜索正好只会访问每个顶点一次。如果将 Dfs 的参数顶点保存在一个数据结构中,遍历这个数据结构实际上就能访问图中的所有顶点,遍历的顺序取决于这个数据结构的性质以及是在递归调用之前还是之后进行保存。在典型的应用中,顶点一下三种排列顺序:

  • 前序:在递归调用之前将顶点加入队列;
  • 后序:在递归调用之后将顶点加入队列;
  • 逆后序:在递归调用之后将顶点压入栈。

该类允许用例用各种顺序遍历深度优先搜索经过得顶点。这在高级得有向图处理算法非常有用,因为搜索得递归性使得我们能够证明这段计算得许多性质。

namespace Digraphs
{
    public class DepthFirstOrder
    {
        private bool[] marked;
        private Queue<int> pre;//所有顶点的前序排列
        private Queue<int> post;//所有顶点的后序排列
        private Stack<int> reversePost;//所有顶点的逆后序排列

        public DepthFirstOrder(Digraph G)
        {
            marked = new bool[G.V()];
            pre = new Queue<int>();
            post = new Queue<int>();
            reversePost = new Stack<int>();

            for (var v = 0; v < G.V(); v++)
            {
                if (!marked[v])
                    Dfs(G,v);
            }
        }

        private void Dfs(Digraph G, int v)
        {
            pre.Enqueue(v);

            marked[v] = true;
            foreach (var w in G.Adj(v))
            {
                if (!marked[w])
                    Dfs(G,w);
            }

            post.Enqueue(v);
            reversePost.Push(v);
        }

        public IEnumerable<int> Pre()
        {
            return pre;
        }

        public IEnumerable<int> Post()
        {
            return post;
        }

        public IEnumerable<int> ReversePost()
        {
            return reversePost;
        }
    }
}

一幅有向无环图得拓扑排序即为所有顶点的逆后序排列。

拓扑排序

namespace Digraphs
{
    public class Topological
    {
        private IEnumerable<int> order;
        public Topological(Digraph G)
        {
            DirectedCycle cycleFinder = new DirectedCycle(G);
            if (cycleFinder.HasCycle())
            {
                DepthFirstOrder dfs = new DepthFirstOrder(G);
                order = dfs.ReversePost();
            }
        }

        public IEnumerable<int> Order()
        {
            return order;
        }

        public bool IsDAG()
        {
            return order != null;
        }
    }
}

这段使用DirectedCycle 检测是否有环,使用DepthFirstOrder 返回有向图的逆后序。

使用深度优先搜索对有向无环图进行拓扑排序所需的时间和 V+E 成正比。第一遍深度优先搜索保证了不存在有向环,第二遍深度优先搜索产生了顶点的逆后序排列。

在实际应用中,拓扑排序和有向环的检测总是一起出现,因为有向环的检测是排序的前提。例如,在一个任务调度应用中,无论计划如何安排,其背后的有向图中包含的环意味着存在一个必须被纠正的严重错误。因此,解决任务调度类应用通常需要一下3步:

  • 1.指明任务和优先级条件;
  • 2.不断检测并去除有向图中的所有环,以确保存在可行方案;
  • 3.使用拓扑排序解决调度问题。

类似地,调度方案的任何变动之后都需要再次检查是否存在环,然后再计算新的调度安排。

5.有向图中的强连通性

如果两个顶点 v 和 w 是相互可达的,则称它们为强连通的。也就是说,即存在一条从 v 到 w 的有向路径,也存在一条从 w 到 v 的有向路径。如果一幅有向图中的任意两个顶点都是强连通的,则称这副有向图也是强连通的。

下面是强连通图的例子,可以看到,环在强连通性的理解上起着重要的作用。

强连通分量

和无向图中的连通性一样,有向图中的强连通性也是一种顶点之间的等价关系:

  • 自反性:任意顶点 v 和自己都是强连通的。
  • 对称性:如果 v 和 w 是强连通的,那么 w 和 v 也是。
  • 传递性:如果 v 和 w 是强连通的且 w 和 x 也是强连通的,那么 v 和 x 也是强连通的。

作为一种等价关系,强连通性将所有顶点分为了一些等价类,每个等价类都是由相互均为强连通的顶点的最大子集组成。我们称这些子集为强连通分量。如下图,一个含有 V 个顶点的有向图含有 1~ V个强连通分量——一个强连通图只含有一个强连通分量,而一个有向无环图则含有 V 个强连通分量。需要注意的是强连通分量的定义是基于顶点的,而不是边。有些边连接的两个顶点都在同一个强连通分量中,而有些边连接的两个顶点则不在同一强连通分量中。

强连通分量API

设计一种平方级别的算法来计算强连通分量并不困难,单对于处理实际应用中的大型图来说,平方级别的时间和空间需求是不可接受的。

Kosaraju算法

在有向图中如何高效地计算强连通分量?我们只需修改无向图连通分量的算法 CC,KosarajuCC 算法如下,它将会完成一下任务:

1.在给定的一幅有向图 G 中,使用 DepthFirstOrder 来计算它的反向图 GR 的逆后序排列;

2.在 G 中进行标准的深度优先搜索,但是要按照刚才计算得到的顺序而非标准的顺序来访问所有未被标记的顶点;

3.在构造函数中,所有在同一个递归 Dfs() 调用中被访问到的顶点都在同一个强连通分量中,将它们按照和 CC 相同的方式识别出来。

namespace Digraphs
{
    public class KosarajuCC
    {
        private bool[] marked;//已访问的顶点
        private int[] id;//强连通分量的标识符
        private int count;//强连通分量的数量

        public KosarajuCC(Digraph G)
        {
            marked = new bool[G.V()];
            id = new int[G.V()];
            DepthFirstOrder order = new DepthFirstOrder(G.Reverse());
            foreach (var s in order.ReversePost())
            {
                if (!marked[s])
                {
                    Dfs(G,s);
                    count++;
                }
            }
        }

        private void Dfs(Digraph G, int v)
        {
            marked[v] = true;
            id[v] = count;
            foreach (var w in G.Adj(v))
            {
                if (!marked[w])
                    Dfs(G,w);
            }
        }

        public bool StronglyConnected(int v, int w)
        {
            return id[v] == id[w];
        }

        public int Id(int v)
        {
            return id[v];
        }

        public int Count()
        {
            return count;
        }
    }
}

Kosaraju 算法的预处理所需的时间和空间与 V+E 成正比且支持常数时间的有向图强连通性的查询。

再谈可达性

在无向图中如果两个顶点 V 和 W 是连通的,那么就既存在一条从 v 到 w 的路径也存在一条从 w 到 v 的路径。在有向图中如果两个顶点 v 和 w 是强连通的,那么就既存在一条从 v 到 w 的路径也存在另一条从 w 到 v 的路径。但对于一对非强连通的顶点,也许存在一条从 v 到 w 的路径,也许存在一条从 w 到 v 的路径,也许两条都不存在,但不可能两条都存在。

顶点对的可达性:对于无向图,等价于连通性问题;对于有向图,它和强连通性有很大区别。 CC 实现需要线性级别的预处理时间才能支持常数时间的操作。在有向图的相应实现中能否达到这样的性能?

有向图 G 的传递闭包是由相同的一组顶点组成的另一幅有向图,在传递闭包中存在一条从 v 指向 w 的边当且仅当在 G 中 w 是从 v 可达的。

根据约定,每个顶点对于自己都是可达的,因此传递闭包会含有 V 个自环。上图只有 22 条有向边,但它的传递闭包含有可能的 169 条有向边中的 102 条。一般来说,一幅有向图的传递闭包中所含的边都比原图中多得多。例如,含有 V 个顶点和 V 条边的有向环的传递闭包是一幅含有 V 的平方条边的有向完全图。因为传递闭包一般都是稠密的,我们通常都将它们表示为一个布尔值矩阵,其中 v 行 w 列的值为 true 当且仅当 w 是从 v 可达的。与其计算一幅有向图的传递闭包,不如使用深度优先搜索来实现如下API:

下面的算法使用DirectedDFS 实现:

namespace Digraphs
{
    public class TransitiveClosure
    {
        private DirectedDFS[] all;

        public TransitiveClosure(Digraph G)
        {
            all = new DirectedDFS[G.V()];
            for (var v = 0; v < G.V(); v++)
                all[v] = new DirectedDFS(G,v);
        }

        public bool Reachable(int v, int w)
        {
            return all[v].Marked(w);
        }
    }
}

该算法无论对于稀疏图还是稠密图,都是理想解决方案,但对于大型有向图不适用,因为构造函数所需的空间和 V 的平方成正比,所需的时间和 V(V+ E) 成正比。

总结

到此这篇关于C#图表算法之有向图的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#图表算法之有向图

本文链接: https://www.lsjlt.com/news/147204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#图表算法之有向图
    目录1.术语2.有向图的数据类型有向图表示有向图取反顶点的符号名3.有向图的可达性4.环和有向无环图调度问题有向图中的环顶点的深度优先次序与拓扑排序拓扑排序5.有向图中的强连通性强连...
    99+
    2024-04-02
  • C#图表算法之无向图
    目录1.相关术语2.表示无向图的数据结构3.图的处理算法的设计模式4.深度优先搜索5.寻找路径实现6.广度优先搜索实现7.连通分量实现union-find 算法8.符号图实...
    99+
    2024-04-02
  • C#图表算法之有向图实例分析
    这篇文章主要介绍“C#图表算法之有向图实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#图表算法之有向图实例分析”文章能帮助大家解决问题。在有向图中,边是单向的:每条边连接的两个顶点都是一个...
    99+
    2023-06-30
  • C#图表算法之最短路径
    目录1.最短路径的性质最短路径2.加权有向图的数据结构加权有向图边的API加权有向图的API最短路径的API最短路径的数据结构边的松弛顶点的松弛3.最短路径算法的理论基础最优性条件验...
    99+
    2024-04-02
  • C#图表算法之最小生成树
    目录1.原理1.切分定理2.贪心算法2.加权无向图的数据类型3.最小生成树 API4.Prim 算法数据结构维护横切边的集合实现性能5. Prim 算法的即时实现6.Kruskal ...
    99+
    2024-04-02
  • C#图表算法之最短路径怎么实现
    本篇内容主要讲解“C#图表算法之最短路径怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#图表算法之最短路径怎么实现”吧!从一个顶点到达另一个顶点的成本最小的路径。我们采用一个一般性的模...
    99+
    2023-06-30
  • C++图论之Bellman-Ford算法和SPFA算法的实现
    目录Bellman-Ford算法例题:AcWing 853. 有边数限制的最短路算法步骤代码实现SPFA算法代码实现给定一张有向图,若对于图中的某一条边(x,y,z),有dist[y...
    99+
    2024-04-02
  • C语言算法学习之双向链表详解
    目录一、练习题目二、算法思路1、设计浏览器历史记录2、扁平化多级双向链表3、展平多级双向链表4、二叉搜索树与双向链表一、练习题目 题目链接难度1472. 设计浏览器历史记录★★★☆☆...
    99+
    2024-04-02
  • C#算法之散列表
    目录1.散列函数正整数浮点数字符串组合键将 HashCode() 的返回值转化为一个数组索引自定义的 HashCode软缓存2.基于拉链法的散列表散列表的大小删除操作有序性相关的操作...
    99+
    2024-04-02
  • Java数据结构之双向链表图解
    双向链表(Doubly linked list) 什么是双向链表? 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的...
    99+
    2024-04-02
  • 有哪些图形算法
    本篇内容介绍了“有哪些图形算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是图一个图由一组有限的顶点...
    99+
    2024-04-02
  • Python图像处理之图像增广算法详解
    目录前言图像增广算法a.图像旋转b.图像亮度调整c.图像裁剪及拼接本章小结前言 图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起,大规模数据集的需求变得更加迫切,...
    99+
    2023-05-20
    Python图像增广算法 Python图像处理 Python 算法
  • 详解C++图搜索算法之双端队列广搜
    目录广度优先遍历双端队列BFS例题:AcWing 175. 电路维修解题思路AC代码广度优先遍历 广度优先遍历是一种按照层次顺序进行访问的方法,它具有以下两种重要性质: 在访问完所有...
    99+
    2024-04-02
  • C++图形编程算法精解
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • 带你了解Java数据结构和算法之无权无向图
    目录1、图的定义①、邻接:②、路径:③、连通图和非连通图:④、有向图和无向图:⑤、有权图和无权图:2、在程序中表示图①、顶点:②、边:3、搜索①、深度优先搜索(DFS)②、广度优先搜...
    99+
    2024-04-02
  • C语言数据结构与算法之图的遍历(一)
    目录引入 深度优先搜索代码实现 完整代码  引入  在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆...
    99+
    2024-04-02
  • C语言数据结构与算法之图的遍历(二)
    目录前言 广度优先搜索过程主要思想 代码实现  前言  在上一章的内容中我们使用了深度优先搜索来进行遍历,这一章我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:...
    99+
    2024-04-02
  • OpenCV图像分割之分水岭算法与图像金字塔算法详解
    目录前言一、使用分水岭算法分割图像1、cv2.distanceTransform()函数2、cv2.connectedComponents()函数3、cv2.watershed()函...
    99+
    2024-04-02
  • C++实现PatchMatch图像修复算法
    PatchMatch算法出自Barnes的论文 PatchMatch: A Randomized Correspondence Algorithm for Structural I...
    99+
    2024-04-02
  • jmeter图形图表有哪些
    这篇文章主要讲解了“jmeter图形图表有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jmeter图形图表有哪些”吧!1 前言图表图形类分析元件2 Jmeter结果分析之各种...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作