【数据结构与算法】【算法思想】分治算法
贪心算法
回溯算法
分治算法
动态规划
MapReduce本质就是分治算法,是Google大数据处理的三驾马车之一,另外两个是GFS和Bigtable。它在倒排索引,PageRank计算,网页分析等搜索引擎相关的技术中都有大量的应用。
MapReduce 框架只是一个任务调度器,底层依赖 GFS 来存储数据,依赖 Borg 管理机器。它从 GFS 中拿数据,交给 Borg 中的机器执行,并且时刻监控机器执行的进度,一旦出现机器宕机、进度卡壳等,就重新从 Borg 中调度一台机器执行。
一:如何理解分治算法
1,分治算法的核心思想其实就是四个字,分而治之,将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后在合并其结果,就得到原问题的解。
2,分治算法的定义类似于递归,但区别在于:分治算法是一种处理问题的思想,递归是一种编程技巧。
3,分治算法一般都比较适合递归来实现,分治算法的递归实现中,每一层递归都会涉及这样的三个操作:
分解:将原问题分解成一系列子问题;
解决:递归地求解各个子问题,若子问题足够小,则直接求解;
合并:将子问题的结果合并成原问题;
4,分治算法能解决的问题,一般需要满足下面这几个条件:
原问题与分解成的小问题具有相同的模式;
原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别,
具有分解终止条件,即当问题足够小时,可以直接求解。
可以将子问题合并成原问题,而这个操作的复杂度不能太高,否则就起不到减小算法总体复杂度的效果。
二:分治算法应用举例分析
假设有n个数据,期望数据从小到大排序,那完全有序的数据的有序度就是n(n-1)/2。逆序度等于0;相反,倒序排序的数据的有序度就是0,逆序度是n(n-1)/2。除了这两中极端情况外,我们通过计算有序对或逆序对的个数,来表示数据的有序度或逆序度。
现在问:如何编程求出数组中的数据有序对个数或逆序对个数?
1,最简单的办法:拿每个数字和他后面的数字比较,看有几个比它小。将比它小的数字个数记作k,通过这样的方式,把每个数字都考察一遍后,对每个数字对应的k值求和,最后得到的总和就是逆序对个数。但时间复杂度是O(n^2)。
2,用分治算法,套用分治的思想,将书中分成前后两半A1和A2,分别两者中的逆序对数,然后在计算A1和A2之间的逆序对个数k3。那整个数组的逆序对个数就是k1+k2+k3。
要快速计算出两个子问题A1和A2之间的逆序对个数需要借助归并排序算法。
归并排序算法有个非常关键的操作,即将两个有序的小数组,合并成一个有序的数组。实际上,在合并的过程中,就可以计算这两个小数组的逆序对个数。每次合并操作,都计算逆序对个数,把这些计算出来的逆序对个数求和,就是这个数组的逆序对个数。
private int num = 0; // 全局变量或者成员变量public int count(int[] a, int n) {num = 0;mergeSortCounting(a, 0, n-1);return num;
}private void mergeSortCounting(int[] a, int p, int r) {if (p >= r) return;int q = (p+r)/2;mergeSortCounting(a, p, q);mergeSortCounting(a, q+1, r);merge(a, p, q, r);
}private void merge(int[] a, int p, int q, int r) {int i = p, j = q+1, k = 0;int[] tmp = new int[r-p+1];while (i<=q && j<=r) {if (a[i] <= a[j]) {tmp[k++] = a[i++];} else {num += (q-i+1); // 统计p-q之间,比a[j]大的元素个数 !!!! 统计tmp[k++] = a[j++];}}while (i <= q) { // 处理剩下的tmp[k++] = a[i++];}while (j <= r) { // 处理剩下的tmp[k++] = a[j++];}for (i = 0; i <= r-p; ++i) { // 从tmp拷贝回aa[p+i] = tmp[i];}
}
三:分治思想在海量数据处理中的应用
假设,给10GB的订单文件按照金额排序这样一个需求,看似是一个简单的排序问题,但是因为数据量大,有10GB,而我们的机器的内存可能只有2,3GB这样子,无法一次性加载到内存,也就无法通过单纯地使用快排,归并等基础算法来解决。
要解决这种数据量大到内装不下的问题,我们就可以利用分治的思想,将海量的数据集合根据某种方法,划分为几个小的数据集合,每个小的数据集合单独加载到内存来解决,然后在将小数据集合合并成大数据集合,实际上利用这种分治的处理思路,不仅能克服内存的限制,还能利用多线程或者多机处理,加快处理的速度。
采用分治思想的算法:快排、合并排序、桶排、基数排序、二分查找、递归树、数据库分片、MapReduce
创新的源泉来自对事物本质的认识,无数优秀架构设计的思想来源都是基础的数据结构和算法。
笔记整理来源: 王争 数据结构与算法之美
【数据结构与算法】【算法思想】分治算法相关推荐
- 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)
本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...
- 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...
在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...
- 程序员都会的五大算法之一(分治算法),恶补恶补恶补!!!
前言 点击查看算法介绍 五大算法 分治算法 动态规划 贪心算法 回溯算法 分支限界算法 WX搜素"Java长征记"对这些算法也有详细介绍. 分治算法 一.算法概述 简单来说,分治算 ...
- 算法导论系列:分治算法
说起分治法,大家一定也都听过秦始皇采用郡县制将国家分为三十六郡的故事,我们常说"山高皇帝远",意思就是山高路远,皇帝都管不了,实际上无论皇帝多远,山有多高,整个国家都属于朝廷统治, ...
- C语言分治算法求中位数,【算法复习】分治算法
Outline 分治思想和递归表达式 大整数乘法 矩阵乘法的Strassen算法 快速傅里叶变化 基于分治的排序 merge-sort排序 快速排序 排序的下界问题 中位数和顺序统计量 最邻近点对 凸 ...
- 五大常用算法之一:分治算法
分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...
- 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc
分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...
- c语言分治算法之归并排序,分治算法之归并排序
分治算法: 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同.求出子问题的解后进行合并,就可得到原问题的解. 一般步骤: 1.分解,将要解决的问题划分成若干规模较小 ...
- 【算法概论】分治算法:k路归并
首先了解两个概念,胜者树和败者树: 胜者树和败者树都是二叉排序树,是树形选择排序的一种变形.每个叶子节点相当于一位选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛.胜者树的中间结点记录的是胜者的 ...
- 神经元网络算法的思想,神经网络算法应用案例
神经网络算法原理 一共有四种算法及原理,如下所示:1.自适应谐振理论(ART)网络自适应谐振理论(ART)网络具有不同的方案.一个ART-1网络含有两层一个输入层和一个输出层. 这两层完全互连,该连接 ...
最新文章
- stack UVA 442 Matrix Chain Multiplication
- phpStudy mysql升级至5.7
- python 小例子 源码 莫凡_100 个 Python 小例子(一)
- HashMap源码学习
- Mockito框架实现学习之when(dummy)
- HATEOAS的RESTful服务。 记录超媒体API
- [css][移动设备]禁止横竖屏时内容自动调整
- object detection训练自己数据
- U2Net基于ModelArts Notbook的仿真实验
- 10 亿元赌约“揭盅”!董明珠与雷军这五年变得更像对方了
- matlab报童模型推导,报童模型推导
- 手机html己停用怎么办,iphone手机出现已停用请五分钟再试怎么办
- 打印所有的水仙花数---初学c语言
- 手把手教你用深度学习做物体检测(四):模型使用
- 复制粘贴-实现动态爱心 网页版
- Pandas学习(二)—— Pandas基础
- 电脑文件定时备份到U盘
- R语言绘制QQ图实战(qqplot函数、qqnorm函数、qqline函数)
- 自动控制理论(6)——高阶系统的时域分析及线性系统的稳定性分析
- sqlplus的简单使用和常用命令
热门文章
- vue2 watch引用类型 失败原因
- 做最好的自己——读书笔记
- poj 1715 Hexadecimal Numbers 排列组合
- 借口很多呀嘛接口也很多呀嘛态也很多
- media recovery oracle,Oracle非归档模式Media Recovery错误之--ORA-26040
- springcloud gateway 源码解析、请求响应流程、第三方响应结果在 gateway 的经过
- Python爬虫自学之第(④)篇——强大的正则表达式,re模块
- 查看Chome浏览器中已保存的密码
- oracle数据库安装过程中出现主目录不兼容的问题
- jquery ajax json转换出错Invalid JSON