计算圆交点 O( (n+s) log n)

2024-03-03

我试图弄清楚如何设计一种算法,可以以 O((n+s) log n) 复杂度完成此任务。 s 是交叉点的数量。我尝试在互联网上搜索,但找不到真正的东西。

无论如何,我意识到拥有良好的数据结构是关键。我在java中使用红黑树实现:TreeMap。我还使用著名的(?)扫描线算法来帮助我处理我的问题。

让我先解释一下我的设置。

我有一个调度程序。这是一个 PriorityQueue,我的圈子根据最左边的坐标排序(升序)。scheduler.next()基本上轮询 PriorityQueue,返回下一个最左边的圆圈。

public Circle next()
{ return this.pq.poll();    }

我这里还有一个包含 4n 个事件点的数组。假设每个圆有 2 个事件点:最左边的 x 和最右边的 x。调度程序有一个方法sweepline()来获取下一个事件点。

public Double sweepline()
{ return this.schedule[pointer++];    }

我也有一个状态。更精确的扫线状态。根据该理论,状态包含有资格进行相互比较的圈子。在整个故事中使用扫描线的目的是,您可以排除许多候选者,因为它们根本不在当前圆圈的半径内。

我用一个实现了 StatusTreeMap<Double, Circle>。双为circle.getMostLeftCoord().

此 TreeMap 保证插入/删除/查找的 O(log n)。

算法本身的实现如下:

Double sweepLine = scheduler.sweepline();
Circle c = null;
while (notDone){
    while((!scheduler.isEmpty()) && (c = scheduler.next()).getMostLeftCoord() >= sweepLine)
        status.add(c);


    /*
     * Delete the oldest circles that the sweepline has left behind
     */
    while(status.oldestCircle().getMostRightCoord() < sweepLine)
        status.deleteOldest();

    Circle otherCircle;
    for(Map.Entry<Double, Circle> entry: status.keys()){
        otherCircle = entry.getValue();
        if(!c.equals(otherCircle)){
            Intersection[] is = Solver.findIntersection(c, otherCircle);
            if(is != null)
                for(Intersection intersection: is)
                    intersections.add(intersection);
        }
    }

    sweepLine = scheduler.sweepline();
}

EDIT: Solver.findIntersection(c, otherCircle);返回最多 2 个交点。重叠的圆不被视为有任何交点。

SweepLineStatus 的代码

public class BetterSweepLineStatus {

TreeMap<Double, Circle> status = new TreeMap<Double, Circle>();

public void add(Circle c)
{ this.status.put(c.getMostLeftCoord(), c);     }

public void deleteOldest()
{ this.status.remove(status.firstKey());    }

public TreeMap<Double, Circle> circles()
{ return this.status;       }

public Set<Entry<Double, Circle>> keys()
{ return this.status.entrySet();    }

public Circle oldestCircle()
{ return this.status.get(this.status.firstKey());   }

我测试了我的程序,显然有 O(n^2) 复杂度。 我在这里缺少什么?我们非常欢迎你们提供任何意见。

提前致谢!


您无法找到所有交点n平面内的圆圈O(n log n)时间,因为每对圆最多可以有两个不同的交点,因此n圈子最多可以有n² - n不同的交点,因此它们不能被枚举O(n log n) time.

获得最大数量的一种方法n² - n交点是放置n等半径的圆r在一条长度线的互不相同的点上l < 2r.

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

计算圆交点 O( (n+s) log n) 的相关文章

  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • python pandas 中的多个数据框到单个 excel 文件(两个不同的工作表)

    我有两个从数据库处理的数据帧 我需要将这些数据框导出到两个不同工作表中的 excel libreoffice calc 中 DF1 symbol datetime value 0 MOV 06 25 02 148767 1 TBI 06 2
  • 无法在 Mono 3 上的 xsp 上运行 asp.net 4.5 应用程序

    我已经从源代码 tarball 构建了 Mono 3 0 2 并从最新的 tarball 和 Github 上的最新版本构建了 XSP 但我无法使用 net 4 5 运行相对简单的 asp net 应用程序 因为它看到 web config
  • ASP.NET 中的确认消息

    我在代码中写下了这样的声明 Response Write 如果用户单击 确定 或 取消 按钮 我该如何处理 您应该将此确认添加到您的提交按钮中 如下所示 btnSubmit Attributes onclick return confirm
  • React Router:无法读取未定义的属性“image Id”

    我正在尝试将 React Router 用于反应本机项目 在我的 index js 文件中 我有
  • 检查字符串中的任何字符是否是字母数字

