【算法设计与分析】13 分治策略的设计思想

算法中很多方法都是可以采用分治策略进行设计与优化,那么什么是分治策略?如何使用分治策略进行算法的设计与分析?

文章目录

    • 1. 分治策略的基本思想
      • 1.1 二分检索的设计思想
      • 1.2 二分归并排序的设计思想
      • 1.3 Hanoi塔的递归算法
    • 2 小结

1. 分治策略的基本思想

  • 分治策略(Divide and Conquer)
  1. 将原始问题划分或归结为规模较小的子问题
  2. 递归或者迭代的求解每个子问题
  3. 将子问题的解综合得到原问题的解

在设计分治策略时,一定要注意以下几点:

  1. 子问题与原问题的性质完全一样
  2. 子问题之间可以彼此独立的求解
  3. 递归停止时,子问题可以直接进行求解得出结果。

下面以二分检索的例子来分析分之策略的思想。

1.1 二分检索的设计思想

  • 设算法:Binary Search(T,l,r,x)。
  • 输入:排好序的数组T ,下标从l到r;数x。
  • 输出:j //若x在T中,则为下标,否则为0

给出下面的伪码

在这里插入图片描述
二分检索的设计思想:

  1. 通过x与数组的中位数进行比较,将原问题归结为规模减半的子问题。如果x小于中位数,则子问题由小于x的数构成,否则子问题由大于x的数构成。
  2. 对子问题进行二分搜索算法
  3. 当子问题为1时,直接比较T[m]与x,若相等则返回m,否则返回0.

二分检索最坏情况下时间复杂度分析,在前面的文章中已经学习了如何分析算法的时间复杂度,如果不懂下面的公式的,可以多看看前面的文章。

W(n)=W(⌊n/2⌋)+1W(n)= W(\lfloor n/2 \rfloor)+1W(n)=W(n/2)+1
W(1)=1W(1) = 1W(1)=1

可以解出:

W(n)=⌊logn⌋+1W(n) = \lfloor logn \rfloor +1W(n)=logn+1

1.2 二分归并排序的设计思想

  • 设算法:Merge Sort(A,p,r)
  • 输入:A[p…r]
  • 输出:元素按从小到大排序额数组A

先看以下伪码:

在这里插入图片描述
二分归并的设计思想:

  1. 将原问题划分为规模为n/2的两个子问题
  2. 继续划分,将原问题归结为4个子问题,继续…当子问题估摸为1时,划分结束。
  3. 从规模1到n/2,陆续归并被排好序的两个数组。每归并一次,数组规模扩大一倍,直到原始数组。

二分归并排序的时间复杂度:假设n为2的幂次方,二分归并排序最坏时间复杂度为:

W(n)=2W(n/2)+n−1W(n) = 2W(n/2) + n-1W(n)=2W(n/2)+n1
W(1)=0W(1) = 0W(1)=0

可以解出:
W(n)=nlogn−n+1W(n) = nlogn - n + 1W(n)=nlognn+1

仔细体会着其中的分治策略

1.3 Hanoi塔的递归算法

在这里插入图片描述
Hanoi塔的算法设计思想:

  1. 将原问题归结为规模为n-1的两个子问题
  2. 继续归结,将原问题归结为n-2的四个子问题.继续… ,当子问题规模为1时,归约过程截止。
  3. 从规模为1到n-1,陆续组合两个子问题的解,知道规模为n。

2 小结

  1. 将原问题归约为规模较小的子问题,子问题与原问题性质完全一样
  2. 子问题规模足够小时,可以直接求解
  3. 算法可以递归也可以迭代实现
  4. 算法的分析方法为:递推方程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字段 新增hive_Hive分区表 | 每日五分钟学大数据

数据分区的一般概念存在已久。其可以有多种形式,但是通常使用分区来水平分散压力,将数据从物理上转移到和使用最频繁的用户更近的地方,以及实现其他目的。Hive中有分区表的概念。我们可以看到分区表具有重要的性能优势,而且分区表…

【算法设计与分析】14 分治算法的一般描述和分析方法

本文主要描述分治算法的一般描述和分析方法。衔接上一篇文章:【算法设计与分析】13 分治策略的设计思想 文章目录1 分治算法的一般性描述1.1 分支算法的时间分析1.2 两类常见的递推方程与求解方法2 总结1 分治算法的一般性描述 设分治算法为:Divide-and…

idea_取消自动import .*

打开设置 > Editor > Code Style > Java > Scheme Default > Imports ① 将 Class count to use import with “" 改为 99 (导入同一个包的类超过这个数值自动变为 * ) ② 将 Names count to use static import with "” 改为 …

呼呗电销机器人_为什么企业销售电销都用电销外呼智能机器人

电销行业“痛点”明显,成为企业发展桎梏在电销企业中,运营成本占据了很大的资金比例,呼叫中心搭建和后期维护、销售人员的薪酬、培训、学习成本等都需要大量的投入,导致企业发展后劲不足。挂断、拒接常有,谁来拯救电销…

知识管理系统Data Solution研发日记之十二 网页数据抓取Fetch,呈现Render,导出Export...

