将点平面分成相等的两半[关闭]

2024-02-24

给定一个二维平面,其中有 n 个点。我需要生成一条线的方程,该线将平面分开,使得一侧有 n/2 个点,另一侧有 n/2 个点。


我假设这些点是不同的,否则甚至可能不存在这样的线。

如果点是不同的,那么这样的线总是存在并且可以使用确定性的O(nlogn) 时间算法。

假设这些点是 P1、P2、...、P2n。假设它们并不都在同一条线上。如果是的话,那么我们就可以轻松地形成分割线。

首先平移点,使所有坐标(x 和 y)均为正值。

现在假设我们神奇地在 y 轴上有一个点 Q,使得这些点形成的线(即任何无限线 Pi-Pj)都不会穿过 Q。

现在,由于 Q 不在点的凸包内,我们可以很容易地看到,我们可以通过穿过 Q 的旋转线对点进行排序。对于某个旋转角度,一半的点将位于一侧,另一半点将位于一侧将位于这条旋转线的另一条上,或者换句话说,如果我们考虑按线 Pi-Q 的斜率排序的点,我们可以选择第(中位数)和(中位数+1)之间的斜率th 点。这种选择可以通过任何线性时间选择算法在 O(n) 时间内完成,而不需要实际对点进行排序。

现在选择点Q。

假设 Q 为 (0,b)。

假设 Q 与 P1 (x1,y1) 和 P2 (x2,y2) 共线。

然后我们就有了

(y1-b)/x1 = (y2-b)/x2(请注意,我们平移了这些点,使得 xi > 0)。

求解 b 给出

b = (x1y2 - y1x2)/(x1-x2)

(注意,如果x1 = x2,则P1和P2不能与Y轴上的点共线)。

考虑|b|。

|b| = |x1y2 - y1x2| / |x1 -x2|

现在让 xmax 为最右边点的 x 坐标,ymax 为最上面点的坐标。

还令 D 为两点之间的最小非零 x 坐标差(这是存在的,因为并非所有 xi 都相同,因为并非所有点都共线)。

然后我们就有了 |b|

因此,选择我们的点 Q (0,b) 使得 |b| > b_0 = xmax*ymax/D

D 可以在 O(nlogn) 时间内找到。

b_0 的大小可能变得非常大,我们可能必须处理精度问题。

当然,更好的选择是随机选A!以 1 的概率,您将找到所需的点,从而使预期运行时间为 O(n)。

如果我们能找到一种在 O(n) 时间内选取 Q 的方法(通过找到其他一些标准),那么我们就可以使该算法在 O(n) 时间内运行。

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

将点平面分成相等的两半[关闭] 的相关文章

  • 如何在 Unity 中对齐“轨道”或模块化对象?

    我正在开发一个简单的游戏 用户可以在其中放置不同但模块化的对象 例如 轨道 道路等 我的问题是 当将一个物体靠近另一个物体时 如何匹配和放置不同的物体 我的第一种方法是为每个模块对象创建一个隐藏的子对象 一个盒子 并将其放在可以放置其他对象
  • 压缩很多小字符串的算法?

    我正在寻找一种压缩小 ASCII 字符串的算法 它们包含大量字母 但也可以包含数字和很少的特殊字符 它们很小 平均约为 50 100 字节 最多 250 个字节 例子 Android show EditText setError above
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 比 BMH (Boyer–Moore–Horspool) 更快的算法

    您会使用哪种算法来搜索短文本中的短子字符串 简而言之 我的意思是子字符串有 5 10 个字符 字符串有 255 个字符 我正在考虑根据输入数据长度选择算法 哪种算法对于较长的输入更好 Try Turbo BM http www igm un
  • 2D形状识别与解析算法

    我正在寻找一种算法 用于从给定的一组 x y 点检测简单形状 如矩形 三角形 正方形和圆形 我还在寻找一种方法 一旦检测到 将路径转换为更干净的形状 我已经查遍了互联网 但没有找到任何 简单 的方法 几乎所有这些对于我的简单实现来说都是高级
  • 如何提高洪水填充例程的性能?

    我正在我的应用程序中实现四路洪水填充 伪代码如下 Flood fill node target color replacement color 1 If the color of node is not equal to target co
  • 将数字的各个数字部分相加/求和的最快方法

    不久前 我在数学论坛上看到一个问题 其中一个人正在讨论一遍又一遍地将数字中的数字相加 直到达到个位数 即 362 将变成 3 6 2 这将变成 11 然后 11 将变成 1 1 将变成 2 因此 362 将返回2 我写了一些很好的代码来得到
  • 最接近 x,y 的线上的点[重复]

    这个问题在这里已经有答案了 可能的重复 如何判断一个点是否在某条线附近 https stackoverflow com questions 910882 how can i tell if a point is nearby a certa
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 在Python中确定句子中2个单词之间的邻近度

    我需要确定 Python 句子中两个单词之间的接近度 例如 在下面的句子中 the foo and the bar is foo bar 我想确定单词之间的距离foo and bar 确定之间出现的单词数foo and bar 请注意 该词
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • 为什么 Math.Round 不返回 int? [复制]

    这个问题在这里已经有答案了 在 C 中 为什么舍入数学函数 Floor Ceiling 和 Round 不返回int 考虑到函数的结果始终是整数 为什么它返回一个float double or decimal double has the
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • Lua 的标准(或最好支持的)大数(任意精度)库是什么?

    我正在处理大量无法四舍五入的数字 使用 Lua 的标准数学库 似乎没有方便的方法来保持精度超过某些内部限制 我还看到有几个库可以加载以处理大数字 http oss digirati com br luabignum http oss dig
  • CGAL:如何有效计算多面体的面面积?

    我有一个多面体 其面是三角形 我知道在 CGAL 中 Triangle 3 类提供了 squared area 方法 通过它我们可以计算三角形的面积 有什么方法可以将其应用到多面体方面吗 或者关于如何计算每个面的面积有什么想法吗 这是一个例

随机推荐