数据结构-分治策略(分治算法)

  • 分治算法

    • 1.分治算法的核心思想

      • 分治算法是一种解决问题的通用方法,它将一个复杂的大问题分解成若干个规模较小、相互独立且与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并,得到原问题的解。
    • 2.分治三部曲

      • 分解:将原问题划分为相似的子问题。
      • 解决:递归地解决这些子问题,即对每个子问题调用分治算法自身。
      • 合并:将子问题的解合并成原问题的解
    • 3.构造分治算法

      • 识别问题的分治结构
        • 首先,分析所要解决的问题,判断其是否具有分治结构。即问题能否被划分为若干个规模较小的、相互独立的子问题,且这些子问题与原问题具有相同的性质或形式。
        • 确保子问题之间没有重叠部分,且每个子问题的解不影响其他子问题的求解
      • 定义子问题
        • 明确如何将原问题划分为子问题。这包括确定划分的数量、划分的具体方式以及子问题的规模是如何随着递归深度减小的。
        • 描述子问题的形式和特征,确保它们与原问题在本质上是相同的,只是规模更小。
      • 设计递归求解策略
        • 确定递归的基本终止条件(基线条件),即问题规模小到一定程度时,可以直接求解而不必再进行分解。
        • 在递归函数内部,根据问题的分解方式,调用自身来处理每个子问题。通常,递归调用会伴随着参数的变化,反映出子问题的规模或范围。
      • 设计合并算法
        • 明确如何将子问题的解合并成原问题的解。这通常涉及到一个明确的、相对简单的合并操作或算法
    • 4.递归与分治的关系

      • 递归是分治算法的核心实现手段:分治算法通常采用递归来解决分解得到的子问题。递归函数负责调用自身来处理子问题,直至达到基本终止条件。递归提供了简洁且易于理解的方式来表达问题规模的逐级减小和子问题的递归解决过程。
      • 分治算法为递归提供了框架和指导:分治算法为递归提供了明确的问题分解规则、递归终止条件和合并子问题结果的机制。递归在分治算法的框架下得以组织和控制,确保了递归调用的正确性和高效性。
    • 5.分治算法的适用条件

      • 可分解性
        1. 问题规模可缩小:原问题应该能够被划分为若干个规模较小的子问题。
        2. 子问题结构相同:每个子问题应与原问题具有相同的本质特征和求解框架,只是规模上有所减小。
      • 子问题独立性
        1. 子问题间无交互:分解出的子问题之间相互独立,即解决一个子问题不需要依赖于其他子问题的解,也不会影响其他子问题的求解过程。
        2. 子问题解无副作用:子问题的求解过程中不会对其他子问题的数据产生副作用,确保合并阶段可以简单地将子问题解拼接起来。
      • 有穷子问题集
        1. 子问题数量有限:分解过程不会无限生成子问题,即存在一个递归深度,达到该深度后问题规模减小到可以直接求解的程度,形成递归的基本终止条件。
      • 子问题的合并性
        1. 存在明确的合并算法:对于子问题的解,应存在一个简单且高效的算法将它们合并成原问题的解。
        2. 合并操作与子问题数量无关或关联度低:合并子问题解的时间复杂度最好与子问题数量无关,或者只与问题规模呈较弱的关联。这样可以保证即使在问题规模较大时,合并阶段也不会成为算法的性能瓶颈。
    • 6.分治算法的时间复杂度分析

      由于分治算法通常包含问题分解、递归求解子问题以及合并子问题解三个主要步骤,因此时间复杂度分析也围绕这三个方面展开。

      • 问题分解时间复杂度
        • 固定成本:分析将原问题划分为子问题所需的基本操作次数。这部分时间复杂度通常与问题规模无关,表现为常数阶(O(1))或与问题规模呈较低阶的关联
        • 问题规模相关成本:某些情况下,问题分解可能涉及与问题规模相关的操作,如排序、搜索等。此时需要计算这些操作的时间复杂度,并考虑其对总时间复杂度的影响。
      • 递归求解子问题时间复杂度
        • 递归方程:假设递归函数的时间复杂度为 T(n),其中 n 表示问题规模。根据递归函数的定义,写出递归方程来描述 T(n) 与子问题规模 n/b(其中 b 是每次划分后子问题的规模比例)之间的关系。
        • 基本情况:确定递归的基本终止条件,即问题规模小到一定程度时,可以直接求解的基线情况。基线情况的时间复杂度通常为常数阶(O(1))或与问题规模呈较低阶的关联。
      • 合并子问题时间复杂度
        • 合并算法:分析合并子问题解所需的基本操作次数。这通常与子问题的数量或子问题规模有关,但合并操作相对于子问题求解通常较为简单,时间复杂度较低。
        • 合并次数:考虑合并操作发生的次数,通常与递归调用的层数或子问题数量相关。
      • 总复杂度
        • 对于大多数分治算法,递归求解子问题的时间复杂度占主导地位。可以利用主定理(Master Theorem)或递归树方法求解递归方程,得到递归求解子问题的渐近时间复杂度。
    • 7.典型的分治算法

      • 快速排序
        • 分治递归过程
          1. 划分:选取一个基准元素(pivot),通过一趟排序将待排序数组划分为两部分,使得左侧所有元素都不大于基准,右侧所有元素都不小于基准。
          2. 递归:分别对左右两个子数组进行快速排序。
          3. 合并:无需额外操作,因为子数组已经是有序的,递归返回后整个数组即为有序。
        • 终止条件
          • 当子数组长度为1或0时,认为数组已经有序,无需继续递归。即当处理的子数组只剩下一个元素或者为空时,递归结束。
      • 归并排序
        • 分治递归过程
          1. 划分:将待排序数组均匀地分为两个子数组。
          2. 递归:对两个子数组分别进行归并排序。
          3. 合并:在每次的递归中,创建一个临时数组,从左到右依次比较两个已排序子数组中的元素,将较小者放入临时数组,直到其中一个子数组的所有元素都被取完,然后将另一个子数组剩余的元素直接复制到临时数组相应位置。最后将临时数组的内容复制回原数组,这个数组是上层递归的数组序列的左侧或右侧序列,以此类推,再次向上返回数组,直到数组中的元素全部有序.
        • 终止条件:当待排序数组的长度为1时,认为数组已经有序,无需继续递归。即当处理的子数组只剩下一个元素时,递归结束。
      • 二分查找
        • 分治递归过程
          1. 划分:在一个有序数组中,取中间元素作为基准,将数组划分为左右两半。
          2. 递归:根据目标值与中间元素的大小关系,决定在左半部分还是右半部分继续进行二分查找。
          3. 合并:二分查找过程中无需合并操作,直接返回查找到的目标元素的索引或表明未找到的结果。
        • 终止条件:待查找区间缩小到只剩一个元素时,检查这个元素是否为目标值。如果是,则查找成功,返回其索引;若不是且两侧区间均为空(即目标值不在数组中),则查找失败,返回特定标识(如 -1 或 null)。
      • 汉诺塔问题
        • 分治递归过程
          1. 划分:将所有盘子(除了最底层的一个)视为一个整体,看作一个新的子问题
          2. 递归:将除最底层盘子外的所有盘子借助第三根柱子移动到第二根柱子上。
          3. 合并:将最底层的盘子直接移动到目标柱子(第二根柱子或第三根柱子)上。
        • 终止条件:当待移动的盘子数量为1时,直接将该盘子从起始柱子移动到目标柱子,无需进一步递归。即当问题规模减小到只剩一个盘子时,递归结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse 配置JDK版本,Eclipse Maven install 时使用的JDK版本