    我想检查字符串中的任何字符是否是字母数字 我为此编写了以下代码并且运行良好 s input temp any i isalnum for i in s print temp 我的问题是下面的代码 它与上面的代码有什么不同 for i in
  • C# Linq 中的多级包含

    我想在我的 linq 语句中包含 MULTILEVEL 例如 var a departments include u gt u Customers include u gt u Customers Include u gt u Orders
  • 使用列表的递归 - Haskell

    我正在尝试编写一个递归函数 该函数将包含整数列表的列表作为输入并返回类型为 Int Int 的元组 Int Int 这是一个 棋盘游戏 您将获得一个棋盘 5 4 3 8 6 0 2 1 0 7 0 1 9 4 3 2 3 4 0 9 这将是
  • Excel 两个时间之间的 IF AND 公式

    我想要一个公式 它可以告诉我单元格中的时间是否在其他单元格中的两个单独值之间 如果是 则返回一个值 我已经创建了下面的代码 但这根本不返回任何值 IF AND F4 gt R 1 F4
  • 在 PostgreSQL 中创建约束时,有没有办法处理 JSON 数组的所有元素?

    PostgreSQL 是否提供任何符号 方法来施加约束eachJSON 数组的元素 一个例子 create table orders data json insert into orders values order id 45 produ
  • Python:repr 与反引号

    在Python中 有什么区别repr和反引号 1 左边 用于演示 class A object def repr self return repr A def str self return str A gt gt gt a A gt gt
  • 如何在 AspNet5 / Mvc6 中检测 dnx451 Web 应用程序关闭?

    为了能够关闭后台进程 使用 Quartz Net 实现 我需要检测 AspNet5 beta8 中的 Web 应用程序关闭 在以前版本的 Asp Net 中 可以在 Application End 上执行代码 AspNet5 中的 Appl
  • 如何从BitmapImage获取BitmapSource?

    如何从BitmapImage获取BitmapSource 或者如何直接将BitmapImage转换为BitmapFrame 在我看来 如果我有 BitmapSource 我可以使用 BitmapFrame Create 并最终从给定的 Bi
  • Netbeans GUI 预览与运行时视图不同

    我正在使用 NetBeans 及其 GUI 编辑器开发一个简单的 Java 应用程序 我坚持创建一个简单的对话框 运行时它看起来与我设计的以及编辑器中预览的不同 基本上 单击按钮就会出现我的对话框 private void jButton1
  • 模拟 GCC 语句表达式

    我被迫使用 IAR EW430 编译器 v7 12 进行嵌入式项目 并且它仅正式支持 c99 我希望能够通过除了编写一堆专用内联函数之外的任何方式以通用方式模拟 GCC 的语句表达式 有什么办法可以实现这一点吗 也许使用 MACRO wiz
  • 在 Jupyter Notebook 中的任意位置重命名变量

    有没有办法重命名当前 jupyter 笔记本文件中各处的变量 IE 假设我的笔记本通过我的脚本在多个函数和位置引用变量 foo 后来我决定将此变量重命名为 bar 以获得更好的可读性 在 Xcode 中 您可以突出显示并右键单击来执行此操作
  • 如何使用 Webdriver 和 C# 通过 Selenium 定位并单击嵌套在多个框架和框架集中的元素

    我有如下所示的 html 页面 我需要单击 clslogin 类中的 登录 如何遍历找到登录名 我正在使用 C 和 selenium Webdriver 使用 XPath html body div table tbody tr 1 td
  • 它如何获得比我想要的更多的内存?(C++)[重复]

    这个问题在这里已经有答案了 我想要一个1整数内存 但是这个程序如何工作呢 Code include
  • Passport-jwt 令牌过期

    我正在使用 Passport jwt 生成我的令牌 但我注意到令牌永远不会过期 有没有办法根据为我设置的规则使特定令牌失效 例如 use strict const passport require passport const passpo
  • 为python配置Vs code 2.0.0版本构建任务

    我需要帮助来配置我的 Vs 代码以使用 Cntrl Shift B 在 python 中运行脚本 我工作得很好 直到 Vs 代码升级到版本 2 0 0 现在它要求我配置构建 我不知道构建是什么 过去 当我只需要配置任务运行程序时 它效果很好
  • 计算圆交点 O( (n+s) log n)

    我试图弄清楚如何设计一种算法 可以以 O n s log n 复杂度完成此任务 s 是交叉点的数量 我尝试在互联网上搜索 但找不到真正的东西 无论如何 我意识到拥有良好的数据结构是关键 我在java中使用红黑树实现 TreeMap 我还使用