寻找距离原点最近的 100 颗恒星的算法

2024-05-13

首先让我提出正确的问题:

问:有一个文件包含超过一百万个点 (x,y),每个点代表一颗星星。 (a,b) 处有一颗行星地球。现在,任务是构建一种算法,返回距离地球最近的 100 颗恒星。您的算法的时间和空间复杂度是多少?

这个问题在各种采访中被问过很多次。我尝试查找答案,但找不到满意的答案。

我认为一种方法可能是使用大小为 100 的最大堆。计算每颗星的距离并检查距离是否小于最大堆的根。如果是,则将其替换为 root 并调用 heapify。

还有其他更好/更快的答案吗?

PS:这不是家庭作业问题。


实际上,您可以通过使用非常聪明的技巧,在时间 O(n) 和空间 O(k) 中完成此操作,其中 k 是您想要的最近点的数量。

The 选择问题 http://en.wikipedia.org/wiki/Selection_algorithm如下:给定一个元素数组和某个索引 i,重新排列数组的元素,使得第 i 个元素位于正确的位置,所有小于第 i 个元素的元素位于左侧,所有大于第 i 个元素的元素位于左侧元素位于右侧。例如,给定数组

40  10  00  30  20

如果我尝试基于索引 2(零索引)进行选择,结果可能是

10  00  20  40  30

由于索引 2 (20) 处的元素位于正确的位置,因此左侧的元素小于 20,右侧的元素大于 20。

事实证明,由于这比实际对数组进行排序的要求不太严格,因此可以在 O(n) 时间内完成此操作,其中 n 是数组元素的数量。这样做需要一些复杂的算法,例如中位数的中位数 http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_Median_of_Medians_algorithm算法,但确实是 O(n) 时间。

那么你在这里如何使用这个呢?一种选择是将文件中的所有 n 个元素加载到数组中,然后使用选择算法在 O(n) 时间和 O(n) 空间中选择前 k 个元素(此处,k = 100)。

