算法设计-hw1

一、时间复杂度的估计

1.1 三种方法

​ 估算分治问题的时间复杂度一共有三种普遍的方法:

在这里插入图片描述

1.2 代入法

​ 代入法需要结合第二数学归纳法使用,使用起来还是很简单的(难点在于猜测),比如估算
T ( n ) = T ( n 4 ) + T ( 3 n 4 ) + n ( n > 4 ) T ( n ) = 1 ( n ≤ 4 ) T(n) = T(\frac{n}{4}) + T(\frac{3n}{4}) + n \qquad (n > 4) \\ T(n) = 1 \qquad (n \leq 4) T(n)=T(4n)+T(43n)+n(n>4)T(n)=1(n4)
​ 可以猜测其上界为 $ O(n\log n) $ 。那么需要检验一下基准情况,对于常数 c c c ,有
1 < c n log ⁡ n 1 < cn\log n 1<cnlogn
​ 然后进行归纳假设,设当 k < n k < n k<n 时,有 T ( k ) < c k log ⁡ k T(k) < c k \log k T(k)<cklogk 。对于 n n n
T ( n ) = T ( n 4 ) + T ( 3 n 4 ) + n ≤ c n 4 log ⁡ n 4 + c 3 n 4 log ⁡ 3 n 4 + n = n log ⁡ n − ( 1 − c 4 l o g 64 27 ) n T(n) = T(\frac{n}{4}) + T(\frac{3n}{4}) + n \leq c \frac{n}{4} \log\frac{n}{4} + c \frac{3n}{4} \log\frac{3n}{4} + n = n \log n - (1 - \frac{c}{4} log\frac{64}{27}) n T(n)=T(4n)+T(43n)+nc4nlog4n+c43nlog43n+n=nlogn(14clog2764)n
​ 可以看到,只要稍微控制一下 c c c ,就可以使得 T ( n ) ≤ n log ⁡ n T(n) \leq n \log n T(n)nlogn 。归纳成立。

1.3 树方法和主定理

​ 这两者本质是一种方法,其实都是通过计算一个树形结构来获得复杂度,这是因为分治问题本身就是一个树问题。这棵树大致如下

在这里插入图片描述
​ 其中非叶子节点记录的是合并的代价(也就是非递归部分的复杂度),而前面的分治则决定了树的结构(一般我们需要的信息是树的高度)。叶子节点记录了基准情况。我们计算的复杂度就是把这棵树所有节点加起来。

​ 主定理是这样的一棵树,它的子树是相同的,不会像上面一样出现不同高度的子树(同一层子树)。这无疑限制了求解的范围。但是给出了统一的数学思路,也就是

在这里插入图片描述
​ 可以看到复杂度由两部分构成,第一部分是叶子节点的代价,第二部分是非叶子节点的代价。问题的难点是对于第二部分的处理。

​ 其实第二部分中,如果 f ( n ) f(n) f(n) 是一个幂函数,那么求和就是一个等比数列的求和,是很容易计算的,困难的是非幂函数的情况,我们和树方法一样,都需要面临一个不确定能不能的求和问题。

​ 我们将比较容易求和的部分总结了一下,形成了主定理:

在这里插入图片描述

二、平面最近点对

2.1 题目描述

​ 在第一象限有 n n n 个点对(其实利用平移坐标轴,这个很容易扩展到四象限),求其中距离最近的两个点对。

2.2 分治算法

​ 这道题如果暴力求解,是 O ( n 2 ) O(n^2) O(n2) 的复杂度,所以如果有巧妙办法(必然有,不然我就不写了),那么应该是更小的时间复杂度。所以我们考虑用分治算法。

​ 从需求出发,我们按照 x x x 坐标将点分为两组,一半的 x x x 比较大,另一半比较小。假设我们已经获得了这两个部分的结果,也就是我们知道 A 1 , A 2 A_1, A_2 A1,A2 的解是 h 1 , h 2 h_1, h_2 h1,h2 ,那么考虑如何依靠他们来获得最终的答案(即归并过程)。

在这里插入图片描述

​ 我们说,最终的结果只可能为 h 1 , h 2 h_1, h_2 h1,h2 ,或者是 A 1 , A 2 A_1, A_2 A1,A2 交界处分居两个子区域的点,现在考虑交界处的点。应当意识到,交界处不会太大,这是因为当其宽度超过 2 h 2h 2h 的时候(其中有 h = m i n ( h 1 , h 2 ) h = min(h_1, h_2) h=min(h1,h2))。多出来的点必然不会是距离最小的点,因为平行线间垂线段最短。所以我们就将分界曲的范围现在在了宽度为 2 h 2h 2h 即如图所示

在这里插入图片描述

