分治法基础

分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解、最终合并结果,分治法用伪代码表示如下:

function f(input x size n)
    if(n < k)
        solve x directly and return
    else
        divide x into a subproblems of size n/b
        call f recursively to solve each subproblem
Combine the results of all sub-problems            

分治法简单而言分三步 Divide、Conquer、Combine,图示如下:

和动态规划、贪心等一样,分治法是一种算法思想,不是用于解决专门某类问题的方法。折半查找(Binary Search)、快速排序/快速选择/归并排序、二叉树处理等都包含了分治法的思想。

关于折半查找、快速排序/归并排序,详见:

算法与数据结构基础 - 折半查找(Binary Search)

算法与数据结构基础 - 排序(Sort)

相关LeetCode题:

169. Majority Element  题解

53. Maximum Subarray  题解

215. Kth Largest Element in an Array  题解

426. Convert Binary Search Tree to Sorted Doubly Linked List  题解

240. Search a 2D Matrix II  题解

218. The Skyline Problem  题解

4. Median of Two Sorted Arrays  题解

缓存过程结果(Memoization)

一些场景下我们会遇到相同的子问题,这时可以用哈希表等结构缓存子问题的结果,当再次遇到相同子问题时、直接返回结果即可。

相关LeetCode题:

241. Different Ways to Add Parentheses  题解

312. Burst Balloons  题解

时间复杂度

分治法中常用到递归,因而其时间复杂度并不直观,关于分治法时间复杂度计算,详见:

Advanced master theorem for divide and conquer recurrences

算法与数据结构基础 - 分治法(Divide and Conquer)的更多相关文章

  1. 分治法 - Divide and Conquer

    在计算机科学中,分治法是一种很重要的算法.分治法即『分而治之』,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的 ...

  2. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  3. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  4. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  5. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...

  6. 算法与数据结构基础 - 链表(Linked List)

    链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...

  7. 算法与数据结构基础 - 队列(Queue)

    队列基础 队列具有“先进先出”的特点,用这个特点我们可以用它来处理时间序列相关或先后次序相关的问题,例如 LeetCode题目 933. Number of Recent Calls,时间复杂度O(1 ...

  8. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

  9. 九章算法系列(#3 Binary Tree &amp; Divide Conquer)-课堂笔记

    前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...

  10. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

随机推荐

  1. Unity Shaders and Effets Cookbook

    Unity Shaders and Effects Cookbook 最近在读 <Unity Shaders and Effects Cookbook> 中文名称:<Unity 着色 ...

  2. 二分查找算法(JAVA)

    1.二分查找又称折半查找,它是一种效率较高的查找方法. 2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位 ...

  3. 使用golang 开发的 andriod应用

    最近在捣鼓一个东东,就是使用golang开发andriod应用.说起来简单操作起来还挺麻烦,中间又学习了很多东西.比如ubuntu,docker,angular,ionic,jquery mobile ...

  4. C#调用java程序

    前言: 最近跟项目组的人合作一个项目,由于之前我用的是java写的一个与android通信的程序,现在另一个同事来编写界面程序,由于C#编写起来比较方便,而我又不想重新写之前java的那段代码,于是需 ...

  5. python参考手册--第3章类型和对象

    1.对象的身份.类型.值 (1)身份:对象在内存中位置的指针,地址值, >>> a = [1,2,3,4,5] >>> id(a)48497328 >> ...

  6. 检查Linux Bash安全漏洞以及各环境修复解决方法

    第一.检测是否存在Bash漏洞$env x='() { :;}; echo vulnerable' bash -c "echo this is a test"如果返回以下内容:则请 ...

  7. 一句话搞定webmap(一)——轻地图组件

    摘要: 遥想当年.在APP中增加LBS元素相当困难:要刻苦学习java,要刻苦学习iOS开发,要刻苦学习javascript-- 而现在.要制作一张地图真是越来越easy了!居然仅仅须要一句话.就能够 ...

  8. HTTP请求方法

    HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, ...

  9. Mybatis 使用备忘录

    自动生成Mapper java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite Myb ...

  10. RabbitMQ入门-竞争消费者模式

    上一篇讲了个 哈喽World,现在来看看如果存在多个消费者的情况. 生产者: package com.example.demo; import com.rabbitmq.client.Channel; ...