![](/img/trans.png)
[英]Algorithm with O(m (log n + log m)) time complexity for finding kth smallest element in n*m matrix with each row sorted?
[英]Wouldn't this algorithm run in O(m log n)?
我正在处理Glassdoor软件工程师的面试问题
问题是
给定一百万个数字的列表,您将如何以有效的方式从列表中找到前n个数字
这是作者从同一链接给出的解决方案
最终结果是你可以在O(n)内存使用和最坏情况下的O((mn)logn)运行时执行此操作。
我同意作者的算法和作者对该算法的空间复杂性的评估。 我遇到的问题是作者对插入堆中的运行时和总体时间的分析
对于“取m个元素中的前n个并放置在堆中”的步骤,不会在O(nlogn)中运行吗? 至少根据我的课堂笔记Heap Add ,插入将是O(logn) ,因为你要插入n个元素,整个步骤的运行时将是O(nlogn) 。
考虑到这一点,整个算法的整体运行时间不会是,使用Big Oh Addition的大量添加
O(nlogn + (m-n)logn) = O(mlogn)
使用该方法构建堆,是的,但是有一个O(n)算法用于将数组转换为堆。 有关详细信息,请参见http://en.wikipedia.org/wiki/Binary_heap#Building_a_heap 。
也就是说,这个问题存在O(m)时间,O(n)内存解决方案,由例如Guava的Ordering.leastOf
。 一个实现是
这需要O(m / n)个快速选择,每个选择O(n),总时间为O(m)。
对于“取m个元素中的前n个并放置在堆中”的步骤,不会在O(nlogn)中运行吗?
不必要。 您可以从O(n)
n
元素创建堆。 请参阅此处了解如何实现这一目标。
所以你有O(n + (m - n)log n) = O((m - n)log n) = O(m log n)
。 只有当n
被认为是常数时,最后一步才是正确的,否则你应该像作者那样将它保持为m - n
。
后续问题:你能解决O(m)
的整个问题吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.