分治思想

Divide and Conquer,即为分治法,基于分支递归的一种解决问题的思想方法。
分治分治,“分而治之”的意思,就是把一个复杂的原问题分成一个或多个相同子问题,而每个子问题有可以递归地执行,直到子问题简单到可以直接求解,最后原问题的解即为所有子问题解的合并。

算法步骤

一、Divide

将问题分解为一个或多个子问题。

二、Conquer

递归地解决每个子问题。

三、Combine

合并子问题的结果。

分治的应用

一、mergesort

对一个数组array进行排序。

1、Divide

将数组array分为两个子数组subarray。

2、Conquer

递归地mergesort每个subarray。

3、Combine

对两个已排序的子数组subarray进行合并。

C++实现

//mergesort实现
void mergeSort(T array[], int p, int r) {if (p < r) {int q = (p + r) / 2;mergeSort(array, p, q);mergeSort(array, q + 1, r);merge(array, p, q, r);}}
//combine
void merge(T array[], int p, int q, int r) {if (!(p <= q && q< r)) {return;}int len1 = q - p + 1;int len2 = r - q;T array1[len1];T array2[len2];for (int i = 0; i < len1; i++) {array1[i] = array[p + i];}for (int j = 0; j < len2; j++) {array2[j] = array[q + 1 + j];}int i = 0;int j = 0;int k = p;while (k <= r && i < len1 && j < len2) {if (array1[i] <= array2[j]) {array[k++] = array1[i++];} else {array[k++] = array2[j++];}}while (i < len1) {array[k++] = array1[i++];}while (j < len2) {array[k++] = array2[j++];}}

二、binary search

在一个有序数组array中查找元素x。

1、Divide

将x与数组array的中值进行比较,确定后续待查的子数组subarray。

2、Conquer

递归地在subarray中查找x。

3、Combine

trivial

C++实现

//力扣704题
//binarySearch 实现
int binarySearch(vector<int>& nums, int p, int q, int x) {if (p <= q) {int mid = p + (q - p) / 2;if (nums[mid] == x) {return mid;} else if (x > nums[mid]) {return recurse(nums, mid + 1, q, x);} else {return recurse(nums, p, mid - 1, x);}} else {return -1;}
}
//调用方法
binarySearch(nums, 0, nums.size() - 1, x);

三、链表翻转

翻转一个单链表
输入:1->2->3->4->5->6->NULL
输出:6->5->4->3->2->1->NULL

1、Divide

将原始链表分为头节点head与子链表head->next。

2、Conquer

先翻转head节点,然后递归地翻转子链表head->nex。

3、Combine

trivial

C++实现

//力扣206题
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
ListNode* reverseList(ListNode* head) {return recurse(NULL, head);
}ListNode* recurse(ListNode* pre, ListNode* head) {if (head == NULL) {return pre;}ListNode* next = head->next;head->next = pre;return recurse(head, next);
}

四、计算x的n次幂

计算x的n次幂,n为整数。

1、Divide

将n分为两个n/2大小的整数。

2、Conquer

递归地计算x的n/2次幂。

3、Combine

将两个结果乘积合并。

C++实现

//力扣50题
double quickMul(double x, long long N) {if (N == 0) {return 1.0;}double y = quickMul(x, N / 2);return N % 2 == 0 ? y * y : y * y * x;
}
double myPow(double x, int n) {long long N = n;return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}

分治法 Divide and Conquer思想及实际应用相关推荐

  1. 分治法 divide and conquer

    分治算法包含以下步骤: 1.分(divide):将一个大问题分解成若干个子问题,每个子问题的问题规模n更小了,这样就有了好几个待解决的子问题. 2.治(conquer):递归的去解决每个子问题. 3. ...

  2. java分治法求数列的最大子段和_同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。...

    写在前面 疫情过后,招聘与求职受影响到底有多大?我不知道,但我的真实感受是,即使有疫情的影响,最近还是持续有朋友来跟我说他们今年工作的新动向.有人跳槽去了大厂,有人下定决心出来创业,也有人还在观望,等 ...

  3. 关于算法--分治法--合并排序

    分治法: 1.思想:①将问题的实例划分为同一个问题的几个较小的实例,最好拥有相同的规模:②对于较小的实例进行求解,一般使用递归法,在问题规模足够小的情况下也是用另一个算法:③如果必要的话,合并这些较小 ...

  4. 1177: 按要求排序(指针专题)_数据结构 8 基础排序算法详解、快速排序的实现、了解分治法...

    快速排序 快速排序与冒泡排序一样,同样是属于 交换排序 叫做快速排序也是有原因的.因为它采用了 分治法的概念 其中最重要的一个概念就是 基准元素 冒泡排序每一轮将一个最大的元素挑选出并移动到右侧. 分 ...

  5. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  6. 分治法(divide conquer algorithm)的理解

    二分搜索中的合并 combination(所谓合并 combination,更像是取代),当前子问题的结果(最终搜索的结果)直接就是上一步大问题的结果: 1. 递归与分治 一旦找到从给定问题到其较小规 ...

  7. 分治法的基本思想与例子解析

        分治法的设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 凡治众如治寡,分数是也.--孙子兵法 1.基本思想 (1) 将求解的较大规模的问题分割成k ...

  8. 2_2 递归与分治策略(分治法的基本思想)

    基本思想:将复杂问题简单化,大事化小,小事化了,很符合中国人的思想. 打官腔:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解, ...

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

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

最新文章

  1. 【飞谷六期】爬虫项目4
  2. C++|Qt工作笔记-Windows平台下的句柄与Qt中QWindow::winId()以及 QPlatformWindow::handle的区别与联系
  3. 【C++】C++中的头文件(.h)—详解(1)
  4. 设计模式08_适配器
  5. qpython3l使用手册_qpython3l怎么用
  6. 【Joomla】Gallery 中的图片失去了 Popup 效果
  7. [面试]——用一行代码判断两矩形是否相交
  8. 智乃的01串打乱(思维+暴力)
  9. 实验四+067+冯艳芳
  10. Java 反射机制浅析
  11. 坐高铁只能用身份证了?
  12. linux集群环境搭建
  13. 转发:一个总经理的11个经典面试问题
  14. IDEA git 切换分支产生问题
  15. VS2008——调试方法大全
  16. php设置延迟代码执行,PHP实现延迟执行程序
  17. PB使用WININET的FTP方式自动更新(四、下载)
  18. Android 生成自己的签名key(releasekey platform shared media networkstack verify等)
  19. 大数据分析师面试求职攻略
  20. SPI实现SST25VF016B驱动(Flash)

热门文章

  1. 《缠中说禅108课》92:中枢震荡的监视器
  2. es文件管理器 web服务器,ES文件管理器曝出漏洞 文件会泄露给本地网络上的任何人...
  3. 机器学习中的数学——模拟退火算法(Simulated Annealing,SA)
  4. 【足式机器人控制算法】(5.1)分解式虚拟模型VMC解耦思想 +反馈控制的方法规划反作用力 +运动学雅可比+虚功原理规划关节扭矩方法
  5. 硅谷真假u盘测试软件,真正一键装机,U盘装机“大师”名不虚传
  6. 算法百花齐放:探索常见算法的精妙之道
  7. iOS 【十分钟完成--实时赛车开奖动画】
  8. HPLC分类及其原理
  9. 常见扫码枪广播名称(更多欢迎投稿)
  10. PS制作漂亮的绿色水晶箭头图标