凸包中最大的三角形

2024-06-22

这个问题已经得到解答,但我面临的主要问题是理解答案之一..

From https://stackoverflow.com/a/1621913/2673063 https://stackoverflow.com/a/1621913/2673063

下面的算法是怎样的O(n) ?

它指出 如果有必要,首先对点进行排序/计算凸包(在 O(n log n) 时间内),我们可以假设我们有凸多边形/凸包,其中的点按照它们在多边形中出现的顺序循环排序。称这些点为 1, 2, 3, … , n。让(变量)点 A、B 和 C 分别从 1、2 和 3 开始(按循环顺序)。我们将移动 A、B、C,直到 ABC 成为面积最大的三角形。 (这个想法类似于计算直径(最远对)时使用的旋转卡尺方法。)

在 A 和 B 固定的情况下,只要三角形的面积增加,即只要满足面积(A,B,C) ≤ 面积(A,B,C+1)。对于固定的 A 和 B,该点 C 将是最大化面积 (ABC) 的点。(换句话说,函数面积 (ABC) 作为 C 的函数是单峰的。)

接下来,如果增加了面积,则推进 B(不改变 A 和 C)。如果是这样,请再次按上述方式推进 C。然后如果可能的话再次推进B,等等。这将给出以A为顶点之一的最大面积三角形。 (到这里的部分应该很容易证明,并且简单地为每个 A 单独执行此操作将给出 O(n2)。但是请继续阅读。)现在再次推进 A,如果它改善了面积等。 虽然这有三个“嵌套”循环,但请注意,B 和 C 总是“向前”前进,并且它们总共最多前进 2n 次(类似地,A 最多前进 n 次),因此整个过程需要 O(n) 时间运行。


作为作者答案 https://stackoverflow.com/a/1621913/4958这就是问题的主题,我觉得有必要更详细地解释一下O(n)运行。


首先,作为一个例子,这是论文中的一张图,显示了针对特定样本输入(12 边形)的算法的前几个步骤。首先我们从A、B、C作为三个连续的顶点开始(图中的步骤1),只要面积增加就推进C(步骤2到6),然后推进B,依此类推。

上面带有星号的三角形是“锚定局部最大值”,即对于给定 A 来说最好的三角形(即,前进 C 或 B 会减小面积)。


就运行时而言O(n):设 B 的“实际”值(以递增次数表示并忽略回绕)为 nB,类似地,C 为 nC。 (换句话说,B = nB % n and C = nC % n.) 现在请注意,

  1. (“B 领先于 A”)无论 A 的值是多少,我们都有 A ≤ nB

  2. nB一直在增加

因此,当 A 从 0 到 n 变化时,我们知道 nB 仅在 0 到 2n 之间变化:它最多可以递增 2n 次。类似地,nC。这表明算法的运行时间与 A、B 和 C 递增的总次数成正比,受 O(n) + O(2n) + O(2n) 限制,即 O(n )。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

凸包中最大的三角形 的相关文章

  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • C# Visual Studio 动态代码片段

    我正在开发一个 WinForms 项目 每天都会执行一些重复性的任务 所以我认为创建代码片段 https msdn microsoft com en us library ms165394 v vs 110 aspx会帮助我 但它仅适用于固
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState

