zoukankan      html  css  js  c++  java
  • 作业6 选择问题

    1.     问题

    给定一个n个元素的集合L,从L中选取第k小的元素,其中1<=k<=n.这里的第k小元素是指,当L按从小到大排好序之后,排在第k个位置的元素。

    2.     解析

    这个问题也用分治法的策略来解决。分治的策略主要思想是在保持问题的背景条件不变的情况下,通过解决小规模的问题来解决较大规模的问题。

    对于这个问题

    (1)我们可以先从集合L中选择一个标准元m*,并将集合L分为两部分S1,S2.S1的元素全部大于m*,S2的元素全部小于m*。

    (2)根据给定的需要查找的第k小的数中的k来进行判断,如果k = |S1|+1,那么m*就是所要找的第k小的元素;如果k <|S1|+1,那么这个问题可以简化为,在S1中寻找第k1小的元素,其中k1=k;如果k > |S1|+1,那么这个问题可以化简为,在S2中寻找第k2小的元素,其中k2 = k -|S1| - 1.这样我们就将一个较大的问题化简为了较小的问题

    (3)确定了大致的策略后,还要解决的就是如何选择一个标准元。首先我们将全部的元素以五个为一组进行分组。并对每个五元组进行排序,获得每个五元组的中位数。在这些所有五元组的中位数中的中位数来作为标准元。

    3.     设计

    int FindKthMin(L,k,n)//n为数组L的长度,k为要寻找的下标

    {

           For(int I = 0;I < n/5;i++)

                  Sort(L,i,i+5);

           Sort(L,(n/5)*5,n);

           For(int I = 2;I < n;i+=5)

                  For(int j = 2;j < n;j+=5)

                  {

                         If(L[j] < L[i])

                                Swap5(L,I,j);

                  }

           Int S1[100],S2[100];

           Int mindex = (n/5)/2 * 5 + 2;

           Int m = L[mindex];

    //接下来是对所划分的集合进行整理,成为两个集合S1,S2

           For(int I = 0;I <= (n/5)/2;i++)

                  For(int j = 2;j <5;j++)

                         If(i*5+j != mindex)

                                S1.add(L[i*5+j]);

           For(int I = (n/5)/2;I < n/5;i++)

                  For(int j = 0;j < 3;j++)

                         If(i*5+j != mindex)

                                S2.add(L[i*5+j]);

          

           For(int I = 0;I < (n/5)/2;i++)

                  For(int j = 0;j < 3;j++)

                  {

                         If(L[i*5+j] < m)

                                S1.add(L[i*5+j]);

                         Else

                                S2.add(L[i*5+j]);

                  }

           For(int I = (n/5-1)*5+3;I < n;i++)

           {

                  If(L[i] < m)

                         S1.add(L[i]);

                  Else

                         S2.add(L[i]);

           }

           If(length(S1)+1 = k)

                  Return m;

           Else if(length(S1)+1 < k)

                  FindKthMin(S2,k-length(S1)-1,length(S2))

           Else

                  FindKthMin(S1,k,length(S1))

    }

    4.     分析

    假设集合L的长度n为5的倍数,且n/5是奇数,及n/5 = 2*r+1,那么n = 10*r+5.在最坏的情况下,子问题的规模为-1.5.< .

    因此可以得出递推方程 W(n) <= W() + W() + tn.

    其中是选出标准元m的复杂度,是下个子问题的时间复杂度,tn是对于数据进行处理的复杂度。由此求出递推树可得时间复杂度为O(n)

    5.     源码

    https://github.com/fanchile/Algorithm

  • 相关阅读:
    Android 节日短信送祝福(UI篇:3-选择短信与发送短信的Activity的实现)
    Android 节日短信送祝福(功能篇:2-短信历史记录Fragment的编写)
    Android 节日短信送祝福(功能篇:1-数据库操作类与自定义ContentProvider)
    Android AIDL 小结
    Android 异步更新UI-线程池-Future-Handler实例分析
    Android 利用线程运行栈StackTraceElement设计Android日志模块
    Android OkHttp网络连接封装工具类
    Android OKHttp源码解析
    Android开发人员不得不收集的代码(持续更新中)
    Android 为开发者准备的最佳 Android 函数库(2016 年版)
  • 原文地址:https://www.cnblogs.com/Fanchile/p/12618963.html
Copyright © 2011-2022 走看看