​ 那么这样的分界区需要考虑的点是多少,由主定理可知 T ( n ) = 2 T ( n 2 ) + f ( n ) T(n) = 2T(\frac{n}{2}) + f(n) T(n)=2T(2n)+f(n) 。如果 f ( n ) f(n) f(n) Ω ( n 2 ) \Omega(n^2) Ω(n2),那么优化就失败了。而第一反应其实就是 Ω ( n 2 ) \Omega(n^2) Ω(n2)。因为我们要枚举分界区的点,分界区的点的个数是 O ( n ) O(n) O(n) 。两两枚举就会导致 Ω ( n 2 ) \Omega(n^2) Ω(n2)

​ 但是我们证明这种情况不会发生,如图所示:

在这里插入图片描述

​ 我们知道对于中上方的点,需要考虑的点就在下方的紫色区域(我们每次只考虑下方的点),会发现两个点不能在一个小格子里,这是因为如果真的存在,那么这两个点的距离小于 h 2 \frac{h}{\sqrt2} 2 h ,显然也小于 h h h 。然后就会发现了错误,这是因为图中的点属于 A 2 A_2 A2 区,所以他们的距离一定大于等于 h h h 。也就是说,每个格子最多一个点,所以八个格子,最多 8 − 1 = 7 8 - 1 = 7 81=7 个点(要去掉这个点)。

​ 所以此时合并的复杂度就变成了 O ( n ) O(n) O(n) 级别,所以根据主定理就可以快乐得出 O ( n log ⁡ n ) O(n\log n) O(nlogn)

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

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

相关文章

40分钟快速入门Dart基础(上)

教大家快速学习一门新语言&#xff1a; 第一是零基础&#xff1a;那我们只能靠自己脚踏实地的多写多想慢慢熟悉你所选择的语言 &#xff0c;没有别的办法。&#xff08;但是dart确实目前为止最好学的没有之一的语言&#xff09;第二是有基础&#xff1a;小伙伴们如何快速学习…

C++环境设置

本地环境设置 如果您想要设置 C 语言环境&#xff0c;您需要确保电脑上有以下两款可用的软件&#xff0c;文本编辑器和 C 编译器。 文本编辑器 这将用于输入您的程序。文本编辑器包括 Windows Notepad、OS Edit command、Brief、Epsilon、EMACS 和 vim/vi。 文本编辑器的名…

文本编辑格式的 又一次进化 从 txt道md

别再傻傻用txt做笔记了,用md不香吗,可以设置颜色,字体大小 从 txt道md .md 和 .txt 都是文本文件格式&#xff0c;但它们之间有一些区别和进步&#xff1a; .md 文件可以使用 Markdown 语言编写&#xff0c;支持更丰富的文本格式&#xff0c;如标题、列表、链接、图片、代码块…

简化你的代码,提高生产力:这10个Lambda表达式必须掌握

前言 Lambda表达式是一种在现代编程语言中越来越常见的特性&#xff0c;可以简化代码、提高生产力。这篇文章将介绍10个必须掌握的Lambda表达式&#xff0c;这些表达式涵盖了在实际编程中经常用到的常见场景&#xff0c;例如列表操作、函数组合、条件筛选等。通过学习这些Lambd…

【C语言】数组指针-c语言的任督二脉

