《决策树算法》PPT课件.ppt

上传人:小飞机 文档编号:5469276 上传时间:2023-07-10 格式:PPT 页数:66 大小:566.50KB
返回 下载 相关 举报
《决策树算法》PPT课件.ppt_第1页
第1页 / 共66页
《决策树算法》PPT课件.ppt_第2页
第2页 / 共66页
《决策树算法》PPT课件.ppt_第3页
第3页 / 共66页
《决策树算法》PPT课件.ppt_第4页
第4页 / 共66页
《决策树算法》PPT课件.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《《决策树算法》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《决策树算法》PPT课件.ppt(66页珍藏版)》请在三一办公上搜索。

1、第9章决策树算法,1,第9章 决策树算法,第9章决策树算法,2,本章大纲:,决策树算法原理常用决策树算法决策树剪枝由决策树提取分类规则应用实例分析,第9章决策树算法,3,9.1 决策树算法原理,优点:使用者不需要了解很多背景知识,只要训练事例能用属性结论的方式表达出来,就能用该算法学习;决策树模型效率高,对训练集数据量较大的情况较为适合;分类模型是树状结构,简单直观,可将到达每个叶结点的路径转换为IFTHEN形式的规则,易于理解;决策树方法具有较高的分类精确度。,第9章决策树算法,4,9.1 决策树算法原理,传统的数据分类操作通常有以下两个步骤:模型训练阶段:根据给定的训练集,找到合适的映射函

2、数H:C的表示模型。使用上一步训练完成的函数模型预测数据的类别,或利用该函数模型,对数据集中的每一类数据进行描述,形成分类规则。,第9章决策树算法,5,9.1 决策树算法原理,工作过程:,决策树分类模型的工作过程图,第9章决策树算法,6,9.1 决策树算法原理,定义 9.1 给定一个训练数据集D,其中每个实例,称为例子,训练数据集中包含以下属性A=。同时给定类别集合C。对于训练数据集D,决策树是指具有以下性质的树:每个内部节点都被标记一个属性Ai。每个弧都被标记一个值,这个值对应于相应父结点的属性。每个叶节点都被标记一个类Cj。,第9章决策树算法,7,9.1 决策树算法原理,定义9.2 分裂准

3、则 定义为在决策树算法中将训练数据集D中的元组划分为个体类的最好的方法与策略,它告诉我们在节点N上测试哪个属性合适,如何选择测试与测试的方法,从节点N上应该生长出哪些分支。定义9.3 分裂属性Xi定义为决策树中每个内部节点都对应的一个用于分裂数据集的属性。Xi A=,第9章决策树算法,8,9.1 决策树算法原理,定义9.4 如果Xi是连续属性,那么分裂准则的形式为Xi,其中,就称为节点n的分裂点。定义9.5 如果Xi是离散属性,那么的形式为,其中,就称为节点n的分裂子集。注意:分裂准则与分裂属性、分裂点、分裂子集并不等同,它们是四个不同的概念,并且分裂子集分裂点分裂属性分裂准则,第9章决策树算

4、法,9,9.1 决策树算法原理,将上面的定义结合实际的决策树例子可得决策树图如下图9-1,图9-2,图9-3所示,图中设X为分裂属性,是属性X的已知值。,图9-2 按照分裂点划分而成的决策树图与相关的具体例子图,第9章决策树算法,10,9.1 决策树算法原理,图9-3 按照分裂子集划分而成的决策树图与相关的两个具体例子图,第9章决策树算法,11,9.1 决策树算法原理,图9-4 按照分裂子集划分而成的决策树(只能是二叉树)图与相关的具体例子图,第9章决策树算法,12,9.1 决策树算法原理,目前主要使用如下几个量化评估标准(1)预测准确性(2)模型强健性(3)描述的简洁性(4)计算复杂性(5)

5、处理规模性,第9章决策树算法,13,9.2 常用决策树算法,ID3算法 ID3是Quinlan于1986年提出的,是机器学习中一种广为人知的一个算法,它的提出开创了决策树算法的先河,而且是国际上最早最有影响的决策树方法,在该算法中,引入了信息论中熵的概念,利用分割前后的熵来计算信息增益,作为判别能力的度量。,第9章决策树算法,14,9.2.1 ID3算法,定义9.6 信息熵 自信息量只能反映符号的不确定性,而信息熵可以用来度量整个信源X整体的不确定性。设某事物具有n种相互独立的可能结果(或称状态):,每一种结果出现的概率分别为 且有:(9.1)那么,该事物所具有的不确定量为:(9.2),第9章

