算法回顾 - 分治

【算法设计与分析】期末复习题(超详细) 刚刚整理了一下电脑的文件,发现了这份上学期的算法设计与分析期末复习题,有需要的文后自取。 阅读详情


  把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并,这就是分治算法。其典型的应用包括:排序算法(快速排序、归并排序),傅立叶变换等。

分治法的基本步骤

    分治法在每一层递归上都有三个步骤:

    分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

    解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

    合并:将各个子问题的解合并为原问题的解。

    它的一般的算法设计模式如下:

    Divide-and-Conquer(P)

    1. if |P|≤n0

    2. then return(ADHOC(P))

    3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk

    4. for i←1 to k

    5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi

    6. T ← MERGE(y1,y2,...,yk) △ 合并子问题

    7. return(T)

    其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。

其算法复杂度为:(n为问题规模)

T(n)  =    O(1) //如果n<=c ,c是n中一个可以直接求解的规模

aT(n/b) + D(n) + C(n) //n>c

  在快速排序中,α 是为2的, b也为2, 则分解(就是取参照点,可以认为是1), 合并(把数组合并,为n), 因此D(n) + C(n) 是一个线性时间Ѳ(n).

  这样时间就变成了T(n) = 2T(n/2) + Ѳ(n).

  下面有点复杂了, 在每个层上的时间复杂度为: 第在一层上是cn(c为比较一次时所用的时间), 在第二层上时数组被分成了两部分, 每部分为 n/2, 则在第二层上时间为 c * n/2 + c* n/2 = cn, 同样在第三层上, 被分成了四部分, 时间为c*n/4 + c*n/4 + c*n/4 + c*n/4 = cn. 层高一共是按刚才说的是Log2n层,每一层上都是cn, 所以共消耗时间 cn * Log2n; 则总时间:

  cn * Log2n + cn = cn(1+Log2n)  即 Ѳ(nLog2n).



则最终的这个函数的时间复杂度为: 

 C * D(n)  

D(n)为递归深度,C为处理单个问题所需的时间复杂度。


最近点对问题(分治思想的经典应用) 今天开始复习典型算法,首先回顾了分治算法的应用。一个经典的问题是求二维空间中最近点对。如果硬性用循环解决这个问题的话,当点的数量较大时,循环的次数会以O(n2)增加,所以这不是较好的解决方法。对于这种问题,可以通过将原问题不断划分为更小的子问题进而加以解决。在《数据结构、算法与应用-----c++语言描述》一书中给出了这一问题完备的分治递归解决方案。 算法过程如下: 1、如果点的数量n较小,则直 阅读详情

相关推荐

算法回顾 —— 贪心&DP&分治&回溯&分支限界

算法基础 —— 贪心&DP&分治&回溯

m0_51339444的博客 1142

分治、贪心、动态规划、回溯算法思想回顾与总结

对前几次算法实验的总结 分治、贪心、动态规划、回溯算法思想回顾与总结

insouciant_22的博客 1396

[技术解析]4DGS:突破实时动态渲染的4D高斯溅射技术

本文深入解析了4DGS(4D Gaussian Splatting)技术,它通过引入时间维度,将静态的3D高斯溅射升级为动态的4D表示,实现了对复杂动态场景的高质量实时渲染。该技术利用时空联合编码器与高斯形变场网络,结合多分辨率编码与差分溅射渲染,在VR/AR、高帧率游戏等领域展现出突破性的应用潜力,兼顾了渲染速度与画面稳定性。

weixin_29218509的博客 414

五大算法回顾:分治、动态规划、贪心、回溯、分支限界

一、分治算法       基本概念         字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。       分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。        分治策略是:对于一个规模为n的...

hard_days的博客 715

restbed编译笔记

Restbed 可以构建出基于asio库的restfulAPI服务,Restbed 4.7版本使用了1.12.0版本的asio(其他版本编译不通过),可直接访问github下载:https://github.com/chriskohlhoff/asio/tree/asio-1-12-0。另外Restbed还依赖openssl库(可直接下载exe的安装包,安装后取出lib库及头文件放到到restbed\dependency\openssl中即可,https://slproweb.com/download/W.

mahong100的博客 2107

了解你的GPU:深入探讨AMD SMI

