分治算法的介绍与原理解析

news2024/9/24 19:15:45

文章目录

  • 1.分治算法
    • 1.1 如何判断分治问题
    • 1.2 为什么通过分治可以提升效率
      • 1.2.1 操作数量的优化
      • 1.2.2 并行计算优化
    • 1.3 分治常见应用

1.分治算法

分治(divide and conquer),全称是分而治之,是一种非常重要且非常常见的算法。分治通常基于递归实现,主要包括"分"和"治"两个阶段。

  1. 分(划分阶段):递归地将原问题分解为两个或多个子问题,直到到达最小子问题时结束。
  2. 治(合并阶段):从已知解地最小子问题开始,从底到顶地将问题地解进行合并,从而构建出原问题地解。
    其实在排序阶段我们就已经使用过分治算法了,当我们在处理归并排序时,就用到了归并排序。
    同样也是分成了"分"和"治":
  3. 分:递归地将原数组划分为两个子数组(子问题),直到子数组只剩一个元素(最小子问题)
  4. 治:从底到顶地将有序子数组进行合并,从而得到有序地原数组
    归并排序

1.1 如何判断分治问题

一个问题是否合适使用分治解决,可以参考以下几点:

  1. 问题可以分解:原问题可以分解为规模更小、类似地子问题,以及能够以相同方式递归地进行划分。
  2. 子问题是相互独立的:子问题间没有重叠,互相没有关联,独立存在。
  3. 子问题的解可以合并:原问题的解通过合并子问题的解得到。
    如此一来,归并排序显然是满足上面的3个条件的。
  4. 问题可以分解:递归地将数组(原问题)划分为两个子数组(子问题)。
  5. 子问题相互独立:每个子数组都是可以独立地进行排序
  6. 子问题地解可以合并:两个有序子树可以合并为一个有序数组。
void _MergeSort(int* a, int* tmp, int begin, int end)
{
	//确定递归出口
	if (begin >= end)
		return;
	int mid = (begin + end) / 2;//划分数组,将数组一分为二
	//以下为分解逻辑
	_MergeSort(a, tmp, begin, mid);
	_MergeSort(a, tmp, mid + 1, end);
	//以下为合并逻辑
	int begin1 = begin,end1 = mid;
	int begin2 = mid + 1, end2 = end;
	int index = begin;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] < a[begin2])
			tmp[index++] = a[begin1++];
		else
			tmp[index++] = a[begin2++];
	}
	//处理剩余元素
	while (begin1 <= end1)
		tmp[index++] = a[begin1++];
	while (begin2 <= end2)
		tmp[index++] = a[begin2++];
	//将临时数组存放的数据重新复制到原数组
	memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));

}

void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);//临时数组,存放合并时的数据
	if (tmp == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	//归并排序的核心逻辑,再封装一个函数来实现
	_MergeSort(a, tmp, 0, n - 1);
}

1.2 为什么通过分治可以提升效率

分治不仅可以有效地解决,算法问题,往往还可以提升算法效率。在排序算法中,快速排序、归并排序、堆排序相比较于选择排序、冒泡排序、插入排序更快,就是因为它们应用了分治的策略。
提问:为什么分治可以提升算法效率,它的底层逻辑是什么?为什么将大问题分解为多个子问题、解决子问题、将子问题的解合并为原问题的解、这几步的效率为什么就比直接解决原问题的效率更高?
回答

1.2.1 操作数量的优化

以"冒泡排序"为例,其处理一个长度为n的数组需要O(N2)的时间。假设我们按照下图来操作,将数组从中点分为两个子数组,则划分需要O(N)时间,排序每个子数组需要O((N/2)2)时间,合并两个子数组需要O(N)的时间,总体时间复杂度为:

O(n+(n/2)^2+n) = O((n^2)/2+2*n)

优化

接下来,我们计算以下不等式,其左边和右边分别为划分前和划分后的操作总数:

N^2 > (N^2)/2+2N
N^2-(N^2)/2-2N > 0
N(N-4) > 0

这意味着当N>4时,划分后的操作数量更少,排序效率应该更高,不过要注意的是这里划分后的时间复杂度仍然平阶O(N^2),只是复杂度中的常数项变小了。
进一步想,如果我们把子数组不断地再从中间划分为两个子数组,直到子数组只剩下一个元素时停下划分呢?这种思想就是"归并排序",时间复杂度为O(NlogN).
再去思考,如果我们再多设置几个划分点,将原数组平均划分为k个子数组呢?这种情况与"桶排序"非常类似非常适合排序海量数据,理论时间复杂度为O(N+K)

1.2.2 并行计算优化

我们知道,分治生成地子问题相互独立地,因此通常可以并向解决。也就是说,分治不仅可以降低算法时间复杂度,还有利于操作系统地并行优化。
并行优化再多核或多处理器的环境中尤其有效,因为系统可以同时处理多个子问题,更加充分利用计算机资源,从而显著减少总体的运行时间。

