线性时间选择,最接近点问题,循环赛日程表

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天的比赛日程。

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值