Eclipse配置JDK版本 Eclipse 配置JDK版本的地方? 在Eclipse中配置JDK版本的步骤如下: 打开Eclipse IDE。转到菜单栏并选择 “Window”(窗口)选项。在下拉菜单中选择 “Preferences”(首选项),或…

asp.net core 依赖注入后的服务生命周期

ASP.NET Core 依赖注入(DI)容器支持三种服务的生命周期选项,它们定义了服务实例的创建和销毁的时机。理解这三种生命周期对于设计健壯且高效的应用程序非常重要: 瞬时(Transient): 瞬时服务每次…

大型网站系统架构演化实例_3.使用服务集群改善网站并发处理能力

1.使用服务集群改善网站并发处理能力 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去更换更强大的服务器,对大型网站而言,不管多么强大的服务器,对大型网站而言&…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法? 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。其本质是穷举,穷举所有可能,然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢? 因为有的问题能暴力…

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制,任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权,那么他们几乎可以为所欲为,包括肆意破坏或窃取、更改数据。…

光伏工程施工前踏勘方案与注意事项

光伏工程是指利用光能发电的技术。随着清洁能源的发展,光伏工程在能源领域的应用越来越广泛。在进行光伏工程施工前,需要对施工现场进行踏勘,以确保施工能够顺利进行并达到预期的效果。 本文游小编带大家一起看一下探勘的方案和注意事项。 1…

