分治算法详解:分而治之
分治算法核心思想
分治算法用四个字概括就是分而治之。
将原问题划分成多个小规模并且简单的子问题,这些子问题的结构与原问题相似,因此,递归地解决这些子问题,将子问题的解合并就可以得到原问题的解了。
分治算法的思路与递归很相似,但是分治算法是一种算法思想,是一种处理问题的思想,而递归是一种编程技巧。所以,分治算法通常适合使用递归来实现。
在使用递归实现分治算法时,有以下三步操作:
- 分解:将子问题分解成一系列小规模并且与原问题结构相似的子问题
- 解决:递归的解决每一个子问题
- 合并:将子问题的解合并得到原问题的解
那么,哪些问题适合使用分治算法来解决呢?
- 原问题可以分解成一系列与原问题结构相似的子问题,并且子问题很容易解决
- 原问题分解成的子问题可以独立求解,并且子问题与子问题之间没有关联性(区别于动态规划)
- 原问题在分解子问题的时候存在终止条件,即分解到一定程度后,子问题很容易解决。
- 最后求得子问题的解后,可以合并成原问题的解,并且这个合并操作复杂度不能太高。
分治算法实践:归并排序
两路归并排序的思路是,首先将数组分为两半,再递归的进行分割,直到每一份都只剩 1 个数据,再将每一份两两合并。如图所示:
- 分解
- 解决
可以发现,在分解到只有单个数据时,从排序的角度看,实际上已经有序的,因此,直接再合并即可 - 合并
C代码实现:
#include<stdio.h>
#include<stdlib.h>
//一遍归并
void merge(int a[], int temp[], int start, int mid, int end) {int i = start, j = mid + 1, k = start; //第一部分:start到mid,第二部分:mid+1到endwhile(i != mid + 1 && j != end + 1) {if(a[i] > a[j]) { //取较大者导入临时数组temp[k++] = a[i++];} else {temp[k++] = a[j++];}}while(i != mid + 1) { //两个部分若有多余的,直接导入temp数组temp[k++] = a[i++];}while(j != end + 1) {temp[k++] = a[j++];}for(i = start; i <= end; i ++) { //从临时数组导出到原数组a[i] = temp[i];}
}
void merge_sort(int a[], int temp[], int start, int end) {int mid;if(start < end) {mid = (start + end) / 2;merge_sort(a,temp,start,mid); //前半部分递归merge_sort(a,temp,mid+1,end); //后半部分递归merge(a,temp,start,mid,end); //排序}
}
void Sort(int a[], int N) {int* b;b = (int*)malloc(N*sizeof(int));if(b != NULL) {merge_sort(a,b,0,N);free(b);} elseprintf("空间不足");
}
int main() {int a[10] = {0,1,2,3,4,5,6,7,8,9,};Sort(a,9);for(int i = 0 ; i < 10 ; i ++) {printf("%d ",a[i]);}
}
分治算法详解:分而治之相关推荐
- 分治算法详解(超详细)
原 分治算法详解 分类专栏: 算法详解 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接: https://blog.csdn.net/effective_coder/a ...
- 分治算法 --- 详解
❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️ 分治算法概念: 分治算法,即分而治之: 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主 ...
- 分治算法详解(带图)
实际场景中,我们之所以觉得有些问题很难解决,主要原因是该问题涉及到大量的数据,如果只需要处理少量的数据,问题会变得非常容易解决. 举一个简单的例子,设计一个排序算法实现对 1000 个整数进行排序.对 ...
- 五大常用算法——分治算法详解及经典例题
一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...
- 7大排序算法详解+java实现
目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...
- 快速排序算法详解(原理,时间复杂度,实现代码)
快速排序算法详解(原理.实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快 ...
- 排序算法,最全的10大排序算法详解(Sort Algorithm)
文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...
- JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)
JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...
- 【数据挖掘】:FP增长算法详解
FP-growth算法,fpgrowth算法详解 使用FP-growth算法来高效发现频繁项集 前言 你用过搜索引擎挥发现这样一个功能:输入一个单词或者单词的一部分,搜索引擎酒会自动补全查询词项,用户 ...
最新文章
- 计算机维护系统Win8PE,u启动windows8PE工具箱
- (1)虚拟机管理——在微软云Azure新门户创建虚拟机
- Qt 数据库操作(二)
- sublime html 折叠,关于sublime text, notepad++,vscode 代码折叠显示的比较
- oracle数据库导入导出expdp/impdp命令详细操作过程
- 10个你应该了解的Git命令(以及Git省时小窍门)
- java多线程模拟loadrunner进行压测
- CSS3之2D与3D变换
- 2021年中国宠物食品加工设备市场趋势报告、技术动态创新及2027年市场预测
- python opencv保存图片_OpenCV Python 保存图片
- 如何卸载mysql server 2005_彻底的卸载SQL Server2005
- 非常实用的一键开关机电路
- 爱企查爬虫selenium
- java配置 path_java中path的配置
- verilog从txt中读取_将Verilog中的二进制文件数据读入2D数组
- 哈勃望远镜研究员测试区块链的空间数据处理
- python求线段长度_如何用python求线段长度
- vivo Z3i的usb调试模式在哪里,开启vivo Z3iusb调试模式的教程
- python实现多句话翻译多语种(调翻译接口)
- Android tips(十二)--Android开发中使用矢量图