如何快速正确的写出各种分治算法的实现代码

分治算法大家都很熟悉,很多时候(比如ACM竞赛)当我们判断出一个问题可以用分治算法来解决的时候,却往往因为具体的问题的复杂性,难以很快理清思路,迅速正确地写出问题的分治算法。

因此,要想快速正确的写出分治算法的实现代码,就必须足够的认识分治算法。直接看结论

一、认识分治

在分治策略中,我们递归地解决一个问题,在每层递归中应用如下三个步骤:

1.分解(Divide):将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。

2.解决(Conquer):递归地求解出子问题。如果子问题规模足够小,则停止递归,直接求解。

3.合并(Combine):将子问题的解组合成原问题的解。

此外还需要补充两个定义:

1.当问题足够大,需要递归求解时,称为递归情况(recursive case)

2.当问题足够小,不需要递归求解时,我们说递归已经触底,进入了基本情况(base case)

这些定义具体可以参考《算法导论》,在此我不加以赘述。

关于分治我们已经有了一定的了解,但是依然无法快速正确的写出分治的算法,这是很自然的。

每当我们思考使用分治的时候,我们都有分开思考过三个步骤和两个情况。

而且这很容易做到,但是我们却无法写出具体的代码,关键原因在于我们不清楚这些步骤和情况之间的关系

二、解决分治

首先给出一个简单的步骤描述:

1.先处理基本情况

  1.1判断问题规模

  1.2如果是基本情况则直接解决问题

2.再处理递归情况

  2.1先在脑海中思考,该问题可具体分解成哪些子问题

  2.2再按顺序递归调用

3.最终合并

  3.1将已经解决的子问题合并,最终处理问题。

三、后续工作

接下来证明刚才的步骤是正确的分治算法。

//然而这并不简单,容我用纸先写一下。

时间: 2024-08-02 06:30:20

如何快速正确的写出各种分治算法的实现代码的相关文章

如何写出更好的Java代码

Java是最流行的编程语言之一,但似乎并没有人喜欢使用它.好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具. 这篇文章在GitHub上也有.你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践. 编码风格 结构体 builder模式 依赖注入 避免null值 不可变 避免过多的工具类 格式 文档 Stream 部署 框架 Maven 依赖收敛 持续集成 Maven仓储 配置管理

[label][翻译][JavaScript-Translation]七个步骤让你写出更好的JavaScript代码

7 steps to better JavaScript 原文:http://www.creativebloq.com/netmag/7-steps-better-javascript-51411781七个步骤让你写出更好的JavaScript代码 随着浏览器的性能提升,新的HTML5 APIS也在不断地被应用,JavaScript在web使用中不断增长.然而,一行糟糕的代码就有可能会影响到整个网站,产生糟糕的用户体验和造成潜在客户的流失. 开发者必须使用他所能使用的工具和技巧来提高代码的质量,

Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年. 现在大部分都在用 Java 8,Java 9 和 10 目前很少有人在用,至少我没有发现有公司在生产环境应用的,那就是找死. 现在 Java 11 长期支持,也已

[转] 如何正确地写出单例模式

你真的了解单例吗? 这两天在看 <多处理器编程的艺术>    (英文版)  里面提到懒汉式单例模式编写的不严密性.由此我想梳理下单例模式这个问题到底涉及哪些细节.于是找到文章一篇: 原文地址:http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/ pdf: 这里 要点: 1. 使用 "双重检验锁"优化性能 [懒汉式] 2. 使用volatile 避免"双重检验锁&quo

如何写出高质量的JavaScript代码

优秀的Stoyan Stefanov在他的新书中(<Javascript Patterns>)介绍了很多编写高质量代码的技巧,比如避免使用全局变量,使用单一的var关键字,循环式预存长度等等. 这篇文章不仅仅从代码本身来考虑如何优化编码,也从代码的设计阶段来考虑,包括书写API文档,同事的review,使用JSLint.这些习惯都能帮助你编写更加高质量的.更易于理解的.可维护的代码(让你的代码在多年之后仍使你引以为傲). 编写可维护的代码 软件的BUG修复需要花费大量的精力.尤其当代码已经发布

让我们一起写出更有效的CSharp代码吧,少年们!

周末空闲,选读了一下一本很不错的C#语言使用的书,特此记载下便于对项目代码进行重构和优化时查看. Standing On Shoulders of Giants,附上思维导图,其中标记的颜色越深表示在实际中的实际意义越大. 名称 内容和示例 提供API时尽量提供泛型接口 Public interface IComparable<T>{ int CompareTo(T other) } 泛型约束尽可能的严格并有效 Public delegate T FactoryFunc<T>();

Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码

就在前段时间,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用! 这无疑对我们来说是一大好的消息.作为一名java开发者来说,虽然又要去学习和了解java11,但内心还是欣慰的.我想至少你和我一样的心情:Java在手,天下我有! 今天我们来看一下Java 11到底是什么.他有什么特别的.到底要不要升级到Java 11. Java 11有什么特别的 在Oracle官网中,进入下载页面,第一个可供下载的JDK版本已经提换成了Java SE 11 (LTS),

如何组织css,写出高质量的css代码

!如何组织css一:css的API 属于基础部分,这部分的能力用“对”和“错”来评判. 比如说把文字设置为红色,只能用color:red:这种写法是对的,其他任何写法都是错的. 二:css框架 不能用“对”和“错”来评判,我们会用“好”.“比较好”.“很烂”.“非常棒”这样的字眼来评判. 按功能划分:控制字体的css集中在font.css文件里. 控制颜色的css集中在coloor.css文件里. 控制布局的css集中在layout.css文件里. 按区块划分:将头部的css放在head.css

怎样写出更好的JavaScript代码

一.可维护性的代码 1.可读性:在函数和方法.大段代码.复杂算法和hack上加上帮助理解的注释.    2.变量的函数的命名:变量最好用名词,函数最好以动词开头.有较好的语义和逻辑性. 3.变量类型透明:以合适的命名方式来帮助记忆变量的类型 . a:初始化法. b:匈牙利标记法. c:在后面用注释说明. 4.松散耦合 松散耦合就是一部分的代码功能依赖于另外一部分.   a:html/javascript 解耦:html与js尽量分离,比如在html中添加事件处理,动态插入标签.解耦可以更快地知道