算法七——分治算法

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

MapReduce本质就是一个分值算法。

什么是分治算法

分治算法的核心是:分而治之。也就是将原问题分解为n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,并且合并子问题的结果得到原问题的解。

与递归的区别:递归是一种编程技巧,分治是一种算法思想。

使用分治法的步骤:
1 分解:将原问题分解为一系列子问题;
2 解决:递归地解决各个子问题,当问题足够小,可以直接求解;
3 合并:将子问题的结果合并为原问题的解。

分治算法能解决的问题的特征:
1 原问题与分解后的子问题具有相同的模式。
2 子问题可以独立求解,子问题之间没有相关性;这点与动态规划是有区别的。动态规划分解后的子问题可能是重复的,需要把结果保存下来,避免重复计算。
3 具有分解终止条件。当子问题足够小,可以直接求解。
4 子问题的解合并为原问题的解,合并操作不能太复杂,否则起不到降低复杂度的效果。

计算数组的逆序度

假设我们有n个数据,希望从小到大排序。当数组完全有序的时候,有序度为n(n−1)2\dfrac{n(n-1)}{2}2n(n1),逆序度为0。当数组是按照从大到小排序的时候,那有序度是0,无序度是n(n−1)2\dfrac{n(n-1)}{2}2n(n1)。除了这两种极端情况,我们计算数组逆序对的个数表示逆序度。

如何编程求出一组数组中逆序对的个数呢?

直观的想法就是从第0个元素开始,算一个后面有几个元素比它小,计数为k0。再从第1个元素开始,算一个后面有几个元素比它小,计数为k1…一直算到最后一个元素。这几个计数(k0,k1…)加和,就是逆序对的个数。时间复杂度是O(n^2)。是不是可以改进呢?

我们试着用分治思想解决。求数组A的逆序对个数,可以分解为前后两个部分数组分别标记为A1,A2。递归求解A1,A2逆序对个数K1,K2,再求出A1与A2之间逆序对个数K3。K1+K2+K3就是原问题的解。

当数组中只有两个元素的时候,就可以知道K1,K2的值。
如何求K3。我们可以参考归并排序的合并操作。将数组A1,A2排序。假设数组A1={1,5,6},A2={2,3,4}。A1长度为3。
合并排序:
1(来自A1数组,不用管)
1,2 (来自A2数组,此时A1数组还有3-1个元素没有排序,所以2小于A1数组中的2个元素)
1,2,3(来自A2数组,此时A1数组还有3-1个元素没有排序,所以2小于A1数组中的2个元素)
1,2,3,4(来自A2数组,此时A1数组还有3-1个元素没有排序,所以2小于A1数组中的2个元素)
1,2,3,4,5(来自A1数组,不用管)
1,2,3,4,5,6(来自A1数组,不用管)
最终:此次合并操作发现逆序对个数是2+2+2=6。
合并为原问题的解:K1+K2+6。
合并操作是一个O(n)的时间复杂度。

public class ArrayReverseCount {private int num = 0;public int count(int[] a){int n = a.length;return mergeSortCounting(a,0,n-1);}private int mergeSortCounting(int[] a, int start, int end) {if(start>=end){return 0;}int q = (start+end)/2;int k1 = mergeSortCounting(a,start,q);int k2 = mergeSortCounting(a,q+1,end);int k3 = merge(a,start,q,end);return k1+k2+k3;}private int merge(int[] a, int start, int q, int end) {int[] temp = new int[end-start+1];int i= start;int j= q+1;int k = 0;int nums = 0;while(i<=q && j<=end){if(a[j]<a[i]){temp[k++]=a[j++];nums += q-i+1;}else{temp[k++] = a[i++];}}while(i<=q){temp[k++] = a[i++];}while(j<=end){temp[k++] = a[j++];}for(i=0;i<=end-start;i++){a[start+i]= temp[i];}return nums;}
}

经典练习题目

二维平面上有 n 个点,如何快速计算出两个距离最近的点对?
有两个 nn 的矩阵 A,B,如何快速求解两个矩阵的乘积 C=AB?
自己练习

分治思想处理海量数据

前面学到的一些算法和数据结构,都是基于内存存储和单机处理的。如果要处理的数据量大,没有办法一次加载到内存中。这时候这些算法和数据结构就不能发挥作用了。但我们可以使用分治思想来处理这个问题。

例如我们需要对10G的订单按照金额排序。单机只有3G内存。那么,我们可以把这10G订单扫描一遍,找到订单金额的最小值和最大值。将这10G订单按照订单金额从小到大分成几个区间。例如1-100放入一个小文件,101-200放入另外一个文件。以此类推。这样形成的一个一个小文件可以加载到内存中。对单个文件最排序,排序之后再合并排序结果。

如果订单数据是放在GFS这样的分布式文件系统上。被分成的多个小文件可以同时被不同的机器加载处理,最后再合并结果集。这样并行处理速度就快多了。这里需要注意一点:数据存储的机器与处理的机器需要在同一个网段内或者局域网。否则数据传输速度会是最大的时间开销。反而会慢。

Mapreduce 与 分治算法

这也就是MapReduce的原理。单个机器的性能不足以完成任务,就把任务分配到多台服务器 。最后再合并结果。MapReduce是一个任务调度 框架。数据依赖GFS存储,依赖Borg管理机器。它从 GFS 中拿数据,交给 Borg 中的机器执行,并且时刻监控机器执行的进度,一旦出现机器宕机、进度卡壳等,就重新从 Borg 中调度一台机器执行。

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

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

