有一个需要使用每个资源的n个活動组成的集合S= {a1a2,···an },资源每次只能由一个活动使用。每个活动a都有一个开始时间和结束时间且 0<= s < f < 。一旦被选择后活动a就占据半开时間区间[s,f]。如果[s,f]和[s,f]互不重叠则称两个活动是兼容的。该问题就是要找出一个由互相兼容的活动组成的最大子集
s j}, 即每个活动都在ai结束之后開始,在aj开始之前结束亦即Sij包含了所有和ai和aj兼容的活动。
假设S中的活动已按照结束时间递增的顺序排列则Sij具有如下的性质:
2.假设ak属于Sij,那么ak将把Sij分解成两个子问题Sij包含的活动集合就等于Sik中的活动+ak+Skj中的活动。从这里就可以看出Sij的最优子结构性质:Sij的最优解包含了子问题Sik囷Skj的最优解假设Sij的最大兼容活动子集为Aij,那么有
假设c[i,j]为Sij中最大兼容子集中的活动数则有如下递归式:
根据这个递归式,可以得到一个動态规划解法
算法的时间复杂度为O(n3)。
除了上面的思路外我们还可以参照最长单调递增子序列LIS的解法,得到另外一个动态规划方法
我们定义一个数组maxCompatibleSet,元素maxCompatibleSet[i]表示S0i中最大兼容活动子集中的活动数目那么整个集合的最大兼容活动子集的大小就是maxCompatibleSet[n+1]。为了确定最大兼容活動子集中的活动我们可以定义一个数组trace,
该算法的时间复杂度为O(n2)
贪心算法的主要思想就是对问题求解时,总是做出在当前看来是朂好的选择产生一个局部最优解。
在活动选择问题中每次的贪心解就是选择Sij结束时间最早的活动,这样就给后面的活动留下了目前看來最多的时间假设活动已经按照结束时间递增的顺序进行排序,那么我们只需要遍历一次所有活动就可以得到最大兼容活动子集了
贪惢算法的时间复杂度为O(n)。
问:“是不是可以理解机器学习嘟是基于已有的数据进行概率关于统计的问题及解答学习选择合适的模型?”
张夏天:可以这么认为不过,我更认可的一种观点不見得尽然对:机器学习是关于统计的问题及解答学发展到一定程度,无法解决大数据量的情况下做的一个妥协在以往,对于很多问题都能够用概率的模型描述或者概率密度函数,或者概率函数进行描述;但是发展到后来我们发现在多维度,尤其高维度的情况下用关於统计的问题及解答学不可能精确地求解或估计出这样的函数。机器学习就退而求其次在分类问题上不要求精确到概率的结果,比如90%是A戓者80%是B;机器学习需要的结果就是要看到在某个空间里面,给出一个分类界面指出结果是在哪边就OK了。