设计模式胡咧咧之策略工厂实现导入导出

策略模式(Strategy Pattern) 定义: 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 本质: 分离算法,选择实现 应用场景 何时使用 一个系统有许多类,而区分他们的只是他们直接…

【赛题】2024年“华中杯”数模竞赛赛题发布

2024年"华中杯"数学建模网络挑战赛——正式开赛!!! 赛题已发布,后续无偿分享各题的解题思路、参考文献,帮助大家最快时间,选择最适合是自己的赛题。祝大家都能取得一个好成绩,加油&a…

Python数据可视化:散点图matplotlib.pyplot.scatter()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 Python数据可视化: 散点图 matplotlib.pyplot.scatter() 请问关于以下代码表述错误的选项是? import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 3, 5, 7,…

认识一下RAG

1.RAG技术背景与挑战 2.RAG的核心概念 3.RAG的工作流程与架构 4.RAG的优化方法 RAG的提出 •Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks是一篇重要的论文(2020年5月) •REALM: Retrieval-Augmented Language Model Pre-Training (2020)就将BERT预训练模…

libVLC Ubuntu编译详解

1.简介 有时候,windows上开发不满足项目需求,需要移植到linux上,不得不自行编译libvlc,编译libvlc相对而言稍微麻烦一点。 我使用的操作系统:Ubuntu20.04 查看系统命令lsb_release -a libvlc版本: 3.0.1…

CSS导读 (CSS的三大特性 上)

(大家好,今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 五、CSS的三大特性 5.1 层叠性 5.2 继承性 5.2.1 行高的继承 5.3 优先级 小练习 五、CSS的三大特性 …

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境2、配置远程连接3、其他配置入口 跑新项目,有个confluent-Kafka-go的依赖在Windows上编译不通过,报错信息: undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持,选择让…

数据库设计的三范式

简单来说就是:原子性、唯一性、独立性 后一范式都是在前一范式已经满足的情况进行附加的内容 第一范式(1NF):原子性 存储的数据应不可再分。 不满足原子性: 满足原子性: 第二范式(2NF&#xf…

历史遗留问题1-Oracle Mysql如何存储数据、索引

在学习到Oracle redo和undo时,涉及到很多存储结构的知识,但是网上的教程都不是很详细,就去复习了一下mysql,感觉是不是开源的问题,Mysql的社区和知识沉淀远高于Oracle, 对于初学者很友好,我想请…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(5)——可控评估端到端评估

最后完结篇,文末有测试中发现的有趣现象,并附上了相关资料链接~ 5.可控评估 分两个阶段评估生成代理。我们从一个更加严格控制的评估开始,单独评估代理的响应,以了解它们是否在狭义上定义的上下文中产生可信的行为。然后,在我们对代理社区进行为期两天的端到端分析中,我…

初始C++

1. C关键字(C98) C总计63个关键字, C语言32个关键字 ps:下面我们只是看一下C有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再 细讲。 2. 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,…

llama-factory SFT系列教程 (三),chatglm3-6B 大模型命名实体识别实战

文章列表: llama-factory SFT系列教程 (一),大模型 API 部署与使用llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署 llama-factory SFT系列教程 (三),chatglm3-6B 命名实体识别实战 简介 利用 llama-fa…

opencv | 编译缺失ippicv相关文件解决方案

1.执行cmake后,查看控制台输出信息 ~/VM_data/opencv-4.9.0$ cd buile_temp ~/VM_data/opencv-4.9.0/buile_temp$ cmake ..2.去浏览器打开链接,下载对应的压缩包,解压到 路径:/3rdparty/ippicv/

Ubuntu 安装 wine

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你使用 Ubuntu 系统,而有些软件只在 Windows 上运行,例如:PotPlayer,那么该如何在 Ubuntu 系统中使用到这些 Windows 的软件呢?答案是安装 wine。 简单的安装步骤如…
最新文章