2D Convex Hulls and Extreme Points( Convex Hull Algorithms) CGAL 4.13

Wesley13
• 阅读 751

1 Introduction

A subset S⊆R2 is convex if for any two points p and q in the set the line segment with endpoints p and q is contained in S. The convex hull of a set S is the smallest convex set containing S. The convex hull of a set of points P is a convex polygon with vertices in P. A point in P is an extreme point (with respect to P) if it is a vertex of the convex hull of P. A set of points is said to be strongly convex if it consists of only extreme points.

This chapter describes the functions provided in CGAL for producing convex hulls in two dimensions as well as functions for checking if sets of points are strongly convex are not. There are also a number of functions described for computing particular extreme points and subsequences of hull points, such as the lower and upper hull of a set of points.

 一个点集S⊆R2,如果对于点集中任意两个点 p 和 q ,以p 和q 为端点的线段被包在这个子集(构成的多边形)中,我们称S是凸的(convex )。一个点集S的凸包(convex hull )是包含S的最小凸集。一个点集P的凸包(convex hull )是一个以P中的点为顶点的多项式。如果P中一个点是其凸包(convex hull )中的一个顶点,则该点是一个P的极点(extreme point )。一个点集被称为强凸的(strongly convex )如果它只包含极点。

本章描述CGAL提供的在2维中生成凸包(convex hulls)的函数和用于检查点集是否强凸的(strongly convex )的函数。还有一些函数用于计算特定极点以及包(hull)生成之后的其他函数,如点集的下半包和上半包。

2D Convex Hulls and Extreme Points( Convex Hull Algorithms) CGAL 4.13

2 Convex Hull

CGAL provides implementations of several classical algorithms for computing the counterclockwise sequence of extreme points for a set of points in two dimensions (i.e., the counterclockwise sequence of points on the convex hull). The algorithms have different asymptotic running times and require slightly different sets of geometric primitives. Thus you may choose the algorithm that best fits your setting.

Each of the convex hull functions presents the same interface to the user. That is, the user provides a pair of iterators, first and beyond, an output iterator result, and a traits class traits. The points in the range [firstbeyond) define the input points whose convex hull is to be computed. The counterclockwise sequence of extreme points is written to the sequence starting at position result, and the past-the-end iterator for the resulting set of points is returned. The traits classes for the functions specify the types of the input points and the geometric primitives that are required by the algorithms. All functions provide an interface in which this class need not be specified and defaults to types and operations defined in the kernel in which the input point type is defined.

Given a sequence of n input points with h extreme points, the function [convex_hull_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23ga8241d43969ff61cb9be46811c2e9e176) uses either the output-sensitive O(nh) algorithm of Bykat [5] (a non-recursive version of the quickhull [4] algorithm) or the algorithm of Akl and Toussaint, which requires O(nlogn) time in the worst case. The algorithm chosen depends on the kind of iterator used to specify the input points. These two algorithms are also available via the functions [ch_bykat()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gac13b4efbc337c7a8d5ad418521edcd4f) and [ch_akl_toussaint()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23ga53e842c0b8490653535c00ab81bb0939), respectively. Also available are the O(nlogn) Graham-Andrew scan algorithm [3][9] ([ch_graham_andrew()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gaeccc6dda2f9d3096c94a7ff84cc91a85)), the O(nh) Jarvis march algorithm [8] ([ch_jarvis()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23ga99d0534bf096ae28a10b6844b21e7867)), and Eddy's O(nh)algorithm [6] ([ch_eddy()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gab9c9511b024795495dd6154ebf19c29c)), which corresponds to the two-dimensional version of the quickhull algorithm. The linear-time algorithm of Melkman for producing the convex hull of simple polygonal chains (or polygons) is available through the function [ch_melkman()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23ga3bba4c83b7ac3cb9183191ea78828a65).

CGAL提供了2d空间中的几种典型的算法来计算逆时针序的极点集(即凸包的逆时针序的点集)。各个算法有着不同的渐近线时间效率,需要稍有不同的几何元语集合。这样你可以选择最适合你的算法。

