summary(2)

来源:互联网 发布:网络女主播 可以娶 编辑:程序博客网 时间:2024/05/21 00:56

上周遇到的一些有趣问题:

1. 给定n个任意顺序的实数,它们对应数轴上的n各点,请在O(n)的时间内找到相邻距离最大的两点。

 思路: 如果不考虑复杂度问题,可以先排序,然后遍历一遍就能找到结果;但是因为如果是基于比较的排序的复杂度是O(nlogn),不予考虑,但是似乎可以从计数排序和桶排序等线性时间排序想,首先计数排序解决的问题要能转换成:假设n个输入的每一个元素都是介于0k之间的整数,k是整数。基本思想是对每个输入元素x, 确定出小于x的元素个数,有了这个信息就可以直接将元素定位在最终顺序数组中,所以计数排序可以排除。

 

那么桶排序呢?先来了解一下桶排序的前提条件和要解决的问题:假设输入有一个随机过程产生,该过程将元素均匀而独立地分布在区间[01)之间;桶排序只能是保证当输入符合均匀分布时,即可以以线性期望时间运行。基本思想是:把区间[01)划分成n个大小相同的子区间,或称为桶。然后将n个输入扔到桶中,先对各个桶中的元素排序,然后在收集一遍就得到顺序序列。 但是要想用桶排序来解决这个问题是不行的,因为这n个实数不一定满足均匀分布的特点。 但是其实我们还是可以顺着这个桶的思路走,不是一般性地:我们可以用O(1)时间将这n个数转换成【01】之间的数,我们是要求相邻距离最大的两点,可以把区间均分成n+1个桶,每个子区间的大小是1/(n+1)根据鸽巢原理,n个数放入n+1个桶中,至少有一个桶是空的;所以我们可以获得相邻距离最大值的下界是1/(n+1), 那么最大相邻间距两点出现的距离只可能是跨子区间的两点,如果它们落在同一个区间则距离必然小于1/(n+1); 那么我们可以在o(n)的时间内找出每个子区间的最大值和最小值,然后在计算间隔距离,找到最大的。O(n)时间按复杂度,需要开辟2n的额外空间。

 

2. 关于算法导论第二章《入门》

1. 归并排序中可以对小数组采用插入排序,这样更快。

2. 循环不变式

         用于帮助我们认识和证明算法的正确性。它有三个性质:

l  初始化:它在循环的第一轮迭代开始之前,应该是正确的

l  保持:如果在循环的某次迭代开始之前是正确的,那么在下一次迭代开始前也要保持正确

l  终止:当循环结束的。。。

证明算法的正确性,类似于数学归纳法。

3. 逆序对问题:

l  插入排序的运行时间和输入数组的逆序对之间的数量关系?

l  如何在O(NlogN)时间内求出所有逆序对数。 以归并排序为基础。

 

3. 重复子串检测问题(待续)

原创粉丝点击