6、决策树算法,15,9.2.1 ID3算法,上式即为著名的香农信息量公式。注意到式中的对数以2为底,当n=2时且时,熵=1比特。由此可见,一个等概率的二选一事件具有1比特的不确定性。所以,可以把一个等概率的二选一事件所具有信息量定为信息量的单位。任何一个事件能够分解成n个可能的二选一事件,它的信息量就是n比特。,第9章决策树算法,16,9.2.1 ID3算法,Quinlan的首创性工作主要是在决策树的学习算法中第一次引入了信息论中的互信息(称之为信息增益),以之作为属性选择的标准,并且将建树的方法嵌入在其中,其核心是在决策树的各级节点上选择属性,用信息增益作为属性选择标准,第9章决策树算法,17

7、,9.2.1 ID3算法,下面给出的是ID3算法中将香农的信息熵定义应用到决策树构造中,进而给出的信息增益的定义。,设训练数据集D=,是n维有穷向量空间,其中,是有穷离散符号集,D中的每个元素,,叫做例子,其中,设PD和ND是D的两个子集,分别叫做正例集和反例集。,第9章决策树算法,18,9.2.1 ID3算法,假设训练数据集D中的正例集PD和反例集ND的大小分别为p和n,则ID3基于下面两个假设给出该决策树算法中信息增益的定义,因为信息是用二进制编码的,所以在下面的公式定义中都用以2为底的对数。(1)在训练数据集D上的一棵正确决策树对任意例子的分类概率同D中正反例的概率一致;(2)一棵决策树

8、能对一个例子做出正确类别判断所需的信息量如下公式所示:,第9章决策树算法,19,9.2.1 ID3算法,如果以属性A作为决策树的根,A具有v个值,它将A分为v个子集,假设中含有p个正例和n个反例,那么子集所需的信息期望是,那么,以属性A为根所需的信息期望如下公式所示:,因此,以A为根的信息增益如下公式所示:,第9章决策树算法,20,9.2.1 ID3算法,上面给出的ID3中的信息论的相关定义主要是在两类分类问题的前提下,下面给出将其扩展到多类后的相关定义描述。设训练数据集D一共有m类样例,每类样例数为:。同样以属性A作为决策树的根,具有v个值,它将D分为v个子集,假设子集中任意元组属于类C的概

9、率 用表示,并用 估计。那么,该子集的信息量定义如下所示:,那么以A为根分类后所需的信息期望如下面公式所示:,第9章决策树算法,21,9.2.2 C4.5算法,(1)分裂(2)连续数据(3)缺失数据(4)规则,第9章决策树算法,22,9.2.2.1 C4.5的分裂属性选择度量,ID系列的算法为什么会产生归纳偏置呢?归纳偏置是一系列前提,这些前提与训练数据一起演绎论证未来实例分类。如果给定一个训练数据集,那么通常有很多决策树与这些样例一致。所以,要描述ID系列算法的归纳偏置,应找到它从所有一致假设中选择一个的根据。,第9章决策树算法,23,9.2.2.1 C4.5的分裂属性选择度量,ID系列的搜

10、索策略为:(1)优先选择较短的树而不是较长的;(2)选择那些信息增益高的属性离根节点较近的树。结论:ID系列算法的归纳偏置是因为它在选的时候较短的树比较长的树优先所产生的,也就是那些信息增益高的属性更靠近的根节点将会有优先生成树的特权。,第9章决策树算法,24,9.2.2.1 C4.5的分裂属性选择度量,为了避免这个偏置,弥补ID系列算法的不足就要舍弃信息增益这个度量而选择别的决策属性作为度量标准。Quinlan在他1986年中的论文中提出了一种可以使用的度量标准:增益比率。增益比率通过加入一个被称为分裂信息(split information)的项来惩罚类似Date这样的属性,分裂信息用来衡

