最小圆覆盖(html)

最小圆覆盖问题是什么呢?就是指在二维平面上有一堆点,然后我们要求一个最小半径的圆能够将所有点全部都包住,这就是最小圆覆盖问题。


最小覆盖圆的性质

性质1:最小覆盖圆是唯一的

证明:我们假设有两个圆O1,O2,他们半径都是r,都是最小覆盖圆,那么所有的点一定在两圆的交集部分。那我们以两圆交集部分的弦长为直径,做一个新圆,该圆依旧包含所有点,而且他的直径是原来圆的弦长,一定是小于原来圆的直径的,因此和原来的圆是最小覆盖圆相矛盾,所以最小覆盖圆是唯一的。
eg

性质2:若圆O1是点集S的最小覆盖圆,则再新加一点p,他在集合S的外部,则新点集的最小覆盖圆一定过点p,即p一定在最小覆盖圆上。

同理我们明显能看到,若新的最小覆盖圆将S点集包住也将p包住,过点p的圆半径一定最小。
我们将这个大圆朝原先的小圆缩小,在缩小的过程中一定会过点p,p就是这个临界状态,因为在不断缩小,所以p一定在既包含S又包含p的最小覆盖圆上。
在这里插入图片描述

性质3:最终的最小覆盖圆一定只有两种情况:1是圆上至少有三个点,由三点限制一个圆(三点共圆);2是圆上只有两个点,则该圆一定是以该两点的连线为直径的。

如果最小覆盖圆上只有一个点的话,我们肯定可以通过平移加缩小找到一个更小的圆包住所有点,与最小不符。
eg


最小圆覆盖算法步骤

随机增量法:就是从所有点里随机选一个加入自己的集合中,然后维护这个集合,然后再随机选一个点加入集合,再维护… 直到所有点都加入这个集合,那么最终的这个集合就是满足我要求的情况了。
然后我们找一个圆就是看能不能找到这个圆上的三个点。

首先我们先将所有点随机化
三层循环第一层从2到n循环i,我们将圆初始化为以第一个点为圆心,半径为0的圆。然后我们要循环判断i点在圆内还是在圆外,若在圆内(在圆上也认为是圆内),那Ci和Ci-1是相同的,我们直接循环i+1就行了;如果i在圆外,那么Ci一定过点i(性质2),然后我们就进第二层循环。
第二层从1到i-1循环j,我们将圆先初始化为以点i为圆心,0为半径的圆,然后不断去加点j,若j在圆内,就继续循环j+1;若j在圆外,就再进第三层循环。
第三层从1到j-1循环k,将圆先初始化为以i和j为直径的圆,然后再循环判断k,若在圆内,就继续循环下一个k+1;若k在圆外,就将圆更新为i、j、k三点确定的圆,直到最后求出来的圆就是最小覆盖圆。


证明

如果只看步骤的话挺简单,可跳过证明,看后面的代码模板即可。

这个证明还是比较绕的,要用到前面的三条性质。我们的目的是为了找到三个点来确定这个圆。首先最外层循环1-n,圆最初是以第一个点为圆心,半径为0的圆。然后我们每次循环到i时,我们已经知道了前i-1个点的最小覆盖圆了,然后我们就判断点i,若i在圆内,那就不用管i了,直接循环下一个点i+1,因为Ci和Ci-1是同一个圆;若i在圆外,那么Ci一定过i点。
现在我们知道了一个信息,1-i的最小覆盖圆过i点,但我们无法确定这个圆(因为我们只知道这个圆上的一个点),那么我们就再来一层循环:从1到i-1循环j,根据我们已知的信息(Ci必过i点),我们现在要求的就是过i点的包含1-j个点的最小覆盖圆。所以我们将圆初始化为以i为圆心,以0为半径的圆,不断地去加j,判断j在圆内还是圆外,圆内就不用管;在圆外的话就说明我们求得的圆一定过点j(性质2依然适用)。
那么现在我们就又知道了一个信息,Ci必过i点和j点,我们就利用这个信息,既然Ci必过i点和j点,那么我们就只看过i和j的圆。所以我们将圆初始化为以i、j为直径的圆(这个圆是包含i、j的最小覆盖圆)。然后我们再来一层循环:从1到j-1循环k,根据我们得到的信息,我们要求过i和j点且包含1-k个点的最小覆盖圆。然后我们循环判断k,若k在圆内,就下一个;若k在圆外,就说明新圆一定过k(性质2),我们就得到了一个过i、j、k三点的圆,因此也就确定了一个唯一的圆。
当k循环到j-1时,就说明我们找到了一个包含1到j-1,并且i和j都在圆边上的最小覆盖圆;然后当j循环到i-1时,就说明我们找到了一个包含1到i-1且i点在圆边是的最小覆盖圆;然后当i循环到n时,就说明我们找到了一个包含1到i-1且i点在圆边上的最小覆盖圆,即包含前n个点的最小覆盖圆。

