五分钟学算法之「分治算法」三步走

主要思想

分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简单地直接求解,最后将子问题的解合并为原问题的解。归并排序就是一个典型的分治算法。

在这篇文章中我们将先介绍分治算法的「三步走套路」,然后通过经典的归并排序算法体验一番分治算法的核心,最后再通过真题演练一试身手!

三步走

和把大象塞进冰箱一样,分治算法只要遵循三个步骤即可:分解 -> 解决 -> 合并。

  1. 分解:分解原问题为结构相同的子问题(即寻找子问题)
  2. 解决:当分解到容易求解的边界后,进行递归求解
  3. 合并:将子问题的解合并成原问题的解

​ 分治算法三步走

这么一说似乎还是有点抽象?那我们通过经典的排序算法归并排序来体验一下分治算法的核心思想。

归并排序

思想

归并排序的思想是:欲使序列有序,必先使其子序列有序。即先使得每个子序列有序,然后再将子序列合并成有序的列表。

因此,在归并排序中的子问题就是:使子序列有序。

三步走

既然已经找到了问题的子问题,是时候套用我们上述的三步走方法了。归并排序的「三步走」如下:

  1. 分解:将序列划分为两部分
  2. 解决:递归地分别对两个子序列进行归并排序
  3. 合并:合并排序后的两个子序列

举例

来看一个具体的例子。

现在有一个待排序的序列:

10, 4, 6, 3, 8, 2, 5, 7

先对序列进行分解,把该序列一分为二,直到无法拆分为止。整个拆分过程如下:

​ 序列分解

然后对分解出的序列进行两两排序与合并:

10, 4 排序合并后:4, 10
6, 3 排序合并后:3, 6
8, 2 排序合并后:2, 8
5, 7 排序合并后:5, 7
……

整个归并排序完整过程如下:

​ 上部分为「分解」,下部分为「解决」与「合并」

实现

def merge_sort(lst):# 从递归中返回长度为1的序列if len(lst) <= 1:return lst          middle = len(lst) / 2# 1.分解:通过不断递归,将原始序列拆分成 n 个小序列left = merge_sort(lst[:middle])     right = merge_sort(lst[middle:])# 进行排序与合并return merge(left, right)def merge(left, right):i, j = 0, 0result = []# 2.解决:比较传入的两个子序列,对两个子序列进行排序while i < len(left) and j < len(right):  if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1# 3.合并:将排好序的子序列合并result.extend(left[i:])         result.extend(right[j:])return result

分析问题之三步走方法相关推荐

  1. 产品体验分析之7步走(附PPT)

    我最近一直在做新产品的策划,方案一个又一个的被毙掉,方向一次又一次的调整,PPT一遍又一遍的改,交互一稿又一稿的画,所以我还在继续努力中,也深深的感受到产品「从0到1」的不容易.产品经理在日常生活中将 ...

  2. 搞定面试算法系列 | 分治算法三步走

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...

  3. 大学生职业规划:自我分析七步走

    大学生职业规划:自我分析七步走 对于今年的大学毕业生来说,"这个冬天有点冷",在这样的一个社会环境下,大学生更应尽早做好职业生涯规划,认清自我,并不断探索开发自身潜能的有效途径或方 ...

  4. JS(Javascript)调用Android原生方法三步走

    三步走: 1.webview 一定要设置这三个方法 webSetting.setJavaScriptEnabled(true); webSetting.setJavaScriptCanOpenWind ...

  5. Smartbi“三步走”构建智慧经营分析平台,实现国有企业监管报送和数智化转型

    01. 现状与痛点 - 一直以来,国资国企都是促进我国经济高速发展的领头羊,但近年来受疫情冲击和国际经济下行影响,国资企业经营面临较大压力,同时为实现国有企业高质量发展,国务院国资委下发一系列政策要求 ...

  6. 企业自助分析难以推动?我用这套四步走方案解决了这个难题

    最近构建自助分析方案被越来越多的企业纳入到了企业数字化建设的战略规划中,但很多企业在推动自助分析方案的时候都遇到了屏障,比如IT不愿意放权,业务又受传统思维限制,认为这应该是IT的工作,导致企业的自助 ...

  7. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

  8. 软件需求分析--三步走

    软件项目如何进行需求分析,要解决这个问题,我们要分三步走 第一步:通过什么方式去了解需求 了解需求的方式有好几种: (1)直接与客户交谈.如果分析人员生有足球评论员的那张"大嘴", ...

  9. 上云七步走,助力垂直电商降本增效

    甩开技术包袱,做出业务特色,越发成为垂直电商的生存之道 今天,人们通过天猫.淘宝.苏宁进行网络购物,不仅方便,而且快乐,通过盒马.饿了么享受更加快捷的本地生活服务,与此同时,家电.食品等垂直领域的电商 ...

最新文章

  1. Java程序员【资源大全】
  2. 团队-象棋游戏-模块开发过程
  3. HTML5 速查列表
  4. Java笔记(基础第二篇)
  5. [转] dpkg-deb命令
  6. 6-3 递增的整数序列链表的插入 (10 分)
  7. oracle定位数据库读写高,oracle数据库CPU过高问题定位、分析(三)
  8. mysql不记录binlog_MySQL不同的binlog_format会导致哪些SQL不会被记录
  9. 基于统计的压缩算法:游程编码
  10. openwrt udp服务器_开启tftp服务器 tftp服务器的含义
  11. python 读取文件夹下文件,将文件名作为制作标签,训练样本
  12. ERP/WMS仓库管理系统库存商品成本计算
  13. java编写数独_简单实现java数独游戏
  14. GBase 8c技术特点
  15. Dbeaver Phoenix 各种报错
  16. 企业网站用什么服务器操作系统?
  17. 计算机软件ghb,GHB 文件扩展名: 它是什么以及如何打开它?
  18. 百万调音师—音频基础知识
  19. Idea创建一个java项目
  20. css——三角形的实现

热门文章

  1. ESP32 快速入门(九):自定义 ESP32 分区表 partitions.csv
  2. 6年拉力工作经验,学了阿里P8级架构师的7+1+1落地项目,跳槽阿里年薪直接40W+
  3. 触角云开发的微信商城系统
  4. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛B合约数
  5. 服务器不正常断电关机导致sqlserver被标记为“可疑”
  6. 研发的首要目的是什么——一个容易被忽略的问题
  7. NBIS单细胞教程:差异基因(五)
  8. js统计英语单词的个数
  9. 从2023年31省级政府工作报告看数据安全赛道 | 附下载
  10. 固态硬盘开卡维修教程,MAP1202、IG5236、SM2259XT2等主控均适用