11、量属性分裂数据的广度和均匀性,它由如下公式所示:,第9章决策树算法,25,9.2.2.1 C4.5的分裂属性选择度量,增益比率的公式如下所示:,第9章决策树算法,26,9.2.2.2 C4.5对连续数据的处理,ID3算法最初的定义是假设属性值是离散值,但在实际环境中,有很多属性是连续的,不能够用一个确定的标准来对其进行划分。C4.5使用下面的一系列处理过程来对连续的属性划分成离散的属性,进而达到能够建立决策树的目的。,第9章决策树算法,27,9.2.2.2 C4.5对连续数据的处理,Step1 根据训练数据集D中各个属性的值对该训练数据集进行排序;Step2 利用其中各属性的值对该训练数据集动

12、态地进行划分;Step3 在划分后的得到的不同的结果集中确定一个阈值,该阈值将训练数据集数据划分为两个部分;Step4 针对这两边各部分的值分别计算它们的增益或增益比率,以保证选择的划分使得增益最大。,第9章决策树算法,28,9.2.2.3 C4.5对缺失数据的处理,为了评估属性A是否是决策节点n的最佳测试属性,要计算决策树在该节点的信息增益Gain(D,A)。假定是S中的一个训练样例,并且其属性A的通过值分得的信息值表示为.,第9章决策树算法,29,9.2.2.4 C4.5对生成规则的利用,只要生成了决策树后,就可以把树转换成一个IF-THEN规则的集合。当然,每种算法生成的决策树都可以转换

13、成相应的if-then规则,C4.5算法处理规则与其他算法不同在于它把规则存储在一个二维数组中,每一行都代表着树中的一个规则,即从树根到叶子之间的一个路径.,第9章决策树算法,30,9.2.3 CART算法,CART(Classification and Regression Trees)算法是由几位统计学家L.Breiman,J.Friedman,R.Olshen和C.Stone在发表的刊物分类与回归树中提出的一种产生二叉决策树分类模型的技术。它与前面Quinlan提出的ID系列算法和C4.5不同的是,使用的属性度量标准是Gini指标,它和后面将要介绍的算法的共同点也是在于都是利用了相同的属

14、性度量标准Gini指标。,第9章决策树算法,31,9.2.3 CART算法,Gini指标主要是度量数据划分或训练数据集D的不纯度为主,系数值的属性作为测试属性,Gini值越小,表明样本的“纯净度”越高。Gini指标定义为如下公式:,第9章决策树算法,32,9.2.3 CART算法,由于二叉树不易产生数据碎片,精确度往往也会高于多叉树,所以在CART算法中,统计学家们采用了二元划分,在分支节点上进行Gini值的测试,如果满足一定纯度则划分到左子树,否则划分到右子树,最终生成一棵二叉决策树。在只有二元分裂的时候,对于训练数据集D中的属性A将D分成的D1和D2,则给定划分D的Gini指标如下公式所示

15、:,第9章决策树算法,33,9.2.3 CART算法,对于离散值属性,在算法中递归的选择该属性产生最小Gini指标的子集作为它的分裂子集。对于连续值属性,必须考虑所有可能的分裂点。其策略类似于上面ID3中介绍的信息增益处理方法,可以用如下公式所示:,第9章决策树算法,34,9.2.3 CART算法,CART算法在满足下列条件之一,即视为叶节点不再进行分支操作。(1)所有叶节点的样本数为1、样本数小于某个给定的最小值或者样本都属于同一类的时候;(2)决策树的高度达到用户设置的阈值,或者分支后的叶节点中的样本属性都属于同一个类的时候;(3)当训练数据集中不再有属性向量作为分支选择的时候。,第9章决

16、策树算法,35,9.2.4 PUBLIC算法,前面几个小节的决策树算法都是先建树再剪枝。PUBLIC(Pruning and Building Integrated in Classification)算法8,17将建树、剪枝结合到一步完成,即是预剪枝,在建树阶段不生成会被剪枝的子树,从而大大提高了效率。PUBLIC算法的建树是基于SPRINT方法、对其决策树的剪枝使用的是基于最小编码代价的MDL算法,但MDL原则不能直接应用。,第9章决策树算法,36,9.2.5 SLIQ算法,SLIQ(Supervised Learning In Quest)算法利用3种数据结构来构造树,分别是属性表、类表

