大数据启蒙-分治思想

456 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

分治思想

分治思想就是把复杂问题、拆分成若干个相同的小问题,然后将问题逐步解决掉,合并到一起的过程,就是分治思想。简单来说,分治思想就是“分而治之”,将复杂问题拆分成若干个相同的小问题进行解决。

分治思想的基本概念

  1. 将原问题划分成或归结成规模较小的子问题
  2. 递归或者迭代求解子问题
  3. 将子问题综合得到原问题的解

举个例子

我们先来思考几个问题:

  • 有一万个元素(假设是连续数字)需要如何储存?
  • 如果查找一个元素,最简单的遍历复杂度是多少?
  • 如果期望的复杂度是O(4)呢?

储存10000个元素可以用数组储存。

查找一个元素可以使用二分法查找,时间复杂度为O(log n)

如果我们期望复杂度是O(4)要怎么做呢?

我们可以反着想,复杂度是O(4),那就只要查找四次就要找到这个数,那我们可以建一个大小为4的数组,10000个数分成2500组,每组4个数,这样我们只要确定要查找的数在哪个组里面就可以了。

image-20221210224100954.png

开发中经常用到取模(也叫取余)运算,使用“ % “表示取模运算。一个数取模3,那只有0、1、2三种情况,那我们就可以用10000个元素取模2500的值确定元素所在的分组是哪个。然后我们在从分组里面的4个值去查找就可以找到想要的元素了,这时候的复杂度就是O(4)。

如果存到元素不是数值就可以使用该元素的hashCode去取模确定元素所在分组。

image-20221210223529947.png

这其实就是hashtable的数据结构设计。

当然,这边只是举例10000个连续数字,实际情况并没有这么理想,可能某一个数组会有很多个元素。这个例子只是为了引出分治思想。

分治思想的应用

分治思想有很多成功的实际案例,比如说

  • Redis集群
  • ElasticSearch
  • Hbase
  • HADOOP

THE END.