分治算法(算法篇)

算法之分治算法

分治算法

概念

  • 分治算法也是一种思想策略,分治算法就是将大问题不断地分成小问题解决后再重新构建原问题地解。一般地分治算法的时间复杂度为O(NlogN)
  • 递归解决较小的问题;:然后,从子问题的解构建原问题的解。分治算法中我们一直坚持子问题是不相交的(即基本不重叠)

最近点问题

概念:

  • 对于平面内存在一个点集P,找到点集P中的最小距离的点对(两个点的距离在点集中所有点产生的距离中最短)。
  • 如果按照简单地方法解决就需要嵌套循环导致时间复杂度为O(N²),但是这个时间复杂度太大了,因此我们就是用到分治

解决方法

  • 点集P按照x轴进行排序

    • 对于每个递归操作将点集P分成两个点集PL和PR找出dL,dc,dR这之间的最小值,然后递归返回解得到最终问题的解
  • dL是在点集PL最短距离的点对的距离dc跨越点集PL和PR的最短距离的点对的距离dR在点集PR最短距离的点对的距离

  • dc的求法令 δ=min(dL,dR),如果出现dc更小的情况,则dc的两个点必然在分割线的左右各δ的距离之内,我们将这个区域叫做一条带。我们带的区域内的点按照y轴排序,如果两个点的y轴坐标相差大于δ,则dc,因此就可以不进行判断直接跳过,处理下一对点对。伪代码如下:

    //先将带区域内的点按照y轴排序
    //NumPoint为带区域的点集的点个数
    for(int i=0;i<NumPoint;i++){for(int j=i+1;j<Numpoint;j++){//判断点对的y轴距离是否大于δif(diff(pi.y,pj.y)>δ){break;}else if(diff(pi,pj)<δ){    //判断pi到pj的距离是否小于δδ=diff(pi,pj);}}
    }
    

选择问题

概念

  • 选择问题要求我们找出含N个元素的表S中的第k个最小的元素
  • 该问题的解法虽然使用了分治算法的策略,但是他在分之后只需要求解一个子问题,也不需要合并子问题求解,换句话来说,这个问题就是将大问题不断地分找到属于这个问题地解。

具体做法

  • 每次递归操作选取一个枢纽元v将集合S根据枢纽元分成S1,S2两个集合,S1的元素小于枢纽元,S2的元素大于枢纽元
  • 如果k<=|S1||S1|为集合S1的元素个数,就递归集合S1求解集合S中的第k个最小元素。
  • 如果k=|S1|+1,则枢纽元就是第k个最小元素
  • 否则在S中的第k个最小元素是S2中的第(k-|S1|-1)个最小元素

五分化中项法

  • 这也是一个选取枢纽元的方法,这个算法的性能更高

概念

  • 把N个元素分成向下取整(N/5)组,5个元素一组,忽略(最多4个)剩余的元素
  • 找出每组的中项(中间值)得到向下取整(N/5)个中项的表M
  • 求出M的中项,将其作为枢纽元v返回

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

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

相关文章

linux 网络子系统

__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数&#xff0c;它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析&#xff1a; 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…

【简历】贵州某二本学院:JAVA秋招简历指导,简历通过率基本为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份某师范学院25届二本同学的Java简历。这种就是每年都会出现的少量的完全不知道简历应该怎么写的同学。 所以这个简历&#xff0…

Java实现七大排序(一)

目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.选择排序 2.堆排序 三.总结 一.插入排序 1.直接插入排序 直接插入排序的原理与线下玩扑克牌类似。我们拿到一张牌后要排序&#xff0c;方法就是一张一张对。直接插入排序也是这样的&#xff0c;我们得到一张…

虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容

1.虚拟机在VCenter上从一个ESXi迁移到另一个ESXi上时报错&#xff1a;虚拟机版本与主机“x.x.x.x”的版本不兼容。 2.例如从10.0.128.13的ESXi上迁移到10.0.128.11的ESXi上。点击10.0.128.10上的任意一台虚拟机&#xff0c;查看虚拟机版本。 3.确认要迁移的虚拟机磁盘所在位…

java28-SpringMVC

概述 Spring框架是分层的全栈式的轻量级开发框架&#xff0c;以IOC和AOP为核心&#xff0c;地址https://spring.io/ 组成 Data Access/Integration&#xff08;数据访问/继承&#xff09; JDBC模块&#xff1a;提供一个JDBC抽象层&#xff0c;大幅度减少了在开发中对数据库…

【Webpack】HMR 热更新

HMR全称Hot Module Replacement&#xff0c;可以理解为模块热替换&#xff0c;指在应用程序运行过程中&#xff0c;替换、添加、删除模块&#xff0c;而无需重新刷新整个应用。 不使用热更新&#xff0c;我们在应用运行过程中修改了某个模块&#xff0c;通过自动刷新会导致整个…

MySQL--索引(3)

1.索引创建注意点 选择合适的字段 1.不为 NULL 的字段 索引字段的数据应该尽量不为 NULL&#xff0c;因为对于数据为 NULL 的字段&#xff0c;数据库较难优化。如果字段频繁被查询&#xff0c;但又避免不了为 NULL&#xff0c;建议使用 0,1,true,false 这样语义较为清晰的短值或…

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…

力扣3226 使两个整数相等的位更改次数

写的代码&#xff1a; class Solution { public:string cc(int num){string res"";while(num>0){int rnum % 2;resstatic_cast<char>(48r)res;num/2;}return res;}int minChanges(int n, int k) {int res0;string n2cc(n);string k2cc(k);int n_sizen2.siz…

机器人开源调度系统OpenTCS-6最新版本地源码运行

OpenTCS 项目使用 Gradle 而不是 Maven&#xff0c;那么需要使用 Gradle 来导入和构建项目。在 IntelliJ IDEA 中导入和运行使用 Gradle 的项目&#xff0c;可以按照以下步骤进行操作&#xff1a; 克隆 OpenTCS 源码 首先&#xff0c;克隆 OpenTCS 的源码到本地。您可以使用以…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

ASP.NET中的六大对象有哪些?以及各自的功能以及使用方式

在ASP.NET Web Forms中&#xff0c;并没有严格意义上的“六大对象”&#xff0c;但通常我们指的是与HTTP请求和响应处理紧密相关的几个内置对象。以下是这些对象及其功能、使用方式以及简单的实现源码示例&#xff1a; Response对象 功能&#xff1a;用于向客户端发送HTTP响应…

UWB实操:使用 litepoint 测线损 pathloss

使用 litepoint 测线损 pathloss 把信号线接到 litepoint 的RF1 和RF2。 注意: RF1 支持 VSG(TX) 和VSA(RX)RF2 只支持 VSG(TX)同一时间只能一个 VSG(TX)双击 LED STATUS,改变RF1和RF2的模式。 RF1:VSA(RX) RF2:VSG(TX) Technology选择GPRF

cf场+线性dp

Problem - B - Codeforces 思路&#xff1a; 这其实是一道数学题&#xff08;最开始一直在枚举&#xff0c;服啦&#xff09; 我们的目的是求最大利润 当a>b是时直接令k0,利润n*a即可 当a<b时存在两种情况&#xff1a; 1.b-a>n即所有b-i1的情况都>a&#xff0…

掌握Python:三本不可错过的经典书籍

强烈推荐Python初学者用这三本书入门! Python3剑客 一、《Python编程从入门到实践》 这本书适合零基础的Python读者&#xff0c;旨在帮助他们快速入门Python编程&#xff0c;并达到初级开发者的水平。书中深入浅出地介绍了Python的基础概念&#xff0c;如变量、循环、函数等…

【BUG】已解决:ModuleNotFoundError: No module named ‘tensorboard‘

ModuleNotFoundError: No module named ‘tensorboard‘ 目录 ModuleNotFoundError: No module named ‘tensorboard‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

爬虫学习4:爬取王者荣耀技能信息

爬虫&#xff1a;爬取王者荣耀技能信息&#xff08;代码和代码流程&#xff09; 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…

主机加固,如何重塑产线工控安全的防勒索病毒生态

在数字化转型的浪潮中&#xff0c;企业信息安全面临着前所未有的挑战&#xff0c;尤其是针对主机层面的攻击手段愈发狡猾。MCK主机加固系统&#xff0c;作为新一代主机安全防护方案&#xff0c;凭借其独步业界的内核级签名校验技术和深度学习驱动的业务场景白名单策略&#xff…

【C++】马蹄集02 自守数II

输入正整数N&#xff0c;检查该数是否为自守数输出YES或者NO。当且仅当一个数的平方以与该数相同的数字结尾时该数称为自守数。 格式 输入格式&#xff1a;输入正整数N 输出格式&#xff1a;输出YES或者NO 样例1 输入&#xff1a;76 输出&#xff1a;YES 代码 利用substr…