但实际上你可以做得比这更好!对于您想要的任何常量 k,请维护 2k 个元素的缓冲区。从文件中加载2k个元素到数组中,然后使用选择算法重新排列它,使最小的k个元素在数组的左半部分,最大的在右半部分,然后丢弃最大的k个元素(它们可以' t 是 k 个最近点中的任何一个)。现在,将文件中的 k 个元素加载到缓冲区中并再次执行此选择,然后重复此操作,直到处理完文件的每一行。每次进行选择时,都会丢弃缓冲区中最大的 k 个元素,并保留迄今为止看到的 k 个最接近的点。因此,在最后,您可以最后一次选择前 k 个元素并找到前 k 个。

新方法的复杂性是什么?好吧,您使用 O(k) 内存作为缓冲区和选择算法。您最终会在大小为 O(k) 的缓冲区上调用 select 总共 O(n / k) 次,因为您在读取 ​​k 个新元素后调用 select。由于选择大小为 O(k) 的缓冲区需要花费 O(k) 时间,因此这里的总运行时间为 O(n + k)。如果 k = O(n)(合理的假设),则需要时间 O(n)、空间 O(k)。

希望这可以帮助!

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

寻找距离原点最近的 100 颗恒星的算法 的相关文章

  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 如何对对象进行排序? (画家算法)

    所以我有 4 个矩形形状 我正在尝试应用排序算法 画家算法 https en wikipedia org wiki Painter 27s algorithm 来知道我需要先绘制哪些形状 在 3d 中 然后绘制哪个形状 Note 相机位于右
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • O(1) 算法确定节点是否是多路树中另一个节点的后代?

    想象一下下面的树 A B C D E F 我正在寻找一种方法来查询 F 是否是 A 的后代 注意 F 不需要是directA 的后代 在这种特殊情况下这是正确的 只需要针对更大的潜在后代节点池测试有限数量的潜在父节点 当测试一个节点是否是潜
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 在矩阵/位图中查找质量簇

    这是此处发布的问题的延续 在 2D 位图上查找质心 https stackoverflow com questions 408358 finding the center of mass on a 2d bitmap正如给出的例子 它讨论了
  • 贪心技术与穷举搜索有何不同?

    我正在为一些示例问题编写伪代码 并且我注意到贪婪技术和详尽搜索之间存在令人担忧的模式 Job 1 Job 2 Job 3 Job 4 Job 5 Person 1 9 2 7 8 Person 2 6 4 3 7 Person 3 5 8
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • 优化两个三位数乘积的最大回文数?

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

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 依次构建完整的 B 树

    如果我有一组排序的数据 我想以最适合顺序读取和随机查找的方式将其存储在磁盘上 那么 B 树 或其中一个变体 似乎是一个不错的选择 假设该数据集并不全部适合 RAM 问题是可以从一组排序的数据构建完整的 B 树而不进行任何页面拆分吗 这样排序
  • 将数字的各个数字部分相加/求和的最快方法

    不久前 我在数学论坛上看到一个问题 其中一个人正在讨论一遍又一遍地将数字中的数字相加 直到达到个位数 即 362 将变成 3 6 2 这将变成 11 然后 11 将变成 1 1 将变成 2 因此 362 将返回2 我写了一些很好的代码来得到
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误

随机推荐

  • 我想在 64 位模式下运行我的视觉工作室

    我正在 NET 3 5 中编写 Web 服务 在此我必须访问 SharePoint 2010 数据 但 SharePoint 需要我的应用程序使用 64 位模式 Visual Studio 默认处于 32 位模式 如何以 64 位运行 Vi
  • 将 JSON 转换为对象失败 - 无法将当前 JSON 对象反序列化为 System.Collections.Generic.List

    我正在使用 www textlocal in 的 API 它返回 JSON 格式的对象 JSON warnings message Number is in DND numbers 917000000000 balance 900 batc
  • 查找并替换超过 1 个单词?

    我需要使用 jQuery 更改页面上的一堆不同的单词 这是我到目前为止的代码 function var thePage body thePage html thePage html replace My Classes g My Level
  • C++ 凯撒密码程序

    我正在尝试用 C 编写凯撒密码程序 我使用四个函数 一个用于选择 Shift key 两个用于加密和解密 最后一个用于实现凯撒密码 使用输入文件读取文本并将加密或解密的文本输出到输出文件中 我正在尝试运行代码 但它崩溃了 我认为问题出在凯撒
  • 检测 UISwitch 的变化

    这听起来微不足道 但我注意到一些奇怪的地方 我已经为 UISwitch 的 Value Changed 事件连接了一个处理程序 我会做什么expect是每次调用处理程序时 开关的值都会改变 但实际上并非如此always案子 如果您快速按下开
  • 通过 Maven 到达罗马

    我正在使用 Maven 并且希望开始在项目中使用 Rome 当我在 Eclipse 的 m2 实例中查找 rome 时 我得到了一些结果 net java dev rome rome 1 0 0 2010 04 17 org rometoo
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi
  • Python 中 datetime.timedelta 的人类可读日期时间间隔?

    我发现自己经常需要在 python 配置文件中指定时间跨度 有没有一种方法可以让我在带有 stdlib 的 python 配置文件中指定更易读的时间范围 类似于 PostgreSQL 的 Interval 语法 或者这需要第三方库吗 澄清我
  • jQuery 按 1 个 td 的值对表行进行排序

    您将如何按以下顺序对该表进行排序pts我有的课程 table tr th rank th th team th th pts th tr tr td 1 td td Chelsea td td class pts 3 td tr tr td
  • 如何在多个包之间共享analysis_options.yaml 文件?

    我正在开发一个Flutter Module 多种的Flutter Plugins 他们之间的关系是 module取决于所有plugins 所有插件均未发布到 pub 并使用 git 依赖项 我现在需要添加analysis options y
  • 当我在空表上执行 Hibernate saveOrUpdate 时失败

    我尝试使用以下代码插入或更新数据库记录 Category category new Category category setName catName category setId 1L categoryDao saveOrUpdate c
  • 如何取消同步 WinHttp 请求?

    我的服务有一个线程可能正在执行WinHttpSendRequest当有人试图停止我的服务时 The WinHttpCloseHandle 文档 http msdn microsoft com en us library windows de
  • 将 r 数据框中的列字符串转换为数字

    我有一个数据框 其中有一列字符串 如下所示 mydata lt c 1 356670 35 355030 1 356670 35 355030 1 356620 35 355890 1 356930 35 358660 1 357000 3
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • SQL Server:复制表中的列

    将表中的列中的所有值复制到同一表中的另一列的最简单方法是什么 使用单个语句 如果列具有相同的数据类型 UPDATE
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • 将剪贴板上的图像粘贴到 Emacs Org 模式文件而不保存它

    由于我使用 Emacs Org 模式作为研究日志 有时我想通过屏幕截图来跟踪某些内容 但我绝对不想保存它们 所以我想知道是否有任何方法可以将这些数字插入到我的组织模式文件中 就像使用 word 从剪贴板复制它们一样 您想要的确切功能目前尚未
  • 将二维数组拆分为每行数组的最Pythonic方法是什么?

    我有一个函数 foo 返回形状为 1000 2 的数组 如何将其拆分为两个数组 a 1000 和 b 1000 我正在寻找这样的东西 a b foo 我正在寻找一个可以轻松推广到形状为 1000 5 左右的情况的答案 The zip idi
  • Kubernetes Ingress 在 nginx 反向代理后面运行

    我已经在可以从互联网访问的服务器上安装了 minikube 我创建了一个可用的 kubernetes 服务 gt kubectl get service myservice NAME CLUSTER IP EXTERNAL IP PORT
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次