1.3 分治常见应用

  1. 寻找最近点对:该算法首先将点集分成两部分,然后分别找出两部分中最近的点对,最后找出跨越两部分的最近点对。
  2. 大整数乘法:例如Karastsuba算法,它将大整数乘法分解为几个较小的整数的乘法和加法。
  3. 矩阵乘法:例如Strassen算法,它将大矩阵分解为多个小矩阵的乘法和加法。
  4. 汉诺塔问题:汉诺塔问题可以通过递归解决,这是典型的分治策略应用。
  5. 求解逆序对:再一个序列中,如果前面的数字大于后面的数字,那么这连个数字构成一个逆序对。求解逆序对问题可以利用分治的思想,借助归并排序求解。
    在另一方面,分治在算法和数据结构的设计中应用非常广泛。
  6. 二分查找:二分查找是将有序实在从中点索引处分为两部分,然后根据目标值与中间元素比较结果,决定排除哪一半的区间,并在剩余区间执行相同的二分操作。
  7. 归并排序:递归地将原数组划分为两个子数组,直到子数组只剩一个元素,从底到顶地将有序子数组进行合并,从而得到有序地原数组
  8. 快速排序:快速排序是选取一个基准值,然后把数字分为两个子数组,一个数组的元素比基准值小,另一个子数组比基准值大,再对这两部分较小相同的划分操作,直到子数组只剩下一个元素。
  9. 桶排序:推排序的基本思想是将数据分散到多个桶,然后最每个桶内的元素进行排序,最后将各个桶的元素以此取出,从而得到一个有序数组。
  10. :例如二叉搜索树,AVL树,红黑树,B树,B+树等,它们的查找、插入、删除等操作都可以视为分治策略的应用
  11. :堆是一种特殊的完全二叉树,其各种操作,如插入、删除和堆化,实际上都隐含了分治的思想。
  12. 哈希表:虽然哈希表并不直接应用到分治,但某些哈希冲突解决方案间接地使用了分治策略,例如,链式地址中地长链表会被转化为红黑树,以提高查询效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SQL基础】【牛客网】子查询、联表查询

子查询 基本语法 子查询&#xff0c;也称为嵌套查询&#xff0c;是在另一个 SQL 语句中嵌套的查询。子查询的结果可以被主查询&#xff08;外部查询&#xff09;使用&#xff0c;用于满足更复杂的数据检索需求。 例如&#xff1a; SELECT employee_name FROM employees WHE…

优化的热点分析与异常值分析:让数据分析更加便捷高效

热点分析作为一种常用的空间统计方法&#xff0c;能够帮助我们识别地理空间中的热点和冷点区域&#xff0c;即那些高值或低值集中出现的地方。而优化的热点分析进一步简化了这一过程&#xff0c;使用户无需手动调整参数即可获得可靠的结果。此外&#xff0c;异常值分析则专注于…

学习记录——day35 数据库 sqlite3

目录 一、安装sqlite3数据库以及sqlite3函数库 二、数据库的结构 三、常用数据库类型 1、sqlite3 2、mysql 四、sqlite3数据库的使用 1、打开数据库 2、sqlite3数据库中指令的使用 1&#xff09;界面指令 2&#xff09;操作指令 3&#xff09;大小写敏感性 3、创建表…

基于STM32开发的智能家居灯光控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化灯光控制逻辑传感器数据采集Wi-Fi通信与远程控制应用场景 家庭智能灯光管理办公室与商业环境的智能照明常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居技术的普及…

尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)

目录&#xff1a; &#xff08;1&#xff09;功能—展示购物车列表 &#xff08;2&#xff09;在web-all添加前端实现 &#xff08;3&#xff09;功能--合并购物车 &#xff08;1&#xff09;功能—展示购物车列表 购物车列表接口&#xff1a;CartService /*** 通过用户Id …

Ps:高速缓存机制

Photoshop 的高速缓存 Cache技术利用缓存和分块的方法处理图像数据&#xff0c;通过合理设置高速缓存级别和拼贴大小&#xff0c;可以有效地提升软件在处理图像时的性能。 Ps菜单&#xff1a;编辑/首选项 Edit/Preferences “首选项”中提供了 8 种高速缓存级别。 增加高速缓存…

一文带你读懂反向代理服务器

文章目录 一、什么是反向代理&#xff1f;二、反向代理的主要特点2.1 负载均衡2.2 隐藏IP2.3 响应加速2.4 过滤非法请求 三、反向代理的应用场景3.1 负载均衡3.2 SSL/TLS终止3.3 日志记录3.4 URL重写3.5 API网关3.6 CDN服务 四、区分反向代理和正向代理4.1 从工作原理上4.2 从安…

Memcached:单节点、集群案例;概念、工作原理

