算法设计与分析———分治算法

一、分治法的设计思想

分治法将一个难以直接解决的大问题划分为一些规模较小的子问题,分别求解各个子问题,再合并子问题的解得到原问题的解。

算法设计与分析———分治算法

分治法的典型情况

二、分治法的求解过程

一般来说,分治法的求解过程主要由以下三个阶段组成:

  1. 划分:吧规模为n的原问题划分为k个规模较小的子问题。
  2. 求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归或者迭代的方法求解各个子问题,有时递归处理也可以用循环来实现。
  3. 合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异。分治算法的效率很大程度上依赖于合并的实现。

三、几种典型的分治策略算法

  • *归并排序

归并排序首先执行划分过程,将序列划分成2个子序列,如果子序列的长度为1,则划分结束,否则,继续执行划分,直到将n个待排序的序列划分为n个长度为1的有序子序列,然后再两两合并,得到⌈n/2⌉个长度为2的有序子序列,再进行两两合并,得到⌈n/4⌉个长度为4的有序子序列,直到得到一个长度为n的有序序列。

代码实现

点击查看代码

void Merge(int r[],int r1[],int s,int m,int t)
{
  int i = s,j = m + 1,k = s;
  while(i <= m && j <="t)" { if(r[i] r1[k++]="r[k++];//&#x53D6;r[i]&#x548C;r[j]&#x4E2D;&#x8F83;&#x5C0F;&#x7684;&#x653E;&#x5165;r1[k]&#x4E2D;" else } while(i while(j void mergesort(int r[],int s,int t) 对数组r[s]~r[t]进行归并排序 int m,r1[1000]; 数组r1为临时数组,假设最多能存1000个元素 if(s="=t)" return; mergesort(r,s,m); 求解子问题1,归并排序前半个子序列 mergesort(r,m+1,t); 求解子问题2,归并排序后半个子序列 merge(r,r1,s,m,t); 合并两个有序子序列,将结果存到数组r1中 for(int i="s;i" r[i]="r1[i];" }< code></=>

该算法的时间复杂度为: O(nlog2n)

  • 快速排序

再待排序表L[1…n]中任取一个元素pivot作为枢轴(通常取首元素),通过一趟排序将待排序表划分成独立的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中的所有元素小于pivot,L[k+1…n]中的所有元素大于等于pivot,,则pivot放在了其最终位置L[k]上,这个过程称为 一趟快速排序(一次划分)。对两个子表重复上述过程,直至每部分内只有一个元素或空为止。

代码实现

点击查看代码

int Partition(int r[], int first,int end)//&#x5BF9;&#x5F85;&#x6392;&#x5E8F;&#x8868;&#x8FDB;&#x884C;&#x5212;&#x5206;
{
  while(first < end)
  {
    int i = first,j = end;
    while(i < j && r[i] <= r[j] 扫描右侧 j--; if(i < j) { int temp="r[i];" r[i]="r[j];" i++; } while(i j && if(j return i; 返回轴值记录的位置 void quicksort(int r[],int firsr,int end) pivot; if(first pivot="Partition(r,first,end);//&#x5212;&#x5206;&#xFF0C;pivot&#x662F;&#x8F74;&#x503C;&#x518D;&#x5E8F;&#x5217;&#x4E2D;&#x7684;&#x4F4D;&#x7F6E;" quicksort(r,first,pivot - 1); 求解子问题1,对左侧子序列进行快速排序 quicksort(r,pivot + 1,end); 求解子问题2,对右侧子序列进行快速排序 code></=>

该算法的时间复杂度为: O(nlog2n)

Original: https://www.cnblogs.com/shmily-seff/p/15628922.html
Author: 一杯Java不加糖
Title: 算法设计与分析———分治算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569623/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【微服务】- Nacos-注册中心

    微服务 – 注册中心 – Nacos 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德…

    Java 2023年6月16日
    085
  • 约瑟夫环数学问题,最容易看懂的教程。

    先大概看一下图片中的内容,下面做详细解释 其中字母的意义代表A倒数第二个死亡,B倒数第三个死亡,以此类推。前几个可能不容易看懂,但是仔细看 第四步到第五步的下标变化, 相当于把第四…

    Java 2023年6月5日
    0158
  • WebBrowser隐藏后自动销毁的BUG以及解决办法

    程序主界面上有个浏览器控件,里面是google地图,需要点击一个按钮后隐藏浏览器控件,显示其他界面,而且要做到还可以切换到原来的地图上。 一开始只是在浏览器上覆盖了一个图片控件,没…

    Java 2023年5月29日
    077
  • 《拉钩课程 — 计算机网络通关》学习笔记

    一、概述 1、程序员基础知识大致可以分为七种基本科学:计算机组成原理、操作系统、计算机网络、算法和数据结构、图形学、编译原理、编辑技巧。 2、ISP:Internet Servic…

    Java 2023年6月7日
    077
  • VS Code常用插件

    VS Code常用插件 一、插件的下载 打开VScode之后点击右侧带有小方块的图标在上方的输入框中输入想要下载的插件的名称即可 二、插件的种类 Chinese (Simplifi…

    Java 2023年6月13日
    098
  • 如何实现 System.out.println(“a”) 显示 b

    今天看到一篇文章不用反射,能否交换两个字符串的值. 心想字符串常量在常量池里面,是在就算用了反射也交换不了吧。转念一想,不对,字符串常量虽然本身在常量池里面,但是它依然是个对象,那…

    Java 2023年6月9日
    091
  • logrotate 切割Tomcat的catalina.out文件

    使用logrotate进行切割。 在/etc/logrotate.d下,新建tomcatrotate,编辑tomatrotate,写入如下内容: /usr/local/tomcat…

    Java 2023年6月15日
    083
  • 记录一次NoSuchMethodError问题的解决

    一、问题描述 今天在执行单元测试时遇到了一个NoSuchMethodError错误,完整的报错信息如下: … Caused by: javax.validation.Valid…

    Java 2023年6月15日
    072
  • Spring:读入properties文件程序示例

    文章目录 + [项目目录结构](#-1) + [properties文件](#properties-4) + [xml文件](#xml-11) + [java文件](#java-3…

    Java 2023年5月30日
    075
  • 线程池底层原理详解与源码分析

    【1】为什么要使用线程池? 示例演示: 示例结果: 采用每次都开一个线程的结果是292毫秒,而线程池的是69毫秒。(随着业务次数的增多这个数值的差距会越大) 示例说明: 如果每个请…

    Java 2023年6月16日
    097
  • Netty源码分析之ChannelPipeline(二)—ChannelHandler的添加与删除

    上篇文章中,我们对Netty中ChannelPipeline的构造与初始化进行了分析与总结,本篇文章我们将对ChannelHandler的添加与删除操作进行具体的的代码分析; 一、…

    Java 2023年6月9日
    093
  • SpringBoot定时任务-什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?

    前文展示quartz实现基于数据库的分布式任务管理和job生命周期的控制,那在分布式场景下如何解决弹性调度、资源管控、以及作业治理等呢?针对这些功能前当当团队开发了ElasticJ…

    Java 2023年6月6日
    067
  • Java中定义常量方法及建议(Class/Interface)

    采用”类.常量名”方法进行调用。需要私有化构造方法,避免创建该类的实例。同时不需让其他类继承该类。 如果多处需要访问工具类中定义的常量,可以通过静态导入(s…

    Java 2023年5月29日
    074
  • 服务调用过程

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 源码分析均基于官方Demo,路径:dubbo/dubbo-demo 如果没有…

    Java 2023年6月16日
    074
  • 大数据技术栈,主要有哪些

    往大数据方向发展需要学哪些技术?网上一搜真是指不胜屈。对于小白来说,实在是一头雾水,到底哪些是当下流行的?哪些是必须要先学会的?流行?主次搞不清。为了解决这些疑惑,羚羊专门花了些时…

    Java 2023年6月6日
    094
  • 从理论到实践,刨根问底探索Java对象内存布局

    从理论到实践,刨根问底探索Java对象内存布局 所谓对象的内存布局,就是对象在分配到内存中后的存储格式。 对象在内存中的布局一共包含三部分: 对象头(Header) 实例数据(In…

    Java 2023年6月5日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球