- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先让我说出正确的问题:
问:有一个文件包含超过一百万个点 (x,y),每个点代表一颗星。在 (a,b) 处有一个行星地球。现在,任务是建立一个算法,返回距离地球最近的 100 颗恒星。您的算法的时间和空间复杂度是多少。
这个问题在各种面试中被问过很多次。我试着查找答案,但找不到满意的答案。
一种方法,我认为可能是使用大小为 100 的最大堆。计算每个星的距离并检查距离是否小于最大堆的根。如果是,将其替换为根并调用 heapify。
还有其他更好/更快的答案吗?
P.S:这不是作业题。
最佳答案
您实际上可以在时间 O(n) 和空间 O(k) 中执行此操作,其中 k 是您想要的最近点的数量,方法是使用一个非常聪明的技巧。
selection problem 如下:给定一个元素数组和一些索引 i,重新排列数组的元素,使得第 i 个元素在正确的位置,所有小于第 i 个元素的元素都在左边,并且所有元素大于第 i 个元素在右边。例如,给定数组
40 10 00 30 20
如果我尝试根据索引 2(零索引)进行选择,一个结果可能是
10 00 20 40 30
由于索引为2(20)的元素在右边,左边的元素小于20,右边的元素大于20。
事实证明,由于这比实际排序数组的要求更宽松,因此可以在 O(n) 的时间内完成此操作,其中 n 是数组元素的数量。这样做需要一些复杂的算法,例如 median-of-medians算法,但确实是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)。
希望这对您有所帮助!
关于找到离原点最近的 100 颗恒星的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202315/
我试图弄清楚如何获取所有可见窗口的框架。我尝试了以下代码,但它仅适用于应用程序本身,其他窗口报告 {0,0,0,0} NSArray *windowArray = [NSWindow wind
左矩形=新矩形(0,0,WIDTH/9,HEIGHT);在此代码中,如果我增加宽度,为什么它看起来会进一步延伸到 JFrame 的左侧?如果我减少它为什么它会向右延伸?这不是像坐标平原一样工作吗?高度
假设我有一个 AffineTransform (transform) 并调用它的一堆方法。假设我旋转并平移它。然后我用它转换图形对象 (g2d): g2d.transform(transform);
我认为当你对物体施加力时,它会施加到 body 的原点(可能是质心)。现在我正在尝试创建类似俄罗斯方 block 的 block ,并通过应用 LinearPulse 使它们跳跃,如下所示: body
我正在阅读 Big Nerd Ranch 指南第 4 版,但在处理 View 和 View 层次结构的章节中,我遇到了一些与 View 来源有关的问题。 我已经在我的 View Controller
我想把原点放在中心,所以我做了: SetViewportOrgEx(hdc,width/2,height/2,NULL); (如下面的代码所示) 现在,在实现双缓冲后它似乎无法正常工作。任何想法为什么
当我的 Sprite 旋转原点固定在窗口的左上角时,我遇到了这个问题(与 sprite.Draw 和 sprite.Draw2D 相同)无论哪种方式,如果我改变旋转中心它仍然在左上角。我需要 Spri
有人告诉我,您可以通过以下方式向与当前 Git 分支名称相匹配的远程分支推送和 pull : git push origin HEAD 或 git pull origin HEAD 它以前一直对我有用
我正在使用自定义 View 和 Canvas 在屏幕上绘制对象。 View 位于距屏幕原点的 Y 偏移处。我想平移 Canvas ,然后绘制一个对象。但是,当我使用 setmatrix 平移 Canv
尝试拖动组。为什么 origin 在这里不起作用?注意到当你第一次点击它时它是如何跳跃的吗? JSFIDDLE基于此:http://bl.ocks.org/mbostock/1557377 var d
我正在尝试使用以下立方体的透视视角: http://jsfiddle.net/TrySpace/JvFSQ/5/ 但是我没有按照我的预期去做,我想要改变实际的视角。所以当transformOrigin
我的 OpenShift Origin 安装似乎有问题。 当我获得路由器的端点时,我得到以下信息: oc get endpoints --namespace=default --selector=ro
这是怎么做到的?我正在寻找 iOS7/8 解决方案。 KeyboardWillShow 并不令人满意,因为我需要在键盘实际显示之前根据键盘高度调整 View 大小。 最佳答案 keyboardWill
我正在 iframe 上监听其内容何时发生变化。当它发生时,我想知道内容的当前来源是什么。 我无法访问该内容,因为它违反了相同的域策略,但我只要根据网址或主机知道它显示的内容就可以了。 我可以通过 j
我一直致力于使用 CSS3 创建动画条形图。它在钢筋的两侧运行良好,但钢筋的顶部和底部一直存在问题。 我一直在通过 jQuery 改变它们的 css“高度”属性来缩放边,但我意识到这不是最好的方法。我
Edit3:我的问题与我预期的功能完全不同。我让代码保留下来,也许这对某人有帮助 :)(并且不要忘记调试!)。 我试图找到直线与三角形相交的 vector 。 当前状态:随机交叉,即使鼠标不在地板上和
我需要在原始 View 的坐标中计算 UIView subview 的可见 CGRect。如果比例为 1,我可以正常工作,但如果其中一个 super View 或 View 本身被缩放(收缩),可见的
这个问题类似于以前回答的问题 Fast interpolation over 3D array ,但无法解决我的问题。 我有一个维度为(时间、高度、纬度、经度)的 4D 数组,标记为 y.shape=
我正在制作自定义贴纸包。这是一个 iMessage 扩展应用程序。我继承了 UICollectionView 而不是使用基本的 MSMessagesViewController。因此,只有当我在展开
我使用 CGWindowListCopyWindowInfo 获取所有窗口的列表。它根据屏幕的 左上角 原点为我提供每个窗口的坐标。 如果我使用 NSWindow 的 setFrame 方法,坐标基于
我是一名优秀的程序员,十分优秀!