目录 案例前置知识点 Memcached 概念 部署场景 Memcached常用架构 流程 Memcached Memcached API 数据存储方式 数据过期方式 LRU Lazy Expiration Memcached缓存机制 Memcached路由算法 求余数hash算法 一致性hash算法 Memcached分布式 案例 单节点Memcach…

2024电工杯B题完整论文

大学生平衡膳食食谱的优化设计及评价 摘要 大学阶段是学生获取知识和身体发育的关键时期&#xff0c;也是形成良好饮食习惯的重要阶段。然而&#xff0c;当前大学生中存在饮食结构不合理和不良饮食习惯的问题&#xff0c;主要表现为不吃早餐或早餐吃得马虎&#xff0c;经常食…

如果这10道关于数据库的测试题你都会,面试必过!

一、什么是数据库测试&#xff1f; 数据库测试也称为后端测试。数据库测试分为四个不同的类别。 [if !supportLists] [endif]数据完整性测试 [if !supportLists] [endif]数据有效性测试 [if !supportLists] [endif]数据库相关的性能 [if !supportLists] [endif]测试功能&a…

【数据结构】二叉树顺序结构之堆的实现

1. 前言 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&…

【Python机器学习】NLP分词——利用分词器构建词汇表(二)——点积

在自然语言处理中将会有多处用到点积&#xff0c;点积也被称为内积&#xff0c;这是因为两个向量&#xff08;每个向量中的元素个数&#xff09;或矩阵&#xff08;第一个矩阵的行数和第二个矩阵的列数&#xff09;的“内部”维度必须一样&#xff0c;这种情况下才能相乘。这个…

【Docker】以思源笔记为例,谈谈什么是端到端加密

本文首发于 ❄️慕雪的寒舍。 链滴&#xff08;思源笔记社区&#xff09;里面有不少老哥似乎不太了解思源使用的端到端加密功能&#xff0c;以及云同步功能背后的机制。本文将以思源笔记为例&#xff0c;谈谈什么是端到端加密&#xff0c;以及思源的同步功能中用到了什么计算机…

JavaSE基础(12)——文件、递归、IO流

1、IO流 Input&#xff1a;输入&#xff0c;写数据&#xff0c;数据从磁盘加载到内存&#xff08;程序&#xff09;中。 Output&#xff1a;输出&#xff0c;读数据&#xff0c;数据从内存&#xff08;程序&#xff09;存储到磁盘中。 流&#xff1a;不管是读还是写&#xf…

html一文入门---标签大合集

一、文档结构标签 <!DOCTYPE html>: 声明文档类型和 HTML 版本&#xff0c;告诉浏览器使用 HTML5 解析文档。<html>: HTML 文档的根元素。<head>: 包含文档的元数据&#xff08;如标题、字符集、样式表链接&#xff09;。<title>: 定义文档的标题&…

这本书已经无敌!一本书学懂NLP自然语言(附PDF文档)

自然语言处理被誉为“人工智能皇冠上的明珠”。深度学习等技术的引入为自然语言处理技术带来了一场革命&#xff0c;尤其是近年来出现的基于预训练模型的方法&#xff0c;已成为研究自然语言处理的新范式。而今天给大家推荐的这本《自然语言处理&#xff1a;基于预训练模型的方…

详细的爱剪辑官网免费版下载步骤,还有四款剪辑工具推荐!

在当下这个数字化、自媒体蓬勃发展的时代&#xff0c;视频剪辑已成为大家日常中的一项不可或缺的技能。面对市面上丰富多样的剪辑工具&#xff0c;许多初学者往往感到困惑&#xff0c;不知道该如何选择。今天接这篇文章给大家详细解析五款常用的视频剪辑软件&#xff0c;包括还…

数字工厂管理系统与MES系统集成后有哪些作用

在当今智能制造的浪潮中&#xff0c;数字工厂管理系统与MES管理系统的深度融合与集成&#xff0c;已成为推动企业转型升级、提升生产效率与竞争力的关键路径。两者协同工作&#xff0c;不仅实现了生产过程的透明化、智能化管理&#xff0c;还促进了资源优化配置与决策支持能力的…

Python读取fasta格式数据成为字典形式。

本团队提供生物医学领域专业的AI&#xff08;机器学习、深度学习&#xff09;技术支持服务。如果您有需求&#xff0c;请扫描文末二维码关注我们。 Python读取fasta格式数据成为字典形式。 def read_fasta(file_path):"""读取FASTA格式文件&#xff0c;并返回一…

基于vue框架的毕业设计管理系统5n36i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,课题信息,题目分类,选题信息,任务书,中期检查,提交论文,论文成绩,答辩成绩,校园公告,教研主任,申报课题 开题报告内容 基于Vue框架的毕业设计管理系统开题报告 一、引言 随着高等教育的不断发展&#xff0c;毕业设计作为培…