1.线性时间选择
- 选择:元素查找,搜索
- 这里元素选择问题主要是指
中位数的选择
问题
- 直接排序,一个一个找,找第一小,第二小,第中位数K小
- 1到k,查找之和,一共(n+1)/2项
- 也可以事先排序,然后找到序列中(n+1)/2项
- 比如选合并排序,O(nlogn)
-
如果1<=k<=6,则原问题转化为:在第1组中寻找第k个最小元素;
-
如果7<=k<=10,则原问题转化为:在第2组中寻找第k-j个最小元素,其中,j为第1组元素的总个数;
-
与快速排序算法不同的是:根据基准点,将元素分为2组,基准点包含在第1组中;
-
如果k<=j,则第k小元素落在a段,为a段的第k小元素;
-
如果k>j,则a段的所有元素都比第k小元素还要小,第k小元素落在b段,为b段中的第k-j小元素(-j的含义是去掉a段的元素总个数)
-
random函数,随机取
-
partion函数,就是快速排序中的找一个基点,小的放左边,大的放右边
-
此处描述的是理想情况,即每次都选前半段,留下前半段的n/10个,每次都能丢弃后半段的(9n/10)个。
-
所以丢弃的越多越好,那如何选择基准点就成了关键
-
每组5个元素是实现定死的,没有特别的原因,最后一组的元素不一定是5个;
-
例
-
本题将基准点放在了后半段
-
假设数组中所有的元素各不相等;
-
(1)每组5个元素,中间的元素为中位数,每组中2个元素比中位数大,2个元素比中位数小;
-
(2)划分的组数为 m = n/5 ,每组有一个中位数,这m个中位数的中位数x=(m+1)/2; 在这m个元素中,比中位数x小的元素个数 k=((m+1)/2)-1=(m-1)/2;
将m=n/5代入,k=(n-5)/10; 在这k个中位数各自所在的小组中,每组又有2个元素比该中位数小; -
(3)因此,划分出两个子数组中,小于中位数x的数组的长度为 k+2k; 前者k指划分出的m组中,小于中位数x的有k个, 后者2k的含义是:在k个中位数所在的小组中,每组有2个小于各自小组的中位数。 k+2k=3k= 3(n-5)/10
2.最接近点对问题
- 我们只要将每一点与其他n-1个点的距离算出,找出达到最小距离的两个点即可。然而,这样做效率太低,需要O(n^2)的计算时间
- 采用分治法思想,考虑将所给的n个点的集合S分成2个子集S1和S2,每个子集中约有n/2个点,然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现分治法中的合并步骤,即由S1和S2的最接近点对,如何求得原集合S中的最接近点对,因为S1和S2的最接近点对未必就是S的最接近点对。
- 如果组成S的最接近点对的2个点都在S1中或都在S2中,则问题很容易解决。
- 但是,如果这2个点分别在S1和S2中,则对于S1中任一点p,S2中最多只有n/2个点与它构成最接近点对的候选者,仍需做n2/4次计算和比较才能确定S的最接近点对。因此,依此思路,合并步骤耗时为O(n2)。整个算法所需计算时间T(n)应满足: T(n)=2T(n/2)+O(n^2)。
- 它的解为T(n)=O(n^2),即与合并步骤的耗时同阶,这不比用穷举的方法好。从解递归方程的套用公式法,我们看到问题出在合并步骤耗时太多。这启发我们把注意力放在合并步骤上。
一维最接近点对
- 先将数据用某种方法进行排序;时间复杂度为O(nlogn)
- 然后分治,将数据分为两段,S1和S2,分别在两段中找出最接近点对。
- 最后 合并。
- 假设在S1和S2上找出其最接近点对{p1,p2}和{q1,q2}
- S中的最接近点对或者是{p1,p2},或者是{q1,q2},或者是某个{p3,q3},其中p3∈S1且q3∈S2
- 图下这段话是用来证明p3和q3是S1,S2中最边上的点
- 也就意味着: (m-d, m] 区间中只包含一个点p3;
(m, m+d] 区间中只包含一个点q3;
算法思路
二维最接近点对问题
- 设S中的点为平面上的点,它们都有2个坐标值x和y。
- 为了将平面上点集S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l:x=m来作为分割直线。
- 其中m为S中各点x坐标的中位数。由此将S分割为S1={p∈S|px≤m}和S2={p∈S|px>m}。从而使S1和S2分别位于直线l的左侧和右侧,且S=S1∪S2 。
- 由于m是S中各点x坐标值的中位数,因此S1和S2中的点数大致相等。
- 例一
- 例二
- d=0.316
- 此时在 (x-d] 这个区域内,只有点i, 需要在右侧检测的矩形区域的4个坐标点为
- (1+0.316,0.5+0.316);(1+0.316,0.5-0.316);(1, 0.5+0.316 );(1,0.5-0.316)
- 即(1.316,0.816);(1.316,0.184);(1,0.816);(1,0.184)
- 此范围内无右边区域的任何点,因此 (i,g)的距离也不用计算,可以直接下结论最接近点对为(b,h)
3.循环赛日程表
- 按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。
- 思路: 按分治策略,我们可以将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。
- 递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。
- 所列出的正方形表是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。
- 据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。