首页 > 其他分享 >最小圆覆盖(html)

最小圆覆盖(html)

时间:2024-09-20 09:24:44浏览次数:10  
标签:Ci 覆盖 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​

标签:Ci,覆盖,html,最小,循环,圆内,我们
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18421832

相关文章

  • MySQL 中的索引覆盖扫描:加速查询的秘密武器
    在MySQL数据库的使用中,索引是提高查询性能的重要工具。而索引覆盖扫描(IndexCoveringScan)更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下MySQL中的索引覆盖扫描是什么。一、什么是索引覆盖扫描在MySQL中,当查询语句所需要的所有列的数据都可以从索引中直......
  • HTML基础和常用标签
    “合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。”文章目录前言文章有误敬请斧正不胜感恩!1.HTML的基本结构解释:2.常见标签的介绍2.1标题和文本2.2链接和图片2.3列表2.4表格2.5表单2.6其他常用标签3.HTML5新标签(语义化标签)4.HTML注释5.查阅文档......
  • 最小点覆盖问题
    E.AlgebraFlash做这道题的时候新学的算法,叫做最小点覆盖.令\(c_i\)为在\(i\)位置的颜色首先了解题意,由于我们只能跨\(1\)~\(2\)步,故此时如果有\(c_i=c_{i+1}\),则\(c_i\)这个颜色是必选的,若两者不相等,也必须从两者里面选择出一个来,那么我们可以给相......
  • 用来测试 autosize.js 的 HTML 代码,自动适应 textarea 高度
     1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>VueAutosiz......
  • 如何把PDF转换成HTML?
    这篇文章会教你4种把PDF转换为HTML的方法,并对比每种方法的优缺点。虽然PDF是一种可靠且高效的文档格式,但把PDF转换为HTML5(最新版本的HTML)可以让用户通过新方式的与文档进行交互,从而给文档增加商业价值。将PDF转换为HTML的方法方法1:把PDF页面作为图像展示把PDF页面在HTML5中......
  • HTML讲解(一)body部分
    目录1.什么是HTML 2.HTML基本框架3.标题声明4.修改标题位置5.段落声明6.修改段落位置7.超链接访问8.图像访问9.改变网页背景及文本颜色10.添加网页背景图11.超链接改变颜色12.设置网页边距小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化!......
  • HTML讲解(二)head部分
    目录1. 2.的使用2.1charset2.2name2.2.1describe关键字2.2.2keywords关键字2.2.3author关键字2.2.4http-equiv小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化!     讲解声明:在HTML中,<head>内容的部分可以包括以下部分我们......
  • 【高中数学/等比数列/基本不等式】已知正项等比数列{an}满足a_4^2=a_m*a_n,则9/m+1/n
    【问题】(甘肃高台县第一中学某年模拟测试(文))已知正项等比数列{an}满足a_4^2=a_m*a_n,则9/m+1/n的最小值为?【出处】《高考数学极致解题大招》P119典例16中原教研工作室编著【解答】a_4=aq^3a_4^2=a^2*q^6a_m=aq^m-1a_n=aq^n-1因为a_4^2=a_m*a_n,所以q^6=q^m+n-2,即m+n=89/m+1/n=9/m*......
  • 从零开始搭建自己的个人博客——前端篇之前端“三剑客”(html、css和js)的介绍
    第一章前言    我们总听大佬们常说编程有前端和后端之分,但是关于前端和后端我们总是一知半解,而我们想要搭建自己的个人博客,那么必然避免不了对前端网页的接触。本篇文章就是对前端进行介绍,你可以了解到什么是前端“三剑客”,它们都有什么作用。    不过,关于......
  • 最小二乘解的理解
    记录一下工作时遇到的拟合问题,将两个数据的关系建模为最小二乘的模型:\[y=a_0+a_1x+a_2x^2+a_3x^3+a_4x^4\]使用了python里面的numpy.linalg.lstsq函数进行拟合,以下是一个简单的示例importnumpyasnpimportmatplotlib.pyplotasplt#样本数据点x=np.a......