【程序员必修数学课】->基础思想篇->递归(下)->分而治之从归并排序到MapReduce
递归(下)
- 前言
- 归并排序中的分治思想
- 分布式系统中的分治思想
- 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相关推荐
- 【程序员必修数学课】-基础思想篇-二进制-原码反码补码的数学论证
二进制计数法&原码&反码&补码 Ⅰ 前言 Ⅱ 二进制计数法 A. 什么是二进制计数法? B. 为什么要使用二进制? C. 二进制的位运算 D. 符号位 E. 溢出 Ⅲ 原码&a ...
- 【程序员必修数学课】-基础思想篇-数学归纳法-如何用数学归纳提高代码效率
上一篇文章里,我说了数学中的迭代法,并用编程实现了国际象棋发明者的那个麦粒的计算问题,这篇文章我们就来看看数学归纳法.通过数学归纳法,我们能直接从理论上证明某个结论,从而避免很多计算,节约大量的计算资 ...
- 聊聊后端程序员的知识体系-第一篇
聊聊后端程序员的知识体系-第一篇 原文链接:https://www.fpthinker.com/backend_knowledge_architecture/knowledge.htmll 亲爱的读者 ...
- 程序员转正述职报告_程序员转正工作总结(4篇),转正工作总结
1.程序员转正工作总结 来公司担任程序员一职已_个月时间,在这_个月时间里,我学到了很多东西.每个人都是在不断的总结中成长,在不断的审视中完善自己.在这_个月里自己也是在总结.审视中脚踏实地地完成好本 ...
- 程序员必修内功,收集了上千本各类编程书籍【免费获取】
程序员必修内功,收集了上千本各类编程书籍,C,C++,Java,Python,机器学习,深度学习,Linux等等,还收集了很多英文原版书籍,看不惯中文的也可以选择英文哦.这些书籍都是我经过平时的积累, ...
- 程序员转正述职报告_2020程序员转正工作总结5篇精选范文
[仅供学习参考,切勿通篇使用!] 2020程序员转正工作总结5篇精选范文 程序员是从事程序开发.程序维护的专业人员.一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚.那么程序员转正 ...
- 程序员职业规划哲理思想
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员职 ...
- 每个程序员都必读的10篇文章
作为一名Java程序员和软件开发人员,那些每个程序员都应该知道的XXX的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到.在我学习的过程中我读到过许多非常 ...
- 每个程序员都必读的12篇文章
作为一名Java程序员和软件开发人员,那些每个程序员都应该知道的XXX的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到. 在我学习的过程中我读到过许多非 ...
最新文章
- 20165302第八周总结
- maven 编译mybatis项目时xml文件无法编译到target目录下的解决方法
- C#LeetCode刷题之#766-托普利茨矩阵(Toeplitz Matrix)
- *1LL在c++中的意义
- 币圈名利场,一场赤裸裸的狼人杀
- vs 生成get set_使用EasyCode+Lombok快速生成增删查改的代码
- 倒计时 妙味课堂_妙味课堂javascript视频教程
- Tomcat 7.0.94 安装与配置
- OBLOG4.0+DVBBS7.10 SP1整合
- 欧几里德结构数据(Euclidean Structure Data) 以及非欧几里德结构数据(Non-Euclidean Structure Data)
- Android USB Tethering的实现以及代码流程
- 服务器安装操作系统失败,安装程序配置服务器失败怎么办
- 3.1 数据报表之Excel操作模块 XlsxWriter
- 我也能做CTO之程序员职业规划 之六 灵商
- 除铜树脂CH-90NA、电镀废水回收铜工艺
- leetcode-136-只出现一次的数字(java|python)
- 近期想跳槽的程序员必看!2021最新京东Java面试题目
- 1篇文章带你了解poco的所有基本功能(含演示demo)
- 国内优秀开源框架Guns框架入门学习
- subtext3插件安装