17、和类直方图。SLIQ算法在建树阶段,对连续属性采取预排序技术与广度优先相结合的策略生成树,对离散属性采取快速的求子集算法确定划分条件。具体步骤如下:Step1 建立类表和各个属性表,并且进行预排序,即对每个连续属性的属性表进行独立排序,以避免在每个节点上都要给连续属性值重利用新排序;Step 2 如果每个叶节点中的样本都能归为一类,则算法停止;否则转(3);Step 3利用属性表寻找拥有最小Gini值的划分作为最佳划分方案。,第9章决策树算法,37,9.2.5 SLIQ算法,Step4 根据第3步得到的最佳方案划分节点,判断为真的样本划归为左孩子节点,否则划归为右孩子节点。这样,(3)(4)步

18、就构成了广度优先的生成树策略。Step 5 更新类表中的第二项,使之指向样本划分后所在的叶节点。Step 6 转到步骤(2)。,第9章决策树算法,38,9.2.6 SPRINT算法,SPRINT算法是对SLIQ算法的改进,其目的有两个:一是为了能够更好的并行建立决策树,二是为了使得决策树T适合更大的数据集。SPRINT(Scalable Parallelizable Induction of Classification Tree)算法是一种可扩展的、可并行的归纳决策树,它完全不受内存限制,运行速度快,且允许多个处理器协同创建一个决策树模型。,第9章决策树算法,39,9.2.6 SPRINT算

19、法,SPRINT算法定义了两种数据结构,分别是属性表和直方图。属性表由一组三元组组成,它随节点的扩张而划分,并附属于相应的子节点。与SLIQ算法不同,SPRINT算法采取传统的深度优先生成树策略,具体步骤如下:Step1 生成根节点,并为所有属性建立属性表,同时预排序连续属性的属性表。Step2 如果节点中的样本可归为一类,则算法停止;否则转(3)。Step3 利用属性表寻找拥有最小Gini值的划分作为最佳划分方案。算法依次扫描该节点上的每张属性表。Step4 根据划分方案,生成该节点的两个子节点,。Step5 划分该节点上的各属性表,使之关联到或上。,第9章决策树算法,40,9.2.6 SP

20、RINT算法,Step6 分别转到步骤(2)考察,节点。SPRINT算法在剪枝阶段进行基于MDL的剪枝,至此构成了SPRINT算法的串行化算法。将串行化算法稍加改进,就成为并行化算法:将训练数据集平均分布到n个处理器上,而后每个处理器生成自己的数据分片。由于连续属性值要求全局排序,因此要将n个处理器上的连续属性的属性表综合重新排序,再平均分布到n个处理器上。在建立Hash表之前,需要从n个处理器上收集所有的样本号信息。,第9章决策树算法,41,9.3决策树剪枝,在现实世界中,获得的数据并不可能保证其完美性与完整性,所以,在当被用来创建决策树的训练数据集中存在有噪声,或者数量太少以至于不能产生目

21、标函数的有代表性的采样的时候,我们使用决策树算法生成的决策树很多分支反映的是训练数据集中的异常。在上面任意一种情况发生的时候,利用简单算法产生的树会出现过拟合训练样例的现象。,第9章决策树算法,42,9.3决策树剪枝,在利用决策树算法进行分类的过程中,有两个过程,在9.1节中有介绍,第一个过程我们必须要利用训练数据来进行决策树分类模型的建立,另一个过程则是将建立好的决策树分类模型对给定的测试数据进行分类。,第9章决策树算法,43,9.3.1预剪枝,预剪枝也称为先剪枝,在该方法中主要是通过提前停止树的构造(例如,通过确定在给定的节点不再分裂或划分训练元组的子集)来对决策树进行剪枝。一旦停止以后,

22、剩下的那个节点就成为了树叶。该树叶可能持有子集元组中最频繁的类或这些元组的概率分布。,第9章决策树算法,44,9.3.1预剪枝,预剪枝判断停止决策树的生长的方法大体上可以归纳为以下几种:(1)一种最为简单的方法就是在决策树到达一定高度的情况下就停止树的生长;(2)到达此结点的实例具有相同的特征向量,而不必一定属于同一类,也可停止生长。这种情况可以处理数据中的数据冲突问题;(3)到达此结点的实例个数小于某一个阈值也可停止树的生长;(4)更为普遍的做法是计算每次扩张对系统性能的增益,如果这个增益值小于某个阈值则不进行扩展。如果在最好情况下的扩展增益都小于阈值,即使有些叶子结点的实例不属于同一类,也

