`

算法分析之分治法总结(二)

阅读更多
3)分类和合并同时进行
典型事例 快速排序:(以整数类型为例)
快速排序的思想是,对于输入,按照以下二个步骤进行排序
对于数组a[p:r]
1)分解(其实包括合并过程):以a[p]为基准将数组分成三段a[p:q-1]、a[q]、a[q+1:r]使得a[p:q-1]中的任意元素都小于等于a[q],a[q+1:r]中的任意元素都大于等于a[q].
2)递归求解:通过递归调用快速排序,分别完成a[p:q-1]和a[q+1:r]的排序。
程序代码:
int partition(int a[],int p,int r)
{
 int i=p,j=r+1,x=a[p],temp;
 while(true)
 {
  while(x>a[i]){++i;}
  while(x<a[j]){--j;}
     if(i>=j) break;
  temp=a[i];
  a[i]=a[j];
  a[j]=temp;
 }
 a[p]=a[j];
 a[j]=x;
 return j;
}
void QuickSort(int a[],int p,int r)
{
 if(p < r)
 {
  int q=partition(a,p,r);
  QuickSort(a,p,q-1);
  QuickSort(a,q+1,r);
 }
}

与QuickSort类似的例子是选择问题:
我们经常遇到的选择问题是选择最大元素和最小元素的问题,这个问题解决起来比较容易,而且时间复杂度为O(n),但是当我们把这个问题一般化的时候,既选择第k小(大)的元素的时候,思考一下,最容易想到的方法是排一下序,第k个 位置就是第k小的元素,在想一想可以找一些能够在每一次能够确定一个元素的最终位置的排序方法(如冒泡法,直接选择排序法等)只需要排好k(k<=n/2时)个的元素或者n-k(k>n/2),但是这样的话其实时间复杂性仍然是O(n^2),比找最大和最小所用的时间复杂度大的多。如果采用QuickSort算法其时间复杂度为O(nlogn),对于排序的确是个非常好的算法,但是我们想QuickSort是把所有的元素都排好的时间复杂度,我们找第k小的元素,从感性上也可以知道这是比排序要简单的问题,但是找第k小的元素,k本身就是个序号问题,如果不排序似乎解决不了这个问题。似乎有一个简单的情形会给我们以启发:我们在桌子上摆了一副扑克,我们规定了各个扑克的大小,现在是找第k小的元素,人或许很容易看出,但计算机似乎有点困难,那就找个就简单的方法吧---瞢,瞢当然不是瞎瞢,瞢错了你可以去掉一些不符和条件的扑克,例如瞢到了一张红桃k,现在好办了,把比红桃k小的扑克数一数,如果小于k-1,那好把红桃k和那些扑克仍在一边,如果等于k-1,恭喜你,瞢对了,否则,把其他的扑克和k仍在一边。对剩余的扑克继续重复上述过程(当然这是k应适当的变化一下)。其实我们发现上述过程如果不是运气特差的话,一次就能够扔掉不少扑克牌。
其算法如下:
//搜索第k小的元素
int partition(int a[],int p,int r)//分化
{
 int i=p,j=r+1,x=a[p],temp;
 while(true)
 {
  while(x>a[i]){++i;}
  while(x<a[j]){--j;}
     if(i>=j) break;
  temp=a[i];
  a[i]=a[j];
  a[j]=temp;
 }
 a[p]=a[j];
 a[j]=x;
 return j;
}
int SelectK(int a[],int p,int n,int k)//选择
{
 int q,i;
    q=partition(a,p,n);
 i=q-p+1;
 if(i<k)
      return SelectK(a,q+1,n,k-i);
 else if(i==k)
   return a[q];
 else
   return SelectK(a,p,q-1,k);
}


//上述的算法当然不是优化之后的算法,虽然这个算法最坏情况下仍然是O(n^2),但平均复杂度只是o(n),虽然改进后的的算法在最坏的情况下时间复杂度线性的T(n)<=72c1n,即nlog(10^72)这个算法显然在实际上已经没有什么应用的价值,只有理论价值,因为当数据的规模在比10^72这个数量大的时候,他的速度才会超过快速排序的最坏结果。下面是改进后的算法(线性搜索)的思路.考虑上面程序算法最坏的情况在什么时候发生?当每一次你选择的元素都离你要选择的基准元素相差最远的时候。改进算法就是为了不至于每次都遇到这么差的运气,所以他在选择分化基准元素的时候,他尽量选择大小在中间大小的元素,因为这样在平均的情况下效率挺高,一次就扔掉一半,在最坏的情况下也不会很坏。所以在partition之前要在n个元素中选择中间元素,这当然也是个很难简单就解决的问题,所以不一定真的是最中间的,大体上差不多就行了,因为这样远远比最中间的元素的时间复杂度小得多。算法的步骤如下:
1)将参加划分的n个元素分成[n/r]组(r>1),每组有r个元素,将n-r[n/r]的元素扔掉,然后对每一组的元素找出中间的元素,然后再从中间元素选择中间元素,这样的元素已经满足我们的要求了,虽然不一定是真正的中间元素。二次取中间值的方法复杂度是o(n)数量级的。其他的就和上面没改进的算法步骤一样了,不再详述。
分治法作为一种算法思想和前人总结的经验,关键是理解其算法的思想,不同的题难度不一,应具体问题具体分析。
分享到:
评论

相关推荐

    [AB PLC例程源码][MMS_044666]Translation N-A.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    kolesar_3cd_01_0716.pdf

    kolesar_3cd_01_0716

    latchman_01_0108.pdf

    latchman_01_0108

    matlab程序代码项目案例:matlab程序代码项目案例MPC在美国高速公路场景中移动的车辆上的实现.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    pimpinella_3cd_01_0716.pdf

    pimpinella_3cd_01_0716

    petrilla_01_0308.pdf

    petrilla_01_0308

    [AB PLC例程源码][MMS_041452]Speed Controls in Plastic Extrusion.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    强化学习驱动下DeepSeek技术创新及其对AI发展的影响

    内容概要:本文档由张卓老师讲解,重点探讨DeepSeek的技术革新及强化学习对未来AI发展的重要性。文章回顾了AI的历史与发展阶段,详细解析Transformer架构在AI上半场所起到的作用,深入介绍了MoE混合专家以及MLA低秩注意机制等技术特点如何帮助DeepSeek在AI中场建立优势,并探讨了当前强化学习的挑战和边界。文档不仅提及AlphaGo和小游戏等成功案例来说明强化学习的强大力量,还提出了关于未来人工通用智能(AGI)的展望,特别是如何利用强化学习提升现有LLMs的能力和性能。 适用人群:本资料适宜对深度学习感兴趣的研究人员、开发者以及想要深入了解人工智能最新进展的专业人士。 使用场景及目标:通过了解最新的AI技术和前沿概念,在实际工作中能够运用更先进的工具和技术解决问题。同时为那些寻求职业转型或者学术深造的人提供了宝贵的参考。 其他说明:文中提到了许多具体的例子和技术细节,如DeepSeek的技术特色、RL的理论背景等等,有助于加深读者对于现代AI系统的理解和认识。

    有师傅小程序开源版v2.4.14+前端.zip

    有师傅小程序开源版v2.4.14 新增报价短信奉告 优化部分细节

    [AB PLC例程源码][MMS_047333]Motor Sequence Starter with timers to start.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    商城二级三级分销系统(小程序+后台含源码).zip

    商城二级三级分销系统(小程序+后台含源码).zip

    li_3ck_01b_0918.pdf

    li_3ck_01b_0918

    nicholl_3cd_01_0516.pdf

    nicholl_3cd_01_0516

    1995-2022年 网络媒体关注度、报刊媒体关注度与媒体监督相关数据.zip

    媒体关注度是一个衡量公众对某个事件、话题或个体关注程度的重要指标。它主要反映了新闻媒体、社交媒体、博客等对于某一事件、话题或个体的报道和讨论程度。 媒体监督的J-F系数(Janis-Fadner系数)是一种用于测量媒体关注度的指标,特别是用于评估媒体对企业、事件或话题的监督力度。J-F系数基于媒体报道的正面和负面内容来计算,从而为公众、研究者或企业提供一个量化工具,以了解媒体对其关注的方向和强度。 本数据含原始数据、参考文献、代码do文件、最终结果。参考文献中JF系数计算公式。 指标 代码、年份、标题出现该公司的新闻总数、内容出现该公司的新闻总数、正面新闻数全部、中性新闻数全部、负面新闻数全部、正面新闻数原创、中性新闻数原创、负面新闻数原创,媒体监督JF系数。

    [AB PLC例程源码][MMS_040315]Double INC and Double DEC of INT datatype.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_047773]Convert Feet to Millimeters.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_042349]How to read-write data to-from a PLC using OPC in Visual Basic 6.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    matlab程序代码项目案例:matlab程序代码项目案例论文代码 多篇RMPC 鲁棒模型预测控制Paper-code-implementation.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    lusted_3cd_02_0716.pdf

    lusted_3cd_02_0716

    pepeljugoski_01_0107.pdf

    pepeljugoski_01_0107

Global site tag (gtag.js) - Google Analytics