每个计算凸包的函数提供了相同的接口。用户提供一对 iterator , first和beyond,一个输出iterator result, 和一个traits类 traits。在范围[firstbeyond)的点用于定义输入的需要计算其凸饭点集。逆时针序的极点集被写入了始于result的序列中,且最后一个点的(past-the-end)iterator被 返回。traits 类用于确定输入点的数的类型和算法所要求的几何元语集合。所有的函数提供了一个接口,使用这个接口时这个类不需要指定,输入点的缺省类型(All functions provide an interface in which this class need not be specified and defaults to types and operations defined in the kernel in which the input point type is defined)。

给定n个输入点的序列,其中有h个极点,

(1)Bykat 算法(output-sensitive O(nh) algorithm of Bykat, 一种quickhull算法的非回归版本),

(2)Akl 和 Toussaint算法,它们最差的情况下需要O(nlogn)时间。算法的选择依赖于指定的输入点集。这两个算法也可以通过[ch_bykat()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gac13b4efbc337c7a8d5ad418521edcd4f) 和 [ch_akl_toussaint()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23ga53e842c0b8490653535c00ab81bb0939)函数分别得到。

(3)Graham-Andrew 扫描算法(Graham-Andrew scan algorithm , ([ch_graham_andrew()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gaeccc6dda2f9d3096c94a7ff84cc91a85)),)其算法时间为O(nlogn) 。

(4)Jarvis march算法(Jarvis march algorithm,  ([ch_jarvis()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23ga99d0534bf096ae28a10b6844b21e7867)), O(nh))

(5)Eddy'算法(Eddy's O(nh)algorithm,ch_eddy()),它对应于quickhull算法的2维版本。

