当前位置: 首页 > 知识库问答 >
问题:

求k个阵列中第a到第b个最小元素的有效方法

许奇
2023-03-14

我最近接受了一家社交媒体公司的面试,在那里我被问到了以下问题。

有k个长度为m的未排序数组。目标是在给定a mysql数据库中的“未排序数组”改为跨不同表的列,可以使用哪些高效的数据结构以及相应的检索算法。<>

我提出了两个可能的解决方案:

    null

对于使用quickselect查找第b个最小元素的第一步,平均时间总共从O(km)到O(km*log(m))。第二步时间复杂度为O(km)。最后一步是在C中的第a和第b个最小元素之间寻找元素,取O((b-a)log(kb))。因此,total在时间上需要O(km)到O(km*log(m))+O((b-a)log(kb)),在空间上需要O(kb)。

第二:递归地弹出最小的元素

对于每个循环,请执行

    null

共有1个答案

空翼
2023-03-14

一种简单的方法是创建大小为B的最大堆。然后运行以下代码:

for arr in arrays // process each of the k arrays in turn
    for i = 0 to length(k)-1
        if heap.count < b
            heap.push(arr[i])
        else if (arr[i] < heap.peek())
            heap.pop()
            heap.push(arr[i])

这里的想法是用前b项填充max-heap。然后,对于每一个其他项,如果它小于堆中最大的项,则用新项移除堆中最大的项。

当您处理完所有km项时,最小的b项位于堆中,并且由于它是一个最大堆,您弹出的第一个b-a项将是所有k数组中的第a到第b项。

// all items have been processed, take the first *b - a* items from the max heap
for i = 0 to (b-a-1)
   result[i] = heap.pop()

最坏的情况是第一个循环为O(km log b),第二个循环为O(b log b),使用O(b)额外的内存。

如果允许销毁源数组,可以编写自定义的quickselect,将k个数组作为单个数组进行索引。这将是O(km),使用O(k)额外的内存作为间接索引。缺点是索引代码会慢一些。当然,这些项会在数组之间移动。您可能需要O(b)额外的内存来存储返回值。渐近地说,它比我最初的选择更有效。它是否会跑得更快完全是另一个问题。

另一种可能性。在每个k个数组上运行build-heap方法。那是O(公里)。然后进行合并以选择前b项。合并需要:

  • o(log m)从源数组中移除每个项
  • o(日志b)将每个项添加到合并堆
  • o(html" target="_blank">日志b)从合并堆中移除每个项

第二步是O(b*(log m+log b+log b))。

这就给出了O(km+b*(log m+log b+log b)),并且您将使用O(b)额外的内存。这是否会比最初的建议更快还值得怀疑。它取决于b和M之间的关系。b的值越大,这就越不可能更快。代码编写起来要复杂得多。

 类似资料:
  • 我的问题是受到这个特殊的SO评论的启发,这个评论没有得到回答(我自己也面临这个问题): 我试图找到排序矩阵中第K个最小的元素: 给定一个nxn矩阵,其中每个行和列都按升序排序,返回矩阵中第k个最小的元素 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素 输入:矩阵=[[1,5,9],[10,11,13],[12,13,15],[12,13,15],k=8 输出:13 说明:矩阵中的元素

  • 这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?

  • 这是一个面试问题。 在排序的行(但不是排序的列)和行之间没有关系的矩阵中查找第k个最小元素。(第一行和第n行之间没有关系——我们只知道每一行都是按升序排列的) 输入示例如下: 这种情况下的结果是 因为20是这个矩阵中第五小的元素。 我首先想到将所有元素添加到minHeap中,然后轮询元素,同时每次迭代从k中减去一个,直到我们得到答案。我还考虑为O(m*n)解决方案实现快速选择,尽管这些解决方案并没

  • 为了好玩/Java实践,我做了以下问题: 编写一个方法,该方法将整数的优先级队列作为输入,并输出最小整数。该方法不应更改传入的优先级队列的内部状态。您只能使用一个队列或堆栈作为额外数据。不允许使用其他数据结构<代码>k为1索引(表示最小值)。 获取元素很简单:只需删除次,因为它是优先级队列。我想我可以弹出,将元素放在堆栈上进行存储,然后在完成后将它们添加回队列。不过这不起作用,因为元素在优先级队列

  • 所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败。 问题是: 给定一个矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素。 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素。 例子: 返回: 13 我的方法是使用minHeap,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输

  • 我目前正在研究选择算法,即中位数。 我遇到了下面两个句子: 在计算机科学中,选择算法是寻找列表或数组中第k个最小数的算法; 在计算机科学中,中位数是一种近似(中位数)选择算法,经常用于为精确选择算法(主要是quickselect)提供良好的中枢,该算法选择最初未排序数组的第k个最大元素。 第k个最小/最大元素是什么意思?为了使问题更具体一点,考虑以下(未排序)数组: 例如,第五小的元素是什么?第五