clique算法
❶ 分类和聚类的区别及各自的常见算法
1、分类和聚类的区别:
Classification (分类),对于一个classifier,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行“学习”,从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做supervised learning (监督学习),
Clustering (聚类),简单地说就是把相似的东西分到一组,聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到一起。因此,一个聚类算法通常只需要知道如何计算相似度就可以开始工作了,因此 clustering 通常并不需要使用训练数据进行学习,这在Machine Learning中被称作unsupervised learning (无监督学习).
2、常见的分类与聚类算法
所谓分类,简单来说,就是根据文本的特征或属性,划分到已有的类别中。如在自然语言处理NLP中,我们经常提到的文本分类便就是一个分类问题,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:决策树分类法,朴素贝叶斯分类算法(native Bayesian classifier)、基于支持向量机(SVM)的分类器,神经网络法,k-最近邻法(k-nearestneighbor,kNN),模糊分类法等等。
分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应。但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法。
而K均值(K-mensclustering)聚类则是最典型的聚类算法(当然,除此之外,还有很多诸如属于划分法K中心点(K-MEDOIDS)算法、CLARANS算法;属于层次法的BIRCH算法、CURE算法、CHAMELEON算法等;基于密度的方法:DBSCAN算法、OPTICS算法、DENCLUE算法等;基于网格的方法:STING算法、CLIQUE算法、WAVE-CLUSTER算法;基于模型的方法)。
❷ 用于数据挖掘的聚类算法有哪些,各有何优势
聚类方法的分类,主要分为层次化聚类算法,划分式聚类算法,基于密度的聚类算法,基于网格的聚类算法,基于模型的聚类算法等。
而衡量聚类算法优劣的标准主要是这几个方面:处理大的数据集的能力;处理任意形状,包括有间隙的嵌套的数据的能力;算法处理的结果与数据输入的顺序是否相关,也就是说算法是否独立于数据输入顺序;处理数据噪声的能力;是否需要预先知道聚类个数,是否需要用户给出领域知识;算法处理有很多属性数据的能力,也就是对数据维数是否敏感。
.聚类算法主要有两种算法,一种是自下而上法(bottom-up),一种是自上而下法(top-down)。这两种路径本质上各有优势,主要看实际应用的时候要根据数据适用于哪一种,Hierarchical methods中比较新的算法有BIRCH主要是在数据体量很大的时候使用;ROCK优势在于异常数据抗干扰性强……
关于数据挖掘的相关学习,推荐CDA数据师的相关课程,课程以项目调动学员数据挖掘实用能力的场景式教学为主,在讲师设计的业务场景下由讲师不断提出业务问题,再由学员循序渐进思考并操作解决问题的过程中,帮助学员掌握真正过硬的解决业务问题的数据挖掘能力。这种教学方式能够引发学员的独立思考及主观能动性,学员掌握的技能知识可以快速转化为自身能够灵活应用的技能,在面对不同场景时能够自由发挥。点击预约免费试听课。
❸ 聚类算法有哪些分类
聚类算法的分类有:
1、划分法
划分法(partitioning methods),给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K小于N。而且这K个分组满足下列条件:
(1) 每一个分组至少包含一个数据纪录;
(2)每一个数据纪录属于且仅属于一个分组(注意:这个要求在某些模糊聚类算法中可以放宽);
2、层次法
层次法(hierarchical methods),这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。具体又可分为“自底向上”和“自顶向下”两种方案。
例如,在“自底向上”方案中,初始时每一个数据纪录都组成一个单独的组,在接下来的迭代中,它把那些相互邻近的组合并成一个组,直到所有的记录组成一个分组或者某个条件满足为止。
3、密度算法
基于密度的方法(density-based methods),基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。
4、图论聚类法
图论聚类方法解决的第一步是建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边(或弧)对应于最小处理单元数据之间的相似性度量。因此,每一个最小处理单元数据之间都会有一个度量表达,这就确保了数据的局部特性比较易于处理。图论聚类法是以样本数据的局域连接特征作为聚类的主要信息源,因而其主要优点是易于处理局部数据的特性。
5、网格算法
基于网格的方法(grid-based methods),这种方法首先将数据空间划分成为有限个单元(cell)的网格结构,所有的处理都是以单个的单元为对象的。这么处理的一个突出的优点就是处理速度很快,通常这是与目标数据库中记录的个数无关的,它只与把数据空间分为多少个单元有关。
代表算法有:STING算法、CLIQUE算法、WAVE-CLUSTER算法;
6、模型算法
基于模型的方法(model-based methods),基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。这样一个模型可能是数据点在空间中的密度分布函数或者其它。它的一个潜在的假定就是:目标数据集是由一系列的概率分布所决定的。
通常有两种尝试方向:统计的方案和神经网络的方案。
(3)clique算法扩展阅读:
聚类算法的要求:
1、可伸缩性
许多聚类算法在小于 200 个数据对象的小数据集合上工作得很好;但是,一个大规模数据库可能包含几百万个对象,在这样的大数据集合样本上进行聚类可能会导致有偏的结果。
我们需要具有高度可伸缩性的聚类算法。
2、不同属性
许多算法被设计用来聚类数值类型的数据。但是,应用可能要求聚类其他类型的数据,如二元类型(binary),分类/标称类型(categorical/nominal),序数型(ordinal)数据,或者这些数据类型的混合。
3、任意形状
许多聚类算法基于欧几里得或者曼哈顿距离度量来决定聚类。基于这样的距离度量的算法趋向于发现具有相近尺度和密度的球状簇。但是,一个簇可能是任意形状的。提出能发现任意形状簇的算法是很重要的。
4、领域最小化
许多聚类算法在聚类分析中要求用户输入一定的参数,例如希望产生的簇的数目。聚类结果对于输入参数十分敏感。参数通常很难确定,特别是对于包含高维对象的数据集来说。这样不仅加重了用户的负担,也使得聚类的质量难以控制。
5、处理“噪声”
绝大多数现实中的数据库都包含了孤立点,缺失,或者错误的数据。一些聚类算法对于这样的数据敏感,可能导致低质量的聚类结果。
6、记录顺序
一些聚类算法对于输入数据的顺序是敏感的。例如,同一个数据集合,当以不同的顺序交给同一个算法时,可能生成差别很大的聚类结果。开发对数据输入顺序不敏感的算法具有重要的意义。
❹ 聚类算法选方形窗口计算空间信息有依据吗
聚类方法有两个显着的局限:首先,要聚类结果要明确就需分离度很好(well-separated)的数据。几乎所有现存的算法都是从互相区别的不重叠的类数据中产生同样的聚类。但是,如果类是扩散且互相渗透,那么每种算法的的结果将有点不同。结果,每种算法界定的边界不清,每种聚类算法得到各自的最适结果,每个数据部分将产生单一的信息。为解释因不同算法使同样数据产生不同结果,必须注意判断不同的方式。对遗传学家来说,正确解释来自任一算法的聚类内容的实际结果是困难的(特别是边界)。最终,将需要经验可信度通过序列比较来指导聚类解释。
第二个局限由线性相关产生。上述的所有聚类方法分析的仅是简单的一对一的关系。因为只是成对的线性比较,大大减少发现表达类型关系的计算量,但忽视了生物系统多因素和非线性的特点。
从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。传统的统计聚类分析方法包括系统聚类法、分解法、加入法、动态聚类法、有序样品聚类、有重叠聚类和模糊聚类等。采用k-均值、k-中心点等算法的聚类分析工具已被加入到许多着名的统计分析软件包中,如SPSS、SAS等。
从机器学习的角度讲,簇相当于隐藏模式。聚类是搜索簇的无监督学习过程。与分类不同,无监督学习不依赖预先定义的类或带类标记的训练实例,需要由聚类学习算法自动确定标记,而分类学习的实例或数据对象有类别标记。聚类是观察式学习,而不是示例式的学习。
从实际应用的角度看,聚类分析是数据挖掘的主要任务之一。就数据挖掘功能而言,聚类能够作为一个独立的工具获得数据的分布状况,观察每一簇数据的特征,集中对特定的聚簇集合作进一步地分析。
聚类分析还可以作为其他数据挖掘任务(如分类、关联规则)的预处理步骤。
数据挖掘领域主要研究面向大型数据库、数据仓库的高效实用的聚类分析算法。
聚类分析是数据挖掘中的一个很活跃的研究领域,并提出了许多聚类算法。
这些算法可以被分为划分方法、层次方法、基于密度方法、基于网格方法和
基于模型方法。
1 划分方法(PAM:PArtitioning method) 首先创建k个划分,k为要创建的划分个数;然后利用一个循环
定位技术通过将对象从一个划分移到另一个划分来帮助改善划分质量。典型的划分方法包括:
k-means,k-medoids,CLARA(Clustering LARge Application),
CLARANS(Clustering Large Application based upon RANdomized Search).
FCM
2 层次方法(hierarchical method) 创建一个层次以分解给定的数据集。该方法可以分为自上
而下(分解)和自下而上(合并)两种操作方式。为弥补分解与合并的不足,层次合
并经常要与其它聚类方法相结合,如循环定位。典型的这类方法包括:
第一个是;BIRCH(Balanced Iterative Recing and Clustering using Hierarchies) 方法,它首先利用树的结构对对象集进行划分;然后再利
用其它聚类方法对这些聚类进行优化。
第二个是CURE(Clustering Using REprisentatives) 方法,它利用固定数目代表对象来表示相应聚类;然后对各聚类按照指定
量(向聚类中心)进行收缩。
第三个是ROCK方法,它利用聚类间的连接进行聚类合并。
最后一个CHEMALOEN,它则是在层次聚类时构造动态模型。
3 基于密度方法,根据密度完成对象的聚类。它根据对象周围的密度(如
DBSCAN)不断增长聚类。典型的基于密度方法包括:
DBSCAN(Densit-based Spatial Clustering of Application with Noise):该算法通过不断生长足够高密
度区域来进行聚类;它能从含有噪声的空间数据库中发现任意形状的聚类。此方法将一个聚类定义
为一组“密度连接”的点集。
OPTICS(Ordering Points To Identify the Clustering Structure):并不明确产生一
个聚类,而是为自动交互的聚类分析计算出一个增强聚类顺序。。
4 基于网格方法,首先将对象空间划分为有限个单元以构成网格结构;然后利
用网格结构完成聚类。
STING(STatistical INformation Grid) 就是一个利用网格单元保存的统计信息进行基
于网格聚类的方法。
CLIQUE(Clustering In QUEst)和Wave-Cluster 则是一个将基于网格与基于密度相结合的方
法。
5 基于模型方法,它假设每个聚类的模型并发现适合相应模型的数据。典型的
基于模型方法包括:
统计方法COBWEB:是一个常用的且简单的增量式概念聚类方法。它的输入对象是采
用符号量(属性-值)对来加以描述的。采用分类树的形式来创建
一个层次聚类。
CLASSIT是COBWEB的另一个版本.。它可以对连续取值属性进行增量式聚
类。它为每个结点中的每个属性保存相应的连续正态分布(均值与方差);并利
用一个改进的分类能力描述方法,即不象COBWEB那样计算离散属性(取值)
和而是对连续属性求积分。但是CLASSIT方法也存在与COBWEB类似的问题。
因此它们都不适合对大数据库进行聚类处理.
❺ 增量聚类算法包括哪些
bigshuai
增量聚类算法
目前有关增量聚类的研究主要是将增量数据看成是时间序列数据或按特定顺序的数据, 主要可以分成两类: 一类是每次将所有数据进行迭代,即从第一个数据到最后一个数据进行迭代运算, 其优点是精度高, 不足之处是不能利用前一次聚类的结果, 浪费资源; 另一类是利用上一次聚类的结果,每次将一个数据点划分到已有簇中, 即新增的数据点被划入中心离它最近的簇中并将中心移向新增的数据点, 也就是说新增的数据点不会影响原有划分, 其优点是不需要每次对所有数据进行重新聚类, 不足之处是泛化能力弱, 监测不出孤立点。因此, 如何设计增量聚类算法以提高聚类效率, 成为当前聚类分析的一个重要挑战。
目前存在各种各样的聚类方法[ 3] , 传统的聚类方法主要被划分成五类: 基于层次的、基于划分的、基于密度的、基于网格的和基于模型的聚类。基于层次的聚类和基于划分的聚类是实际生活中应用最为广泛的两类。前者可以进一步划分为自底向上和自顶向下两种[ 1] , 例如CLIQUE[ 3] 、ENCLUS 和MAFIA[ 4] 属于自底向上算法, PROCLUS[ 5] 和ORCLUS[ 6 ]属于自顶向下的算法。但是, 传统的层次聚类算法由于计算量过大不适用于大数据集, 例如BIRCH[ 2] 和CURE[ 7 ] 。传统的基于划分的算法包括k-means、k-modes等等, 其中k-means是现存聚类算法中最经典的聚类算法[ 8, 9] 。
增量聚类是维持或改变k 个簇的结构的问题。比如, 一个特定序列中的新的数据点可能被划分到已有k 个簇的一个簇中, 也可能被划分到新的簇中,此时会需要将另外两个簇变成一个[ 10 ] 。自从H art igan在文献[ 11]中提出的算法被实现[ 12] , 增量聚类就吸引了众人的关注。D. Fisher[ 13] 提出的COBWEB 算法是一种涉及到增量形式数据点的增量聚类算法。文献[ 14, 15]中给出了与数据库的动态方面相关的增量聚类的详细阐述, 文献[ 16 18]中列出了其广泛应用的领域。对增量聚类产生兴趣的动力是主存空间有限, 有些信息不需要存储起来,例如数据点之间的距离, 同时增量聚类算法可以根据数据点集的大小和属性数进行扩展[ 19] 。文献[ 10, 17]中也对于求解增量聚类问题的算法进行了研究。
现在很多聚类算法都是对单一数据类型的数据进行聚类, 但是现实数据中非常多的数据都是混合数据类型的数据, 既包含数值属性数据, 还是分类属性数据, 简单地丢弃其中一种数据类型, 或者将其中一种数据类型转换成另一种, 都会影响聚类的精度。因此, 混合属性数据增量聚类的研究具有非常重要的意义。
2 基于传统聚类方法及其变形的增量聚类算法
现在对于增量聚类方法的增量处理主要集中在三个方面, 一类是基于传统聚类方法及其各种变形的增量聚类算法, 一类是基于生物智能的增量聚类算法, 另一类是针对数据流的聚类算法。
❻ 聚类算法的算法分类
很难对聚类方法提出一个简洁的分类,因为这些类别可能重叠,从而使得一种方法具有几类的特征,尽管如此,对于各种不同的聚类方法提供一个相对有组织的描述依然是有用的,为聚类分析计算方法主要有如下几种: 划分法(partitioning methods),给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K<N。而且这K个分组满足下列条件:
(1) 每一个分组至少包含一个数据纪录;
(2)每一个数据纪录属于且仅属于一个分组(注意:这个要求在某些模糊聚类算法中可以放宽);
对于给定的K,算法首先给出一个初始的分组方法,以后通过反复迭代的方法改变分组,使得每一次改进之后的分组方案都较前一次好,而所谓好的标准就是:同一分组中的记录越近越好,而不同分组中的纪录越远越好。
大部分划分方法是基于距离的。给定要构建的分区数k,划分方法首先创建一个初始化划分。然后,它采用一种迭代的重定位技术,通过把对象从一个组移动到另一个组来进行划分。一个好的划分的一般准备是:同一个簇中的对象尽可能相互接近或相关,而不同的簇中的对象尽可能远离或不同。还有许多评判划分质量的其他准则。传统的划分方法可以扩展到子空间聚类,而不是搜索整个数据空间。当存在很多属性并且数据稀疏时,这是有用的。为了达到全局最优,基于划分的聚类可能需要穷举所有可能的划分,计算量极大。实际上,大多数应用都采用了流行的启发式方法,如k-均值和k-中心算法,渐近的提高聚类质量,逼近局部最优解。这些启发式聚类方法很适合发现中小规模的数据库中小规模的数据库中的球状簇。为了发现具有复杂形状的簇和对超大型数据集进行聚类,需要进一步扩展基于划分的方法。
使用这个基本思想的算法有:K-MEANS算法、K-MEDOIDS算法、CLARANS算法; 层次法(hierarchical methods),这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。具体又可分为“自底向上”和“自顶向下”两种方案。
例如,在“自底向上”方案中,初始时每一个数据纪录都组成一个单独的组,在接下来的迭代中,它把那些相互邻近的组合并成一个组,直到所有的记录组成一个分组或者某个条件满足为止。
层次聚类方法可以是基于距离的或基于密度或连通性的。层次聚类方法的一些扩展也考虑了子空间聚类。层次方法的缺陷在于,一旦一个步骤(合并或分裂)完成,它就不能被撤销。这个严格规定是有用的,因为不用担心不同选择的组合数目,它将产生较小的计算开销。然而这种技术不能更正错误的决定。已经提出了一些提高层次聚类质量的方法。
代表算法有:BIRCH算法、CURE算法、CHAMELEON算法等; 基于密度的方法(density-based methods),基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。
这个方法的指导思想就是,只要一个区域中的点的密度大过某个阈值,就把它加到与之相近的聚类中去。
代表算法有:DBSCAN算法、OPTICS算法、DENCLUE算法等; 基于网格的方法(grid-based methods),这种方法首先将数据空间划分成为有限个单元(cell)的网格结构,所有的处理都是以单个的单元为对象的。这么处理的一个突出的优点就是处理速度很快,通常这是与目标数据库中记录的个数无关的,它只与把数据空间分为多少个单元有关。
代表算法有:STING算法、CLIQUE算法、WAVE-CLUSTER算法; 基于模型的方法(model-based methods),基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。这样一个模型可能是数据点在空间中的密度分布函数或者其它。它的一个潜在的假定就是:目标数据集是由一系列的概率分布所决定的。
通常有两种尝试方向:统计的方案和神经网络的方案。
❼ 聚类算法有哪些
聚类算法有:划分法、层次法、密度算法、图论聚类法、网格算法、模型算法。
1、划分法
划分法(partitioning methods),给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K<N。使用这个基本思想的算法有:K-MEANS算法、K-MEDOIDS算法、CLARANS算法。
2、层次法
层次法(hierarchical methods),这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。具体又可分为“自底向上”和“自顶向下”两种方案。代表算法有:BIRCH算法、CURE算法、CHAMELEON算法等。
3、密度算法
基于密度的方法(density-based methods),基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。代表算法有:DBSCAN算法、OPTICS算法、DENCLUE算法等。
4、图论聚类法
图论聚类方法解决的第一步是建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边(或弧)对应于最小处理单元数据之间的相似性度量。因此,每一个最小处理单元数据之间都会有一个度量表达,这就确保了数据的局部特性比较易于处理。图论聚类法是以样本数据的局域连接特征作为聚类的主要信息源,因而其主要优点是易于处理局部数据的特性。
5、网格算法
基于网格的方法(grid-based methods),这种方法首先将数据空间划分成为有限个单元(cell)的网格结构,所有的处理都是以单个的单元为对象的。代表算法有:STING算法、CLIQUE算法、WAVE-CLUSTER算法。
6、模型算法
基于模型的方法(model-based methods),基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。通常有两种尝试方向:统计的方案和神经网络的方案。
(7)clique算法扩展阅读:
聚类分析起源于分类学,在古老的分类学中,人们主要依靠经验和专业知识来实现分类,很少利用数学工具进行定量的分类。随着人类科学技术的发展,对分类的要求越来越高,以致有时仅凭经验和专业知识难以确切地进行分类,于是人们逐渐地把数学工具引用到了分类学中,形成了数值分类学,之后又将多元分析的技术引入到数值分类学形成了聚类分析。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。
在商业上,聚类可以帮助市场分析人员从消费者数据库中区分出不同的消费群体来,并且概括出每一类消费者的消费模式或者说习惯。它作为数据挖掘中的一个模块,可以作为一个单独的工具以发现数据库中分布的一些深层的信息,并且概括出每一类的特点,或者把注意力放在某一个特定的类上以作进一步的分析;并且,聚类分析也可以作为数据挖掘算法中其他分析算法的一个预处理步骤。
❽ 分团问题的算法
算法最简单的方法是用暴力法列举图中所有k个点的子集合,并检查它是不是clique。在一个有V个点的图中用暴力法找大小是k的clique至少要检查个子集合。
另外一个heuristic的方法是先找出所有一个点的clique,再慢慢合并成更大的clique直到不能再合并为止。
❾ 常用的聚类方法有哪几种
聚类分析的算法可以分为划分法、层次法、基于密度的方法、基于网格的方法、基于模型的方法。
1、划分法,给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K<N。
2、层次法,这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。
3、基于密度的方法,基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。
4、图论聚类方法解决的第一步是建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边(或弧)对应于最小处理单元数据之间的相似性度量。
5、基于网格的方法,这种方法首先将数据空间划分成为有限个单元的网格结构,所有的处理都是以单个的单元为对象的。
6、基于模型的方法,基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。
(9)clique算法扩展阅读:
在商业上,聚类可以帮助市场分析人员从消费者数据库中区分出不同的消费群体来,并且概括出每一类消费者的消费模式或者说习惯。
它作为数据挖掘中的一个模块,可以作为一个单独的工具以发现数据库中分布的一些深层的信息,并且概括出每一类的特点,或者把注意力放在某一个特定的类上以作进一步的分析;并且,聚类分析也可以作为数据挖掘算法中其他分析算法的一个预处理步骤。
许多聚类算法在小于 200 个数据对象的小数据集合上工作得很好;但是,一个大规模数据库可能包含几百万个对象,在这样的大数据集合样本上进行聚类可能会导致有偏的结果。
许多聚类算法在聚类分析中要求用户输入一定的参数,例如希望产生的簇的数目。聚类结果对于输入参数十分敏感。参数通常很难确定,特别是对于包含高维对象的数据集来说。这样不仅加重了用户的负担,也使得聚类的质量难以控制。
❿ k-clique是什么
我们学的这只有clique(最大团),
Instance: A graph G=(V, E) and a positive integer k.
Question: Does G contain a clique of size k or more?
属于np-complete问题,只有指数级的时间复杂度,不存在多项式时间内解决的算法