随机推荐

  • 如何使用 multer 在 Node.js 中设置不同的目的地?

    我正在尝试使用上传任何文件穆特包 https www npmjs org package multer 当我在我的中使用以下代码时它工作正常server js file var express require express app exp
  • asp5 IConfigurationRoot 获取 json 数组

    我正在尝试向我的 asp 5 mvc 6 Web 应用程序 rc1 final 库 提供一些额外的配置数据以部署在 Azure 上 此附加数据的一部分由 json 文件中的数据数组组成 我可以将此 json 文件添加到我的配置中 并且在调试
  • 提交未经允许的参数时如何引发异常?

    我找到了这段代码here http edgeapi rubyonrails org classes ActionController Parameters html ActionController Parameters action on
  • FIRMessaging 委托错误

    我尝试添加 FIRMessagingDelegate 但 Xcode 给出错误 Cannot find protocol declaration for FIRMessagingDelegate 我导入了 FirebaseMessaging
  • 如何使用 JavaScript/CSS 制作圆形 ScrollBox?

    我想重新创建圆形滚动框 如下面的 GIF 所示 我不认为如果使用 css 制作圆形滚动框是可能的 那么我想添加padding left给每个孩子ul使滚动框显示为圆形 为了达成这个 向 li 1 添加 0px 的内边距向 li 2 添加 2
  • 致命错误:未捕获错误:无法使用标量作为数组警告

    我有以下代码 final 1 gt 2 id 1 final id 0 3 该代码似乎工作正常 但我收到此警告 警告 不能在第 X 行中将标量值用作数组 符合 final id 0 3 谁能告诉我如何解决这个问题 你需要设置 final i
  • Coq执行分号“;”的区别和句号“.”

    给定一个有效的 Coq 证明 使用 战术上 是否有一个通用公式可以将其转换为有效的等效证明 替代 许多 Coq 证明都使用 或战术排序战术 作为初学者 我想观察各个步骤的执行 所以我想替换 for 但令我惊讶的是 我发现这可能会破坏证明 有
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • 我应该使用 Node.js 而不是 Rails 来实现实时 Web 应用程序吗?

    我正在构建一个复杂的网络应用程序 该应用程序必须大量处理实时数据并向用户显示该数据 鉴于我更习惯Rails 我想知道转储rails并使用node js来构建应用程序是否有很大的优势 或者是否有一种方法可以在Rails中拥有Node js的实
  • 我什么时候应该中断一个函数?

    将长函数分解为主函数和辅助函数是明智的做法 我知道模块外部只会调用主要函数 但它的长度可能会令人生畏 课本对行数有限制 但我觉得这太死板了 附 我正在用 Python 编程 需要处理传入的消息 该函数返回一个包含消息的元组 但采用 Pyth
  • DOT/graphviz 边缘标签中的下标

    如何使用 Graphviz DOT 的 HTML 功能向边缘标签添加下标字符 像这样 digraph g 1 gt 2 label
  • “iOS 17.0.simruntime”无法打开,因为无法验证开发者

    我刚刚下载了 iOS 17 运行时 但将其复制到目标位置后 会打开此弹出窗口 并且 Xcode 无法按预期使用模拟器 Downloaded from the Apple Developer site 我怎样才能解决这个问题 可以打电话sim
  • 生成唯一的机器 ID

    我需要编写一个函数来生成一个对于运行 Windows 操作系统的给定机器来说唯一的 id 目前 我正在使用 WMI 查询各种硬件参数 并将它们连接在一起并对它们进行哈希处理以得出唯一的 id 我的问题是 我应该使用哪些建议参数 目前 我使用
  • 如何保存Chrome的Coverage工具分析的结果?

    乍一看 它看起来像是非常有用的工具 但是我找不到任何类似的操作Save或类似的选项 有谁知道是否可以保存Chrome的Coverage工具分析的结果 谢谢 正如上面的评论中提到的 以及标记重复 https stackoverflow com
  • 具有不同时间步长的卡尔曼滤波器

    我有一些数据代表从两个不同传感器测量的物体的位置 所以 我需要进行传感器融合 更困难的问题是来自每个传感器的数据基本上是在随机时间到达的 我想使用 pykalman 来融合和平滑数据 pykalman如何处理可变时间戳数据 数据的简化示例如
  • 如何仅列出 Bash 目录中的文件而不列出目录?

    如何列出一个文件夹的所有文件 但不列出其文件夹或子文件 换句话说 我怎样才能只列出文件 Using find find maxdepth 1 type f 使用 maxdepth 1选项确保您只在当前目录中查找 或者 如果您替换 与某个路径
  • 如何限制 celery 中运行的任务数量

    我有一个在 Heroku 上运行的应用程序 我使用 celery 和工作测功机来处理后台工作 我正在运行使用大量内存的任务 这些任务大致在同一时间启动 但我只想同时运行一两个任务 其他任务必须在队列中等待 我怎样才能做到这一点 如果它们同时
  • 有没有可能通过 Android Studio 在 Android 的 Windows 子系统上运行 Android 应用程序?

    如果我们能够在 Android 的 Windows 子系统上调试 Android 应用程序 那就太好了 当然这是可能的 它的工作原理与任何外部设备类似 首先在 Windows 子系统中启用 Android 设置应用程序的开发人员模式 And
  • rand()/srand()函数是如何在C中实现的[重复]

    这个问题在这里已经有答案了 可能的重复 rand 是如何工作的 它有一定的倾向吗 有没有更好用的东西 https stackoverflow com questions 3539398 how does rand work does it
  • 凸包中最大的三角形

    这个问题已经得到解答 但我面临的主要问题是理解答案之一 From https stackoverflow com a 1621913 2673063 https stackoverflow com a 1621913 2673063 下面的