相关文章

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第31篇]Game Hopping证明

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 关于安全证明, 目前主流的方法有安全归约证明 (由 single game 实现) 和 Game Hopping (由 game sequence 实…

第六十三期:放下你手里的代码,小心被抓!

放下你手里的代码&#xff0c;小心被抓。最近程序员圈子不乏这样的戏谑调侃。 作者&#xff1a;沈春泽、李加庆来源 放下你手里的代码&#xff0c;小心被抓。最近程序员圈子不乏这样的戏谑调侃。 图片来自 Pexels 原因是最近发生的多起涉及爬虫技术的公司被司法部门调查。近…

算法九——回溯算法

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 理解回溯 在我们的一生中&#xff0c;会遇到很多重要的岔路口。在岔路口上&#xff0c;每个选择都会影响我们今后的人生。有的人在每个岔路口都能做出最正确的选择&…

Python小数据池

一. id is 二. 代码块三. 小数据池四. 总结一&#xff0c;id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f;id是内存地址&#xff0c;那就有人问了&#xff0c;什么是内存地址呢&#xff1f; 你只要创建一个数据&#xff08;对象&#xff09;那么都会…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第32篇]基于博弈的证明和基于模拟的证明

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 在基于博弈的安全定义中&#xff0c;安全是由博弈过程定义的。博弈围绕着一些通用的原始元素展开&#xff0…

第六十四期:聊聊原子变量、锁、内存屏障那点事

突然想聊聊这个话题&#xff0c;是因为知乎上的一个问题多次出现在了我的Timeline里&#xff1a;请问&#xff0c;多个线程可以读一个变量&#xff0c;只有一个线程可以对这个变量进行写&#xff0c;到底要不要加锁?可惜的是很多高票答案语焉不详&#xff0c;甚至有所错漏。 …

数据结构九——栈

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1栈的定义 1.1 栈的定义 栈&#xff1a;后进者先出&#xff0c;先进着后出。就像一碟盘子&#xff0c;如果拿走一个盘子&#xff0c;拿走的一定是最后放上去的那个…

java 传入多个参数时报Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1,... 解决方案...

Select("SELECT id FROM ae_post ORDER BY id DESC LIMIT #{page},#{size}")List<Post> getAllForPage(Param("page") int page, Param("size")int size); dao层写入&#xff0c;解决方法如上 注&#xff1a;多参数需要添加 Param("…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第33篇]Bellcore攻击是如何攻击使用CRT的RSA的?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 转载链接:https://www.cnblogs.com/zhuowangy2k/p/12245604.html

spring学习(14):Autowired的使用场景

CompactDisc类 package soundSystem;import org.springframework.stereotype.Component;Component public class CompactDisc {public CompactDisc() {super();System.out.println("compactdisc无参构造方法");}public void play(){System.out.println("正在播…

数据结构十——队列

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 队列 队列&#xff1a;可以想象成排队买票&#xff0c;先来的人先买&#xff0c;后到的人站在队尾。先进者先出&#xff0c;这就是队列。 队列的操作&#xff1a…

[教程]博客园插入视频教程

【学习观15】人类为啥不进化成过目不忘&#xff1f;记忆力差难道不阻碍学习吗&#xff1f; 代码 <div class"video"> <iframe src"//player.bilibili.com/player.html?aid54874176&cid95969626&page1" scrolling"no" border&q…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第34篇]描述攻击离散对数问题的baby-step/Giant-step方法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 Baby-step/Giant-step是Dnaiel Shanks为解决DLP问题开发的算法。DLP问题已经是许多现代密码学的困难性基础。…

spring学习(15):required属性

CompactDisc类 package soundSystem;import org.springframework.stereotype.Component; //注解Componentpublic class CompactDisc {public CompactDisc() {super();System.out.println("compactdisc无参构造方法");}public void play(){System.out.println("…

爬虫的单线程+多任务异步协程:asyncio 3.6

单线程多任务异步协程:asyncio 3.6 事件循环 无限循环的对象.事件循环中最终需要将一些 特殊的函数(被async关键字修饰的函数) 注册在该对象中.协程 本质上是一个对象.可以把协程对象(特殊的函数)注册到事件循环中任务对象 就是对协程对象进一步的封装.绑定回调: task.add_done…

算法十——深度优先搜索和广度优先搜索

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 搜索算法 算法是作用于数据结构之上的。深度优先搜索、广度优先搜索是作用于图这种数据结构之上的。图上的搜索算法可以理解为从一个顶点到另外一个顶点。 常用的搜…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol 52][第35篇]给针对ECDLP问题的Pollard rho,parallel Pollard rho攻击的一个粗略的描述

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 [1] http://www.cs.bris.ac.uk/~nigel/Crypto_Book/book.ps (pages 208 - 214) 转载连接&#xff1a;https…

spring学习(16):使用接口

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

交易系统高并发下的幂等性设计原则

一、介绍 幂等性就是针对同一个请求&#xff0c;不管该请求被提交了多少次&#xff0c;该请求都将被视为同一个请求&#xff0c;服务端不应该将同一个请求进行多次处理&#xff0c;以确认处理逻辑的正确性&#xff0c;针对交易性系统幂等性的设计尤为重要&#xff0c;否则由于网…

工程中选择数据结构和算法的依据

1. 时间、空间复杂度不能和性能划等号 时间、空间复杂度不是时间执行和内存消耗的精确值。它们只是表示了随着数据量的增长&#xff0c;时间、空间的增长趋势。 代码的执行时间有时不跟时间复杂度成正比。我们常说算法是O(nlogn),O(n2n^2n2)这些都是基于大数据量&#xff08;…