(6)Melkman 算法提供线性时间,为简单多边形链计算凸包(函数ch_melkman()

3 Example using Graham-Andrew's Algorithm

In the following example a convex hull is constructed from point data read from standard input using Graham_Andrew algorithm. The resulting convex polygon is shown at the standard output console. The same results could be achieved by substituting the function [ch_graham_andrew()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gaeccc6dda2f9d3096c94a7ff84cc91a85) by other functions such as [ch_bykat()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Functions.html%23gac13b4efbc337c7a8d5ad418521edcd4f).

下面的例子使用标准输入点数据生成凸包,使用ch_graham_andrew()算法。其结果凸多边形输出到标准输出窗口。换函数ch_bykat()可得到相同结果。
File Convex_hull_2/ch_from_cin_to_cout.cpp

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

#include <CGAL/ch_graham_andrew.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef K::Point_2 Point_2;

int main()

{

CGAL::set_ascii_mode(std::cin);

CGAL::set_ascii_mode(std::cout);

std::istream_iterator< Point_2 > in_start( std::cin );

std::istream_iterator< Point_2 > in_end;

std::ostream_iterator< Point_2 > out( std::cout, "\n" );

CGAL::ch_graham_andrew( in_start, in_end, out );

return 0;

}

4 Extreme Points and Hull Subsequences

In addition to the functions for producing convex hulls, there are a number of functions for computing sets and sequences of points related to the convex hull.

The functions [lower_hull_points_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Subsequence.html%23gaf6e4baad67192f0cc3da273cda717297) and [upper_hull_points_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Subsequence.html%23ga1abc268fbd7b3edfc61af2efff6f3e93) provide the computation of the counterclockwise sequence of extreme points on the lower hull and upper hull, respectively. The algorithm used in these functions is Andrew's variant of Graham's scan algorithm [3][9], which has worst-case running time of O(nlogn).

There are also functions available for computing certain subsequences of the sequence of extreme points on the convex hull. The function [ch_jarvis_march()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Subsequence.html%23gae9e0919cb50981d1f31ac242a2c4ba9d) generates the counterclockwise ordered subsequence of extreme points between a given pair of points and [ch_graham_andrew_scan()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Subsequence.html%23gafa026d25f9fee686e7a58af0ff365f86) computes the sorted sequence of extreme points that are not left of the line defined by the first and last input points.

Finally, a set of functions ([ch_nswe_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23ga3dbd516d18c626d354734f534aa8f740)[ch_ns_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23ga119d3f2f171cdf2d07d3a643efade08f)[ch_we_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gadf9445fc0581869a195c27ca2685c3c6)[ch_n_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gab42b74243ff79e49f4574ddfdcdb4ed7)[ch_s_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gaab5a7ddae1354e025e003610d6e3cf10)[ch_w_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23ga9add6eb0d67dacb52918da2c73e88c0a)[ch_e_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gac07127d740ecc491b3dc0e797c9c3252)) is provided for computing extreme points of a 2D point set in the coordinate directions.

另外,还有一些函数用于与凸包相关的点集计算。

(1)[lower_hull_points_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Subsequence.html%23gaf6e4baad67192f0cc3da273cda717297) 和 [upper_hull_points_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Subsequence.html%23ga1abc268fbd7b3edfc61af2efff6f3e93)用于计算逆时针序的下半包和上半包。这个算法是Graham's scan algorithm的Andrew'变种,最差为O(nlogn);

(2)还有一些函数用于计算已经生成的凸包中的极点的子序列(subsequence )的函数。ch_jarvis_march()用于计算给定两点之间的逆时针序的极点的子序列,ch_graham_andrew_scan()用于生成一个逆时针排列的极点的子序列,这个子序列的所有极点均不在给定输入点的左侧。(computes the sorted sequence of extreme points that are not left of the line defined by the first and last input points.)

(3)最后,一个函数集用于计算给定坐标方向( coordinate directions)的极点集([ch_nswe_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23ga3dbd516d18c626d354734f534aa8f740)[ch_ns_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23ga119d3f2f171cdf2d07d3a643efade08f)[ch_we_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gadf9445fc0581869a195c27ca2685c3c6)[ch_n_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gab42b74243ff79e49f4574ddfdcdb4ed7)[ch_s_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gaab5a7ddae1354e025e003610d6e3cf10)[ch_w_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23ga9add6eb0d67dacb52918da2c73e88c0a)[ch_e_point()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Extreme.html%23gac07127d740ecc491b3dc0e797c9c3252)).

5 Traits Classes

Each of the functions used to compute convex hulls or extreme points is parameterized by a traits class, which specifies the types and geometric primitives to be used in the computation. There are several implementations of 2D traits classes provided in the library. The class [Convex_hull_traits_2](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2FclassCGAL_1_1Convex__hull__traits__2.html) corresponds to the default traits class that provides the types and predicates presented in the 2-dimensional CGAL kernel in which the input points lie. The class [Convex_hull_constructive_traits_2](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2FclassCGAL_1_1Convex__hull__constructive__traits__2.html) is a second traits class based on CGAL primitives but differs from [Convex_hull_traits_2](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2FclassCGAL_1_1Convex__hull__traits__2.html) in that some of its primitives reuse intermediate results to speed up computation.

In addition, the 2D and 3D Linear Geometric Kernel provides three projective traits classes ([Projection_traits_xy_3](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FKernel_23%2FclassCGAL_1_1Projection__traits__xy__3.html)[Projection_traits_xz_3](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FKernel_23%2FclassCGAL_1_1Projection__traits__xz__3.html), and [Projection_traits_yz_3](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FKernel_23%2FclassCGAL_1_1Projection__traits__yz__3.html)), which may be used to compute the convex hull of a set of three-dimensional points projected into each of the three coordinate planes.

每个计算凸包或极点的函数都被一个traits类参数化,这个traits指定了计算中使用的类型和几何元语。库中有几个2D traits类。

(1)[Convex_hull_traits_2](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2FclassCGAL_1_1Convex__hull__traits__2.html) 类对应于2D CGAL内核中缺省的traits 类,提供了类型和判定(The class [Convex_hull_traits_2](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2FclassCGAL_1_1Convex__hull__traits__2.html) corresponds to the default traits class that provides the types and predicates presented in the 2-dimensional CGAL kernel in which the input points lie. )。

(2)Convex_hull_constructive_traits_2类是第二个基于CGAL元语的traits类,与 [Convex_hull_traits_2](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2FclassCGAL_1_1Convex__hull__traits__2.html)不同的是,它的元语复用了中间结果来加速计算。

(3)另外, 2D 和3D Linear Geometric Kernel 提供了三个投射traits类(projective traits classes ),分别是[Projection_traits_xy_3](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FKernel_23%2FclassCGAL_1_1Projection__traits__xy__3.html)[Projection_traits_xz_3](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FKernel_23%2FclassCGAL_1_1Projection__traits__xz__3.html), 的[Projection_traits_yz_3](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FKernel_23%2FclassCGAL_1_1Projection__traits__yz__3.html),用于计算3维点投射到三个坐标平面的点集的凸包。

6 Convexity Checking

The functions [is_ccw_strongly_convex_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Convexity.html%23gaf212d4568dfb6a39831c5f4ea1257b65) and [is_cw_strongly_convex_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Convexity.html%23ga19dcfbe04c6933232236f27e4fecf592) check whether a given sequence of 2D points forms a (counter)clockwise strongly convex polygon. These are used in postcondition testing of the two-dimensional convex hull functions.

函数[is_ccw_strongly_convex_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Convexity.html%23gaf212d4568dfb6a39831c5f4ea1257b65) 和[is_cw_strongly_convex_2()](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdoc.cgal.org%2Flatest%2FConvex_hull_2%2Fgroup__PkgConvexHull2Convexity.html%23ga19dcfbe04c6933232236f27e4fecf592) 检查给定一个序列的2D点集是否形成一个(顺)逆时针的强凸多边形。这些函数用于对2维凸包函数的后置条件进行测试。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
sql 查询
高效SELECTq.ID\_ANSWER,q.ID\_QUESTION,q.CONTENT,q.UPVOTE\_TOTE,q.IS\_ADOPT,q.ID\_USER,q.OPPOSE\_TOTE,q.ANSWER\_TIME,q.ACT\_FLAG,q.SCORE,u.OFFICIAL\_EXPERT,qs.TITLE,qs.I
Wesley13 Wesley13
3年前
Java生成8位随机邀请码,不重复
publicstaticStringcharsnewString{"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s",
Wesley13 Wesley13
3年前
Java连接MySQL数据库——含步骤和代码
转自微博:http://www.cnblogs.com/centor/p/6142775.html工具:eclipse   MySQL5.6   MySQL连接驱动:mysqlconnectorjava5.1.27.jar(链接:https://pan.baidu.com/s/1MmFZ9Hve6rV0tlryM3raeA密码:q74
Wesley13 Wesley13
3年前
QQ玩一玩好友排行榜与世界排行榜
QQ玩一玩好友排行榜与世界排行榜1、开发环境CocosCreatorV2.0.5手Q版本V7.9.0.3820(目前市场中最新版本)qqPlayCore.jsbuildTime:'FriNov09201813:20:45GMT0800(GMT08:00)'上出现,
Stella981 Stella981
3年前
Android 从 Web 唤起 APP
前言!(http://7q5c2h.com1.z0.glb.clouddn.com/WebToAPP2.png?watermark/2/text/5ZC05bCP6b6Z5ZCM5a24/font/5qW35L2T/fontsize/500/fill/I0VGRUZFRg/dissolve/100/gravity/SouthEast/dx/
Wesley13 Wesley13
3年前
P1
通过本文,您的收获可能有:从课下部分,了解一些基本部件搭建时可能遇到的坑点,稍微深入一点理解两种状态机的区别;从课上测试部分,可以了解重点的考察内容,明白设计时状态机的类型在测试中的重要性。课下测试部分:课下测试主要考察了splitter的实现,ALU的实现,格雷码计数器的实现,扩位器的实现,以及合法表达式判别的有限状态机问题。本次课下部分比
Stella981 Stella981
3年前
Dubbo爆出严重漏洞!可导致网站被控制、数据泄露!附解决方案
http://dy.163.com/v2/article/detail/F5FPIFRU0511Q1AF.html  !(http://dingyue.ws.126.net/2020/0216/125ec4c4p00q5rcrs0019d200ig009qg00ig009q.png)  来源:华为云  原文地址:https://w