视频链接:bilibili 关于指针需要注意的地方 只有以下两种情况数组名表示的是整个数组 1.sizeof(数组名) 2.&数组名 除此之外数组名表示的都是首元素地址 一、字符指针 是一个指向字符的指针 int main() {char ch w;char* p &ch;//char* ch2 "abcdef"…

Netty组件Future、Promise、Handler、Pipline、ByteBuf

Future&Promise Netty中的Future与jdk中的Future同名&#xff0c;但是是两个接口&#xff0c;netty的Future继承自jdk的Future,而Promise又对netty Future进行了扩展 jdk Future只能同步等待任务结束(或成功、或失败)才能得到结果netty Future可以同步等待任务结束得到结…

阿里云弹性计算高级产品专家马小婷:ECS 使用成熟度评估与洞察

2023 年 3 月 22 日&#xff0c;【全新升级 阿里云 ECS CloudOps 2.0 来啦】发布会正式播出&#xff0c;本次发布会上阿里云宣布 CloudOps&#xff08;云上自动化运维&#xff09;套件全新升级&#xff0c;并发布了 CloudOps 云上自动化运维白皮书 2.0 版本。阿里云弹性计算高级…

【数据结构】栈和队列(笔记总结)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

DC-1渗透实战

目标机&#xff1a;192.168.26.161 攻击机&#xff1a;192.168.26.144 1、信息收集&#xff1a; 使用ARP扫描&#xff0c;获得信息&#xff1a; arp-scan -l 适应NMAP进行扫描IP为192.168.26.161 &#xff0c;看他开启了哪些端口、服务和操作系统&#xff1a; nmap -A -T…

SQL函数

文章目录一、SQL 函数二、SQL COUNT() 函数三、SQL FIRST() 函数四、SQL LAST() 函数五、SQL MAX() 函数总结一、SQL 函数 SQL 拥有很多可用于计数和计算的内建函数。 SQL Aggregate 函数 SQL Aggregate 函数计算从列中取得的值&#xff0c;返回一个单一的值。 有用的 Aggrega…

「程序员值得一看」| 传说中的“全球公认最健康的作息时间表”

身体是革命的本钱&#xff0c;健康问题关乎我们每一个人&#xff0c;说到健康作息&#xff0c;下面这篇文章还是非常值得我们参考的&#xff0c;当然每个人结合自身可以好好总结一下。 都说程序员这一行&#xff0c;猝死概率极高&#xff0c;究其原因还是很难有很好的作息规律…

【Matlab算法】粒子群算法求解二维线性优化问题(附MATLAB代码)

MATLAB求解二维线性优化问题前言正文函数实现可视化结果前言 二维线性优化问题指的是在二维空间中&#xff0c;对于一个由线性函数构成的目标函数&#xff0c;通过限制自变量的范围或满足特定的约束条件&#xff0c;寻找一个最优解&#xff08;最小值或最大值&#xff09;。这…

面试官 : 你了解的MySQL 集群高可用架构都有哪些?

文章目录 MySQL 主从架构MySQL+DRDB 架构MySQL+MHA 架构MySQL+MMM 架构MySQL 主从架构 此种架构,一般初创企业比较常用,也便于后面步步的扩展 此架构特点: 1、成本低,布署快速、方便 2、读写分离 3、还能通过及时增加从库来减少读库压力 4、主库单点故障 5、数据一致性问题…

Windows上提示 api-ms-win-core-path-l1-1-0.dll 丢失怎么办?

Windows上提示 api-ms-win-core-path-l1-1-0.dll 丢失怎么办&#xff1f;最近有用户在开启电脑的photoshop软件使用的时候&#xff0c;出现另外无法启动软件的情况&#xff0c;因为系统中缺失了对应的dll文件。那么这个情况怎么去进行问题的解决呢&#xff1f;来看看以下的解决…

PyTorch深度学习实战 | 基于YOLO V3的安全帽佩戴检测

本期将提供一个利用深度学习检测是否佩戴安全帽的案例,从而展示计算机视觉中的目标识别问题的一般流程。目标检测是基于图片分类的计算机视觉任务,既包含了分类,又包含了定位。给出一张图片,目标检测系统要能够识别出图片的目标并给出其位置。由于图片中目标数是不确定的,…

JUC并发编程第一章之进程/并发/异步的概念[理解基本概念]

1. 进程和线程的概念 进程: 系统正在运行的一个应用程序;程序一旦运行就是一个进程;进程是资源分配的最小单位 线程: 是进程的实际运行单位;一个人进程可以并发控制多个线程,每条线程并行执行不同的任务 区别: 进程基本上相互独立的;而线程存在于进程内&#xff0c;是进程…

类ChatGPT项目的部署与微调(上):从LLaMA到Alpaca、Vicuna、BELLE

前言 近期&#xff0c;除了研究ChatGPT背后的各种技术细节 不断看论文(至少100篇&#xff0c;100篇目录见此&#xff1a;ChatGPT相关技术必读论文100篇)&#xff0c;还开始研究一系列开源模型(包括各自对应的模型架构、训练方法、训练数据、本地私有化部署、硬件配置要求、微…

如何把多个文件(夹)随机复制到多个文件夹中

首先&#xff0c;需要用到的这个工具&#xff1a; 百度 密码&#xff1a;qwu2 蓝奏云 密码&#xff1a;2r1z 先看文件的情况一共20个兔兔的图片&#xff0c;4个文件夹&#xff0c;把全部的图片随机的复制这些地方去 打开工具&#xff0c;切换到 文件批量复制 版块 找到右下角…

Java EE企业级应用开发(SSM)第3章

第3章Spring Bean装配一.预习笔记 1.Spring中的Bean 在Spring中&#xff0c;一切Java类都被视为资源&#xff0c;而这些资源都被视为Bean&#xff0c;而Spring就是管理这些Bean的容器。 Bean的配置有3种方式&#xff0c;分别是XML文件配置、Java类和注解 2.基于XML的Bean装…

`Caché/IRIS` 代码优化效率提升十一条 - 持续更新

文章目录Cach/IRIS代码优化效率提升十一条 - 持续更新 汇总数据使用多维数组Global取数据时需将Global先赋值变量将表达式直接返回使用块语法的运行效率要比点语法更快复杂的if逻辑条件&#xff0c;可以调整顺序&#xff0c;让程序更高效在循环中取不变的配置时&#xff0c;应使…
最新文章