递归(下)

  • 前言
  • 归并排序中的分治思想
  • 分布式系统中的分治思想
    • 1.数据分割和映射
    • 2.归约
    • 3.合并
  • 总结

前言

在上一篇中,我介绍了如何使用递归,来处理迭代法中比较复杂的数值计算。但是我们知道,有些迭代法并不是简单的数值计算,而是要通过迭代的过程进行一定的操作,过程更加复杂,需要考虑很多中间数据的分配或者保存。比如我在迭代法中提到的使用二分查找进行数据匹配,或者这篇文章里将要讲解的归并排序中的数据排序等等。在这种情况下,要怎么使用递归法呢?

【程序员必修数学课】->基础思想篇->迭代法

【程序员必修数学课】->基础思想篇->递归(上)->泛化数学归纳

我们可以先分析一下这些复杂的问题是否可以简化成更小的、更简单的子问题来解决,这是一般思路。如果可以,那就意味着我们可以使用递归的核心思想,将复杂的问题逐步简化成最基本的情况来求解。在这篇文章里,我将从归并排序开始,延伸到多台机器的并行处理,详细介绍递归思想在“分而治之”这个领域的应用。

归并排序中的分治思想

首先,我们先考虑如何使用递归编程解决数字的排序问题。

对一堆杂乱无序的数字,按照从小到大或者从大到小的规则进行排序,这是计算机领域非常经典,也非常流行的问题。小到Excel电子表格,大到搜索引擎,都需要对一堆数字进行排序。因此,计算机领域的前辈们研究排序问题已经很多年了,也提出了许多优秀的算法,比如归并排序、快速排序、堆排序等等。其中,归并排序和快速排序都很好地体现了分治的思想,这篇文章主要就说一说归并排序(merge sort)

很显然,归并排序算法的核心就是“归并”,也就是把两个有序的数列合并起来,形成一个更大的有序数列。

假设我们需要按照从小到大的顺序,合并两个有序数列 A 和 B。我们需要开辟一个新的存储空间 C,用于保存合并后的结果。

我们首先比较两个数列的第一个数,如果 A 数列的第一个数小于 B 数列的第一个数,那么就先取出 A 数列的第一个数放入 C,并把这个数从 A 数列中删除。如果是 B 的第一个数更小,那么就先取出 B 数列的第一个数放入 C,并把它从 B 数列里删除。

以此类推,直到 A 和 B 里所有的数据都被取出来放入 C。如果到某一步, A 或 B 数列为空,那直接将另一个数列的数据依次取出放入 C 就可以了。这种操作,可以保证两个有序的数列 A 和 B 合并到 C 之后,C 数列仍然是有序的。

比如说合并有序数组 {6, 11, 13, 17} 和 {8, 10, 16}的过程

【程序员必修数学课】->基础思想篇->递归(下)->分而治之从归并排序到MapReduce相关推荐

  1. 【程序员必修数学课】-基础思想篇-二进制-原码反码补码的数学论证

    二进制计数法&原码&反码&补码 Ⅰ 前言 Ⅱ 二进制计数法 A. 什么是二进制计数法? B. 为什么要使用二进制? C. 二进制的位运算 D. 符号位 E. 溢出 Ⅲ 原码&a ...

  2. 【程序员必修数学课】-基础思想篇-数学归纳法-如何用数学归纳提高代码效率

    上一篇文章里,我说了数学中的迭代法,并用编程实现了国际象棋发明者的那个麦粒的计算问题,这篇文章我们就来看看数学归纳法.通过数学归纳法,我们能直接从理论上证明某个结论,从而避免很多计算,节约大量的计算资 ...

  3. 聊聊后端程序员的知识体系-第一篇

    聊聊后端程序员的知识体系-第一篇 原文链接:https://www.fpthinker.com/backend_knowledge_architecture/knowledge.htmll 亲爱的读者 ...

  4. 程序员转正述职报告_程序员转正工作总结(4篇),转正工作总结

    1.程序员转正工作总结 来公司担任程序员一职已_个月时间,在这_个月时间里,我学到了很多东西.每个人都是在不断的总结中成长,在不断的审视中完善自己.在这_个月里自己也是在总结.审视中脚踏实地地完成好本 ...

  5. 程序员必修内功,收集了上千本各类编程书籍【免费获取】

    程序员必修内功,收集了上千本各类编程书籍,C,C++,Java,Python,机器学习,深度学习,Linux等等,还收集了很多英文原版书籍,看不惯中文的也可以选择英文哦.这些书籍都是我经过平时的积累, ...

  6. 程序员转正述职报告_2020程序员转正工作总结5篇精选范文

    [仅供学习参考,切勿通篇使用!] 2020程序员转正工作总结5篇精选范文 程序员是从事程序开发.程序维护的专业人员.一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚.那么程序员转正 ...

  7. 程序员职业规划哲理思想

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员职 ...

  8. 每个程序员都必读的10篇文章

    作为一名Java程序员和软件开发人员,那些每个程序员都应该知道的XXX的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到.在我学习的过程中我读到过许多非常 ...

  9. 每个程序员都必读的12篇文章

    作为一名Java程序员和软件开发人员,那些每个程序员都应该知道的XXX的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到. 在我学习的过程中我读到过许多非 ...

最新文章

  1. 20165302第八周总结
  2. maven 编译mybatis项目时xml文件无法编译到target目录下的解决方法
  3. C#LeetCode刷题之#766-托普利茨矩阵(Toeplitz Matrix)
  4. *1LL在c++中的意义
  5. 币圈名利场,一场赤裸裸的狼人杀
  6. vs 生成get set_使用EasyCode+Lombok快速生成增删查改的代码
  7. 倒计时 妙味课堂_妙味课堂javascript视频教程
  8. Tomcat 7.0.94 安装与配置
  9. OBLOG4.0+DVBBS7.10 SP1整合
  10. 欧几里德结构数据(Euclidean Structure Data) 以及非欧几里德结构数据(Non-Euclidean Structure Data)
  11. Android USB Tethering的实现以及代码流程
  12. 服务器安装操作系统失败,安装程序配置服务器失败怎么办
  13. 3.1 数据报表之Excel操作模块 XlsxWriter
  14. 我也能做CTO之程序员职业规划 之六 灵商
  15. 除铜树脂CH-90NA、电镀废水回收铜工艺
  16. leetcode-136-只出现一次的数字(java|python)
  17. 近期想跳槽的程序员必看!2021最新京东Java面试题目
  18. 1篇文章带你了解poco的所有基本功能(含演示demo)
  19. 国内优秀开源框架Guns框架入门学习
  20. subtext3插件安装

热门文章

  1. VS2013生成DLL文件
  2. 题目---汉诺塔及AI代码及八皇后
  3. [转]在使用扫描仪扫描文字时,分辨率在多少dpi时扫描效果最好?
  4. VB实现向窗口发送按键消息
  5. 谷歌浏览器 刚打开为什么不是设置的主页
  6. ps暂存盘已满的解决办法
  7. library not found for IPods/xxxx库 解决办法
  8. sip篇——sip协议是什么?
  9. 华为od统一考试B卷【阿里巴巴找黄金宝箱(II)】Python 实现
  10. 视频语音翻译文字的软件有哪些?