计算机的核心就是算法,甚至有人将程序解释为”数据结构+算法“。事实上,只要有些经验的程序员都会体会到,语言只是实现算法的工具,用C、java、Python等实现并没有什么实质性区别,只不过是将算法以语言的形式表达了出来而已。那么计算机实现算法的原理是什么呢?穷举。无论你是否认同,穷举是计算机解决问题的基本思路。也就是说,计算机与人相比优势在于其速度之快,可以将解空间可能的解在有限的时间内解决出来而已。然而,许多问题是计算机在有限时间内也无法解决的,如NP难问题。事实上,很多NP难问题至今并不存在多项式时间内的解法,甚至有许多问题只能在O(2^n)的复杂度内才能得到问题的最优解。随着大数据时代的到来,数据量已经达到了TB甚至PB的级别,当问题的规模n增长时,解决问题的时间是以指数趋势增长的。对PB级的数据在有限时间内执行指数级算法,恐怕即使世界上最先进的计算机也无能为力。
科学界有很多研究方向来解决此问题,其中之一是贪婪算法等近似算法。因为贪婪算法并不能保证得到最优解,只能在有限的时间内得到近似解,甚至有时我们无法判断这个近似解与最优解有多接近(除非能够证明最优解的大小,而这和求出最优解花费的时间并无太大差别),事实上,大多数时间我们只能得到最优解的一个界,而最优解在这个界的多大范围内也难以确定。那么另一种解决该问题的方法就是参数算法。所谓参数算法,就是为原问题寻找一个较小的参数,设计的算法时间复杂度在参数较小时其时间开销较小。以排序为例,目前最好的排序算法时间复杂度为nlog(n),这也是排序算法的下界。我们已经证明,不可能设计低于nlog(n)的算法来得到n个数据的排序。如果我们需要在n个数据中挑选出k个最大的元素,利用上述排序算法显然是不划算的。对于此问题可以设计出时间开销为O(nlog(k))的算法,当k很小时,这个问题的解决时间接近于线性的。这一点很有用,因为很多大的问题往往存在着一个较小的参数,如在研究学术论文形成的复杂网络时,论文数量n往往很大,而每篇论文的作者数量却通常很少;在设计电路板时需要将其划分为多个模块进行设计,电路点往往能达到成千上万个,然而划分成的模块一般只有4、5个;著名的TSP问题,图的规模是所有城市代表的点的集合,形成的边是城市数的平方级,而解集中边的个数为点的两三倍。如果我们对于一个规模较大的问题寻找到一个较小的参数,如O(n^3)->O(2^k),那么当k很小的时候,后者会得到一个比前者快得多的算法。例如n代表学术网络中论文的多少,其大小达到数十万,而k至多几十,那么后者显然更具实用性。
并不是所有的问题都存在参数算法,正如一般问题中存在P与NP的区别,参数算法中将问题分为FPT、W[1]-hard、W[2]-hard等,W[1]-hard问题往往是找不到参数算法的。