2024年9月17日 作者:Matt Elliott对于使用AMD硬件的系统管理员和高级用户来说,性能优化和高效的资源监控至关重要。AMD系统管理界面命令行工具`amd-smi`正是为了解决这些需求而设计的。amd-smi是一个多功能的命令行工具,专门用于管理和监控AMD硬件,主要侧重于GPU。作为未来取代`rocm-smi`的工具,`amd-smi`有望成为跨广泛设备的AMD硬件管理的主要工具。

数字人生 4525

算法设计与分析_算法设计与分析(第2版)第2章分治策略回顾

YI时间|外刊|MM-DFW|机器学习系列点击上方蓝字,关注给你写干货的松子茶分治策略是通用算法设计技术之一,很多有效的算法是它的特殊实现,顾名思义就是分而治之。一个问题能够用分治法求解的要素是问题能够按照某种方式分解成若干个规模较小、相互独立且与原问题类型相同的子问题;子问题足够小时可以直接求解;能够将子问题的解组合成原问题的解。由于分治法要求分解成同类子问题,并允许不断分解,使问题规...

weixin_39864738的博客 251

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板)

本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。

weixin_29305337的博客 582

【挠头写算法系列】质疑分治,理解分治,到分治真香

断更了好久的算法,原因是之前进度太慢,要是加上写博客更慢了,现在今天就继续更新后续的一些算法。首先今天要讲的就是”分治“,什么是分治呢,这里就不把一长串的概念给大家复制出来了,我直接用通俗,直观的方式告诉大家,常见的分治就是我们之前听说过的“快速排序”,与”归并排序“。如果还是不太理解,没事,下面的文章我会更加详细的讲解什么是分治。但在这之前我们就需要先回顾快速排序,与归并排序。

2302_81249757的博客 536

大数据分析工具Power BI(二):Power BI下载安装和模块介绍

首先在Microsoft官方网站上下载PowerBI Desktop,然后进行安装。id=58494点击"Next"后会弹出下载框,进行下载即可,下载好的PowerBI名称为"PBIDesktopSetup_x64.exe",也可以在"资料"中获取安装包,双击安装包即可安装。

Lansonli(蓝深李)的博客 2321

RK3568平台开发系列讲解(中断及异常篇)中断下半部:中断线程化

以前用 work 来线程化地处理中断,一个 worker 线程只能由一个 CPU 执行, 多个中断的 work 都由同一个 worker 线程来处理,在单 CPU 系统中也只能忍着 了。少数中断不能线程化,典型的例子是时钟中断,有些流氓进程不主动让出处理器,内核只能依靠周期性的时钟中断夺回处理器的控制权,时钟中断是调度器的脉搏。中断处理线程是优先级为50、调度策略是SCHED_FIFO的实时内核线程,名称是“irq/”后面跟着Linux中断号,线程处理函数是。,说明是线程化的中断,那么唤醒中断处理线程。

内核笔记 435

萌新做点小玩意儿DAY-3 运用递归和分治的棋盘覆盖算法

今天复习了一下很久很久前学过的分治和递归算法思想。 分治顾名思义分而治之,当面对一个规模比较大的问题时,暴力解决问题则会面临庞大的计算量,因此并不妥当,我们可以把一个大的问题转换为规模相同的子问题,通过调用解决子问题的算法来解决整个问题。 在我看来递归并不是一种算法而是解决问题的一种思想,最常见的递归计算就是计算n!和斐波那契数列,递归的特点就是代码实现起来比较快捷,短短的几行代码就可以计算解决斐波那契数列问题。而非递归的方式则要实现一个很复杂很复杂的函数。 int Fibonacci(int n)

davidyoyoh的博客 1313

【3天快速入门WPF】从小白到新手入门教程

嘿,小伙伴们!如果你已经有一定的C#开发基础,但想快速掌握WPF开发,达到企业级水准,那接下来的这个三天快速入门计划绝对适合你!虽然听起来有点挑战,但别担心,只要跟着这个高强度、结构化的学习计划,你一定能搞定它。首先,我们得搞清楚,WPF的核心知识点到底有哪些。要想达到企业级开发水准,XAML、数据绑定、MVVM、控件使用、命令系统、样式模板这些统统都得拿下。听起来是不是有点多?别急,我们把任务分解到三天里,每天安排合理的内容,保证理论和实践相结合,让你学得扎实又高效。