这篇文章是对第四篇文章《知识管理系统Data Solution研发日记之四 片段式数据解决方案》的补充,提供一套完整的解决方案。请先阅读那一篇文章来了解它的原理。 Rule Editor抓取数据 这里,主要的工作是设定目标地址,正则表达式规则。我生活在深…

【算法设计与分析】15 分治策略:芯片测试

上一篇文章学习了【算法设计与分析】14 分治算法的一般描述和分析方法 文章目录1. 芯片测试1.1 一次测试的过程1.2 如何测试一块芯片的好坏1.3 蛮力算法1.4 分治算法设计思想1.41 分治算法的正确性证明1.42 时间复杂度分析2. 总结本篇文章借助具体的例子来学习分治策略。这个例…

批量 材质 调整_游戏图形批量渲染及优化:Unity静态合批技术

作者:枸杞忧天(本文首发于公众号“偶尔学学Unity”,文章仅为作者观点,不代表GWB立场)最近在准备公司的技术分享,主题是入门批量渲染,想着反正也总结了,不如充几篇博客吧,也算显得没有那么半途而…

css - clearfix-清除浮动

参考: http://www.cnblogs.com/zllwebjs/archive/2010/03/19/1689980.html http://www.cnblogs.com/zhangyufeng523/archive/2011/05/09/2041224.html 清除浮动方法有好几种, 1. 用空div,设置css为clear:both 2. 用空br,设置css为…

【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)

上一篇文章学习了:【算法设计与分析】15 分治策略:芯片测试 文章目录1. 快速排序的基本思想1.2 时间复杂度的计算1.21 最坏情况时间复杂度计算1.22 最好情况时间复杂度1.23 平均时间复杂度计算2 总结1. 快速排序的基本思想 用首元素 x 作划分标准&#…

的run窗口不显示_「玩转deepin」如何安装VirtualBox增强功能使得deepin全屏显示?...

在Windows上通过Virtualbox安装deepin深度操作系统,安装完成后,为了让deepin可以在virtualbox中全屏显示,需要安装增强工具,但是不少同学点击安装增强工具后会出现无法安装的情况。在【设备】中点击【安装增强功能】时&#xff0c…

掘金浏览器插件安装图文教程

本文介绍如何安装掘金chrome插件: Chrome插件推荐 2018-02-27 21:53 chrome插件网近日推荐一款设计师开发人员人手必备的一款插件:掘金插件。有网友留言给笔者说希望整理出一套掘金插件详细的安装步骤。于是就有了今天的图文详解掘金插件安装步骤。第一…

python集群到hadoop_如何使用Hadoop流在本地Hadoop集群中运行MRJob?

我正在学习一个大数据类,我的一个项目是在本地建立的Hadoop集群上运行Mapper/Reducer。在我一直在为类使用Python和MRJob库。在下面是我当前用于Mapper/Reducer的Python代码。在from mrjob.job import MRJobfrom mrjob.step import MRStepimport reimport osWORD_RE…

【ThinkPHP】实例化模型的方法

欢迎大家访问我自己架的博客站点 码厩技术博客! 1、实例化一个Model function D($name, $app) { static $_model array(); if (empty($name)) return new Model; if (empty($app)) $app C(DEFAULT_APP); if (isset($_model[$app . $name])) return $_model[$app .…

【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

文章目录1 一条SQL查询语句是如何执行的2 mysql体系结构3 InnoDB存储引擎4 总结1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应用与数据库完全就是通过SQL语句进行交互。大多数开发者很少去了解数据库的内部实…

session实现机制_如何理解php session运行机制

php session运行机制就是客户端将session id传入到服务器中,服务器再根据session id找到对应的文件并将其反序列化得到session值,然后保存的时候先序列化再写入今天将要分享的知识点是PHP中的会话运行机制,对于熟悉PHP的开发者来说并不陌生&a…

【MySQL原理解析】01. 一条SQL查询语句是如何执行的

这是【MySQL原理解析】的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧。万事开头难,咱们先破了这个开头&am…

【转载】MOS开关(verilog)

MOS开关 一. MOS开关 1. NMOS 源极(d)接Gnd 一般情况下,可认为晶体管受栅极(g)电平VG的控制(control). 1). VGH,源极(s)与漏极(d)接通; 2). VGL,源极(s)与漏极(d)断开. 源极(s)与漏极(d)接通, 则漏极(d)被下拉到Gnd. 2. PMOS 源极(d)接VDD 1)…

【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

学习交流加(可免费帮忙下载CSDN资源):个人微信: liu1126137994学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2(已满): 780902027学习交流资源…

用Log4Net来记录系统的日志信息

[http://www.cnblogs.com/xhwy/archive/2011/11/25/2263495.html] 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明…

扩展插件_Adobe扩展工具插件系列

Adobe系列软件相信大家都已了解到其功能的强大,除了软件之外Adobe系列的插件的功能也是不可忽略的。今天给大家分享的几款Adobe系列超强PS扩展工具,都是一些摄影师、设计师经常用的到的,可以提升不少工作效率,大家千万别错过哦&am…