23、停止树的增长。,第9章决策树算法,45,9.3.2后剪枝,后剪枝算法已经得到了广泛的应用,这个算法最初是由Breiman等提出,它首先构造完整的决策树,允许决策树过度拟合训练数据,然后对那些置信度不够的结点的子树用叶子结点来替代,这个叶子结点所应标记的类别为子树中大多数实例所属的类别。,第9章决策树算法,46,悲观错误剪枝PEP(Pessimistic Error Pruning),REP方法进行剪枝具有以下优点:(1)运用REP方法得到的决策树是关于测试数据集的具有最高精度的子树,并且是规模最小的树。(2)它的计算复杂性是线性的,这是因为决策树中的每个非叶子结点只需要访问一次就可以评估其子树

24、被修剪的概率。(3)由于使用独立的测试数据集,和原始决策树相比,修剪后的决策树对未来新事例的预测偏差较小。,第9章决策树算法,47,悲观错误剪枝PEP(Pessimistic Error Pruning),正是由于REP方法出现的一系列问题,随后Quinlan提出了可以在一定程度弥补上面缺陷的PEP方法,也就是悲观剪枝方法。该方法引入了统计学上连续修正的概念来弥补这一个缺陷,在评价子树的训练错误的公式中添加了一个常数,假定每个叶节点都自动对实例的某部分进行错误的分类。,第9章决策树算法,48,悲观错误剪枝PEP(Pessimistic Error Pruning),所用来剪枝的度量的基本思想可

25、以概述为以下几点:(1)假设训练数据集生成原始树为T,某一叶子结点的实例个数为,其中错误分类的个数为;(2)我们定义训练数据集的误差率如下公式9.13所示:(9.13)由于训练数据集既用来生成决策树又用来修剪树,所以是有偏倚的,利用它来修剪的决策树树并不是最精确,最好的;(3)为此,Quinlan在误差估计度量中增加了连续性校正,将误差率的公式修改为如下公式9.14所示:(9.14),第9章决策树算法,49,悲观错误剪枝PEP(Pessimistic Error Pruning),那么,同样的,我们假设s为树T的子树的其中一个子节点,则该子树的叶子结点的个数为,的分类误差率如下公式所示:,在定

26、量的分析中,为简单起见,我们用误差总数取代上面误差率的表示,即有公式:,那么,对于子树,,它的分类误差总数如下公式所示:,第9章决策树算法,50,最小错误剪枝MEP(Minimum Error Pruning),MEP方法是由Niblett和Bratko首先提出来的,它在一个相对独立的数据集上从树的叶子结点开始,向上搜索一个单一的树来使分类误差的期望概率达到最小,但它并不需要一个额外的修剪数据集。使用的信息来自于训练数据集,其目的是在未知的数据集上产生最小预测分类错误率。,第9章决策树算法,51,代价复杂度剪枝CCP(Cost-Complexity Pruning),CCP方法就是著名的CAR

27、T(Classification and Regression Trees)剪枝算法,它包含两个步骤:(1)自底向上,通过对原始决策树中的修剪得到一系列的树,其中是由中的一个或多个子树被替换所得到的,为未经任何修剪的原始树,为只有一个结点的树。(2)评价这些树,根据真实误差率来选择一个最优秀的树作为最后被剪枝的树。,第9章决策树算法,52,基于错误剪枝EBP(Error-Based Pruning),EBP剪枝法是一种应用于C4.5算法的自下向上的剪枝法,被认为是PEP剪枝法的改进,因为EBP剪枝基于对训练数据集的更加悲观的估计。同PEP剪枝,EBP仅利用训练数据集来构建和剪枝决策树。假设可将

28、叶结点覆盖的实例看作统计样本,叶结点对实例的分类错误率遵循二项式分布,并利用置信因子CF控制剪枝的程度。我们将CF定义为如下公式所示:,第9章决策树算法,53,9.4由决策树提取分类规则,决策树分类方法有它的优点,但是也有一定的局限性,比如,利用算法生成的决策树的规模会因为训练数据集的巨大而变得过大使得难以理解,可读性差。如果直接从决策树中提取出IFTHEN规则,建立基于规则的分类器,与决策树分类器相比,IFTHEN规则可能更容易理解,特别是当决策树分支非常大时也一样。,第9章决策树算法,54,9.5 应用实例分析,下面我们利用上面表9-1根据天气是否打网球的训练数据集,利用ID3算法来判断某