然后还有一个问题就是已知三点,如何求圆。就是求这三点组成的三角形的外接圆。求出三角形两个边的中垂线,再求出中垂线交点就是圆心,圆心到任意一点的距离就是半径。求中垂线的话得先求出两边的中点,再求出两个边绕端点旋转90°的向量,直到一点和这条直线的向量,就可以写出点向式了。关于向量旋转、求交点函数都在基础知识中有。

然后来看看他的时间复杂度,虽然看着是三重循环,但是复杂度并不 O ( n 3 ) O(n^3) O(n3),因为每次循环下一层前都有一个判断,平时该点是不是在圆上,而三点确定一个圆,所以我们只有 3 n \frac 3 n n3的机会循环下一层,循环j层和k层的复杂度都是 3 n ∗ O ( n ) \frac 3 n * O(n) n3

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

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

相关文章

如何解决You have an error in your SQL syntax

当遇到 "You have an error in your SQL syntax" 这类错误时,通常表明 SQL 语句存在语法错误。这类错误通常会给出具体的错误位置和可能的原因。下面是一些详细的解决步骤: 解决方法:查看错误提示:错误提示通常会显示具体的 SQL 语句和出错的位置。例如: You ha…

网络安全C10-2024.9.15-Nmap、Xray、Nessus和AWVS使用扫描

1、安装并使用Nmap扫描一个地址(本机、VPS、虚拟机环境都可以),提供扫描结果截图nmap下载安装: https://nmap.org/download#windowsnmap概述: Nmap(“Network Mapper<网络映射器>”)是一款开放源代码的网络探测和安全审核的工具。 Nmap输出的是扫描目标的列表,以…

Warning: Cannot redeclare function_name()

"Warning: Cannot redeclare function_name()"原因:尝试重新声明已存在的函数。 解决方法:检查是否有重复定义函数的情况,确保每个函数只定义一次。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javas…

2024-08-29-SEA-RAFT-中英对照

SEA-RAFT: Simple, Efficient, Accurate RAFT for Optical Flow SEA-RAFT:简单、高效、准确的光流RAFT算法 Yihan Wang, Lahav Lipson, and Jia Deng 王一涵,Lahav Lipson,和Jia Deng Department of Computer Science, Princeton University {yw7685, llipson, jiadeng}@pr…

You have an error in your SQL syntax

"You have an error in your SQL syntax"原因:SQL语句语法错误。 解决方法:检查SQL语句,确保语法正确。例如,如果提示在LIMIT子句附近出错,检查LIMIT后面的参数是否合法。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MY…

Parse error: syntax error

"Parse error: syntax error"原因:这通常表明PHP在解析脚本时遇到了语法错误。 解决方法:检查错误提示中的文件和行号,查找语法错误,如括号不匹配、拼写错误、遗漏的分号等。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+…

帝国CMS提示parseerrorsyntaxerror如何解决

当帝国CMS提示“Parse error: syntax error”时,这通常意味着PHP在解析脚本时遇到了语法错误。这种错误可能是由多种原因引起的,以下是一些常见的解决方法: 解决方法:检查PHP版本兼容性:如果你正在使用的是较新的PHP版本(比如PHP 7及以上),而帝国CMS的某些部分代码可能…

帝国cms前台错误报告 帝国cms负载

帝国CMS的错误报告功能允许用户在前端报告网站上的错误,这些报告会被记录下来供管理员查看和处理。同时,帝国CMS还提供了对站点负载监控的功能,以帮助管理员了解网站的运行状态。 帝国CMS错误报告 错误报告功能可以帮助收集来自用户的反馈,包括但不限于页面加载失败、链接失…

DLX

写这玩意的原因是初赛做到了 SadBee csdn 第一部分:DLX算法的提出 1.1一类被称为精确覆盖的问题 在计算机科学中,精确覆盖问题指找出这样的一种覆盖,或证明其不存在。 满足以下条件的集合为一个精确覆盖:S*中任意两个集合没有交集,即X中的元素在S*中出现最多一次 S*中集合…

【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境转换为管理域。

VMware Cloud Foundation 5.2 发布并引入了一个新的功能,借助 VCF Import Tool 工具可以将现有 vSphere 环境直接转换(Convert)为管理工作负载域或者导入(Import)为 VI 工作负载域。通过这种能力,客户无需购买新硬件和进行复杂的部署和迁移工作,即可将已有的环境快速转变…

大模型应用开发初探 : 通用函数调用Planner

自动函数调用对大模型有较高的要求,比如Azure OpenAI、智谱AI等这些收费的大模型产品就能很好地规划和处理函数调用,而像是一些开源的小参数量的模型例如qwen2-7b-instruct这种可能效果就不太好。刚好,之前在网上看到一位大佬的开源通用函数调用的方案,于是重构了一下上一篇…

vuex状态管理 - 使用教程

vuex使用教程一、概述 1.组件之间的数据共享 (小范围内的数据共享) ​ 父向子传值:v-bind 属性绑定 ​ 子向父传值:v-on 事件绑定 ​ 兄弟组件之间共享数据:$on 接受数据的那个组件 $emit 发送数据的那个组件2.vuex是实现组件全局状态(数据)管理的一种机制,可以…