分治法——“分而治之”

众所周知,计算机计算速度非常快而被人们加以使用,但计算速度再快的计算机,处理数据的能力也有一定限度,所以在处理大数据操作的时候,采用分治法可以有效的处理目前人类社会所遇到的大部分大数据问题。

分治法的主要思想就是将一个复杂的问题分成两个或多个相同的子问题,子问题可以分成更小的子问题,直到子问题可以容易解决的时候,原问题的解就是子问题解的和。

下面我们举一个例子,我们先解决一个简单的问题

例1   取任意一组从0~10的数,找出其中出现次数最多的数。

例如我们取一组数{1,2,3,5,6,8,7,4,5,2,1,5,4,8,9,6,3,2,1,2};只需输出其中出现次数最多的数即可。

这道问题不难解决,方法也很多,可以先将数据排序,然后找一样的个数,可是就算用快排,我们的时间复杂度也还是很大,在这么我们注意问题给的条件:一组0~10的数,没错,我们数据的选择范围是0~10,所以我们可以通过一个十个格子(0~9)大小的数组,来保存每个数字出现的次数,最后遍历比较一遍,将数组中最大的数的下标(即出现次数最多的数)返回即可。

如上图所示,我们把需要测试的数据保存到第一个数组中,第二个则保存出现的次数,最后遍历比较一遍即可(时间复杂度是O(m+n));

代码就不写了,过程比较简单,我们用这个题引入下一个题:

例2   还是取一组0~10的数,区别是,我们这次规定重新创建的数组只能用五个格子(4*5=20个字节)的数组,那么这个问题该如何解决呢?

其实仔细想想就能想到,只让用五个格子大小的数组,那我们用两次不就好了,一次保存前五位(0~4),一次保存后五位(5~9)的个数,最后分别遍历,取出最大数的下标,结果和时间复杂度是一样的。

有个小细节,我们可以将前五位保存和后五位保存换成奇数保存和偶数保存,这样保存遍历小数据看不出差异,做大数据处理的时候就能发现其好处了。

下面是代码:

#include <stdio.h>
#include <string.h>typedef struct Pair
{int num;int times;
}Pair;Pair MaxTimes2(int *arr,int len)
{int brr[5] = {0};int i;for(i = 0;i < len ;i++){if(arr[i] % 2 == 0){brr[arr[i]/2]++;}}Pair tmp={0,0};for(i = 0;i < 5;i++){if(tmp.times  < brr[i]){tmp.times = brr[i];tmp.num =i*2;}}memset(brr,0,sizeof(brr));for(i = 0;i < len;i++){if(arr[i]%2 == 1)//1,3,5,7,9->0,1,2,3,4{brr[arr[i]/2]++;}}Pair temp = {0,0};for( i = 0; i < 10;i+=5){if(temp.times <brr[i]){temp.times = brr[i];temp.num =i*2+1;}}if(tmp.times > temp.times){return tmp;}else{return temp;}
}int main()
{int arr[] = {1,3,5,5,8,9,8,5,8,6,3,3,1,2,3,6,4,8,1,2};printf("出现次数最多的数是:%d,出现次数%d\n",MaxTimes2(arr,sizeof(arr)/sizeof(arr[0])).num,MaxTimes2(arr,sizeof(arr)/sizeof(arr[0])).times);return 0;
}

其实小数据的处理就是这样,以小见大,就是大数据的处理,例如我们做如下的题目

是不是思想和上面的例2很像呢?没错,这就是分治法处理大数据的主要思想,如果有兴趣的话,可以试着处理一下这个大数据的题目~我们一起交流结果。

大数据处理基本思想——分治法相关推荐

  1. PYTHON:大整数乘法(分治法)

    何为分治法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标完成程序算法,简单问题可用二分法 ...

  2. C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。

    )输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...

  3. 大整数乘法(分治法)

    大整数乘法(分治法) 题目描述:设X和Y都是n位的十进制整数,计算它们的乘积X*Y. 如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果,时间复杂度为O(n2); 因此我们 ...

  4. 程序员的算法课(13)-分治法

    一.什么是分治 [百度百科]分治法((Divide and Conquer))可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后 ...

  5. 【算法设计与分析】-- 分治法

    1.分治法的基本思想 分治法的基本思想是将一个规模为n的问题分解为k个规模为较小的子问题,这些子问题互相独立且与原问题相同,递归地求解这些子问题,然后利用子问题的解合并出原问题的解. 2.分治算法的设 ...

  6. 算法原理:大数据处理的分治思想!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:周彬莲,东北石油大学,Datawhale优秀学习者 引言 MapR ...

  7. 分治法的关键特征_经典算法思想2——分治(Divide-and-Conquer)

    分治法,字面意思是"分而治之",就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这 ...

  8. 大整数相乘 + 分治法(JS)

    使用分治法来实现大整数相乘 相乘的基本原理 如: 1234 * 567 第一步:分解234 -> 12 和 34;567 -> 5 和 67; 第二步:分别计算 首部: 12*5=60中部 ...

  9. 分治法的经典问题——大整数相乘

    分治法的经典问题--大整数相乘 分治法的原理 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标 ...

最新文章

  1. 通过评估假设行为来学习人类目标
  2. php artisan常用方法
  3. 近世代数--极大理想--I是R的极大理想↔R/I是域
  4. 初学Java-循环输入直到文件结束
  5. 解决tfs工作区绑定问题
  6. 钉钉密聊安不安全 钉钉密聊别人能看到吗
  7. 通过脚本生成Zabbix Screen报错Incorrect value for field vsize
  8. 高阶函数 / abs方法
  9. redis 字符串基本操作
  10. Windows Server 2008群集仲裁机制
  11. 开题报告:基于java的电子商务购物网站系统 毕业设计论文开题报告模板
  12. 西数云存储 重置 使用手册_如何重置IE浏览器(以IE8 为例),并添加信任网址...
  13. 从零开始的VUE项目-09(vue-alipayer-v视频播放)
  14. 百度竞价每天如何优化
  15. ubuntu系统上进行usb相机端口绑定
  16. 制作mac系统引导盘
  17. European software vendors ranking 2012 (zz)
  18. leet 75. 颜色分类
  19. python简易搭建环境_在Windows上搭建Python2.7环境
  20. 读美妆论文AN AUTOMATIC FRAMEWORK FOR EXAMPLE-BASED VIRTUAL MAKEUP

热门文章

  1. 如何实现3台计算机网络传递文件,两台电脑如何实现对拷,三种办法轻松搞定!...
  2. Java word转pdf Linux/windows跨平台 格式完美(利用命令行调用libreoffice)
  3. 启用计算机的无线同屏,Windows10如何使用无线同屏功能?
  4. 网络安全面试题整理 - 甲方类(一)
  5. Vivo手机安装谷歌Play商店,安装服务框架谷歌Google,支持X90,X80,X70,X60,s系列,IQOO
  6. 在Python中进行加减乘除
  7. 项目过程管理(十八)集体加班制度
  8. c语言 不用锁存器 数码管倒计时,倒计时器课程设计.doc
  9. 最新kali linux下完美安装和运行QQ的方法
  10. 微信群舆情怎么监测?