Zy100Papa的博客 1423

基于分治的归并排序

某天得知寒假还有编程作业,便很无奈地写着第一套题,发现分治算法,这种基础算法,初一初二学的,现在完全不记得了23333 于是嘛,就又重新学了一下分治以及归并排序。 一、啥是分治 分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 (以上来自百度百科quq) 二、...

ZZY的博客 382

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1293

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

分治与递归算法——关于汉诺塔问题(C语言实现)

大一上学期第一次接触到“汉诺塔”问题,当时由于C语言程序设计课没有好好听(毕竟当时天真地觉得自己以后应该不会从事与程序密切相关的工作,所以经常翘课doge),对于这一类需要利用递归等算法思维进行求解的问题自然也理解的不是很到位。暑假开始学习数据结构与算法,在分治与递归这一块卡了很久,想在这一篇博客里记录一下自己关于分治与递归的一些想法。 一、分治与递归: 先简单复述一下分治的概念: 关于分治的时间复杂度: 由于递归本质上是实现分治中分解与归并的手段,因而在...

NanamiKento的博客 1607

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

几种经典算法回顾

今天无意中从箱子里发现了大学时学算法的教材《算法设计与分析》,虽然工作这么几年没在什么地方用过算法,但算法的思想还是影响深刻的,可以在系统设计时提供一些思路。大致翻了翻,...

169

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

南开大学软件学院2021年秋季学期研究生算法课程(复习)贪心分治之分治(包含快速傅里叶变换)

状态空间中的算法 状态空间:状态(点)+状态转移(边)+价值函数(点权) 求解过程的抽象模型 暴力搜索和动态规划都是一类算法框架(或算法思想),本质都是在状态空间中寻找解 二者都需要准确地用最少的状态变量建模 而对于动态规划,还需要定义正确的价值函数和转移更新 分治:子问题互不重叠,但最优子结构需考虑全部子问题 贪心:子问题互不重叠,但最优子结构仅考虑极少子问题 若认为动态规划算法的状态空间是有向无环图的话,对于分治和贪心,其状态空间通常可以建模成树,分治需要评估整个树,贪心则是树上的几条链

Ritannn的博客 638

算法复习——6种排序方法的简单回顾

常见排序方法:冒泡排序、选择排序、插入排序、堆排序、归并排序、快速排序的简单回顾

weixin_47723114的博客 1304

详解CDQ算法

详解CDQ算法 在这篇文章中, 我将带大家走进CDQ算法。 什么是CDQ算法 从二分说起 在解释cdq算法之前, 首先回顾算法中非常经典的分而治之。 Divide And Conquer(分而治之) 分而治之是计算机科学中非常经典的思想, 通常会把一个比较复杂的大问题, 分成两个(或多个)子问题, 分别递归分而治之去解决这些子问题, 最后把子问题的结果合并为原问题的解。 有了以上分而治之的思想后, 我们可以看一个非常经典的算法例子归并排序。 归并排序: 归并排序有以下几个步骤 把数组分成做左区间和右

zhuziyu_edward的博客 2079

树上点分治入门

分治就是分而治之。额……好像这话已经被说烂了。 学树分治之前我们先来回顾下线性分治。一般的线性分治都是将大的区间分成多个小的区间(一般是两个),然后将已处理好的小区间合并从而得到了这个大区间的结果,为了使分的次数尽可能少,应每次使分的小区间的大小尽可能平均,这样分的次数就会是log级别的。 好,现在我们要分树,参考线性分治的方法,每次选一个点,使删除这个点后被分开的连通块大小尽可能平均,暂且把

小布丁童学 589

7:数据结构及算法应用--7.1:回顾算法策略区分,7.2:回顾时间复杂度与空间复杂度,7.3:代码填空技巧

7:【软件设计】数据结构及算法应用--7.1:回顾算法策略区分,7.2:回顾时间复杂度与空间复杂度,7.3:代码填空技巧

m0_49547615的博客 1121
上一篇: 枚举 Enum
下一篇: 算法回顾 - 动态规划
define_c
博客等级 码龄14年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值