29、天是否适合打网球。(1)类别属性信息熵的计算由于未分区前,训练数据集中共有14个实例,其中有9个实例属于p类(适合打网球的),5个实例属于n类(不适合打网球),因此分区前类别属性的熵为:,第9章决策树算法,55,9.5 应用实例分析,(2)非类别属性信息熵的计算若选择Outlook为测试属性。0.694bit,第9章决策树算法,56,9.5 应用实例分析,因此,这种划分的信息增益是:同理,可以求出 其它三个属性的信息增益为,。由上可知,属性值Outlook在各个属性中具有最高的增益,被选作分裂属性。则第一个根节点T被用标记,并对于每个属性值生长一个分支:(3)递归地创建决策树的树枝和叶子选择作

30、为测试属性后,将训练实例集分为三个子集,生成三个子节点,对每个子节点递归采用上述过程进行分类直至每个节点都成为叶节点而已。,第9章决策树算法,57,9.5 应用实例分析,属性值Outlook在各个属性中具有最高的增益,被选作分裂属性。则第一个根节点T被用标记,并对于每个属性值生长一个分支:,根据信息增益结果生成的以Outlook为根节点的初级决策树图,第9章决策树算法,58,9.5 应用实例分析,A分析图中的sunny分支,计算其子属性的信息增益值来决定子分裂属性形成子分支之一。针对sunny中的子训练数据集分支,有两个类别,该分支中有3个实例属于n类,有2个实例属于p类,因此针对分支的信息熵

31、为:若以:sunny分支中的属性Temperature为测试属性,则测试属性Temperature的信息量为:,第9章决策树算法,59,9.5 应用实例分析,其信息增益为:若以:sunny分支中的属性Humidity为测试属性,则测试属性Humidity的信息量为:0.00bit 其信息增益为:若以:sunny分支中的属性Wind为测试属性,则测试属性windy的信息量为:0.468bit其信息增益为:0.9710.468=0.493bit,0.971-0.00=0.971bit,第9章决策树算法,60,9.5 应用实例分析,这时生成的决策树如图所示:,决策树构造图2,第9章决策树算法,61,

32、9.5 应用实例分析,B分析图9-8中的:rain分支,计算其子属性的信息增益值来确定子分裂属性形成子分支之三。针对:rain中的子训练数据集分支,有两个类别,该分支中有3个实例属于n类,有2个实例属于p类,因此针对分支的信息熵为:若以:rain分支中的属性Temperature为测试属性,则测试属性Temperature的信息量为:其信息增益值为:0.9710.2850.696bit,0.285bit,第9章决策树算法,62,9.5 应用实例分析,若以:rain分支中的属性Humidity为测试属性,则测试属性Humidity的信息量为:0.951bit 其信息增益值为:0.971-0.95

33、0=0.020bit若以:rain分支中的属性Windy为测试属性,则测试属性windy的信息量为:0.951bit 其信息增益值为:,=0.971-0.951=0.020bit,第9章决策树算法,63,9.5 应用实例分析,根据步骤B所求得的信息增益值,属性Temperature的信息增益值最大,故子分支三可以分得两个分支,决策树构造图3如图所示:,决策树构造图3,第9章决策树算法,64,9.5 应用实例分析,C.分析图中的:rain下的分裂属性Temperature的两个子分支,其中t3:cool时,分支都属于反例n,故可以直接作为一个叶子节点no;另一个t1:mild时,若假设Humidity为测试属性,则分支t1总的信息熵和测试属性Humidity信息量分别为:,0.918bit,0.666bit,则其信息增益为:,0.9180.666=0.252bit,第9章决策树算法,65,9.5 应用实例分析,若假设Windy为测试属性,则测试属性windy的信息量为:,0.666bit,其信息增益为:,0.918-0.666=0.251bit.,由上分析可得Humidity和windy的信息增益是相同的,又因为在t1分支的元组中,p元组的比例比n元组的大,所以,最终得到的决策树图如图所示:,第9章决策树算法,66,Any Question?Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号