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

如何在数组中找到多个ki最小元素?

蒋联
2023-03-14

我正在努力完成作业,需要一点推动-问题是设计一个算法,在O(nlogm)时间内找到多个最小元素

希望您能指点一下方向。谢谢

共有1个答案

焦苏燕
2023-03-14

如果我正确理解了这个问题,您有一个包含m个索引的向量K,并且您希望为K中的每个K找到a的第K个排名元素。如果K包含最小的m个索引(即K=1,2,…,m),那么可以通过使用quickselect查找元素K\m(因为所有较小的元素都将位于quickselect末尾的左侧),在线性时间T=O(n)内轻松完成此操作。所以我假设K可以包含任意一组m个指数。

实现这一点的一种方法是同时在所有K上运行快速选择。这是算法

QuickselectMulti(A,K)
If K is empty, then return an empty result set
Pick a pivot p from A at random
Partition A into sets A0<p and A1>p.
i = A0.size + 1
if K contains i, then remove i from K and add (i=>p) to the result set.
Partition K into sets K0<i and K1>i
add QuickselectMulti(A0,K0) to the result set
subtract i from each k in K1  
call QuickselectMulti(A1,K1), add i to each index of the output, and add this to the result set
return the result set

如果K只包含一个元素,这与随机快速选择相同。要了解为什么平均运行时间为O(n log m),首先考虑当每个支点将A和K完全分成两半时会发生什么。在这种情况下,您会得到两个递归调用,因此您有

T = n + 2T(n/2,m/2)
  = n + n + 4T(n/4,m/4)
  = n + n + n + 8T(n/8,m/8)

由于m每次下降一半,那么n将在此求和中显示log m次。要实际推导预期的运行时间需要更多的工作,因为您不能假设枢轴将两个数组分成两半,但如果您完成计算,您将看到运行时间实际上平均为O(n log m)。

在编辑时:通过运行p=Quickselect(A,k\u i),其中k\u i是k的中间元素,而不是随机选择p,对该算法的分析可以简化此操作。这将保证每次将K分成两半,因此递归调用的数量将正好是log m,并且由于quickselect在线性时间内运行,因此结果仍然是O(n log m)。

 类似资料:
  • 问题内容: 简介: 就我所能搜索到的而言,尚无此问题。 这是一个面试问题。 我什至没有专门寻找代码解决方案,任何算法/伪代码都可以使用。 问题: 给定一个整数数组及其大小,找到2个最小和的 非后续 元素(在数组中不能相邻)。另外,答案中不得包含第一个或最后一个元素(index 和)。解决方案还应该是 时间和空间的复杂性。 例如,当回答是,因为。 当答案为时,因为和不能选择的任何一个,因为处于数组的

  • 问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果:

  • 问题内容: 如何找到最多2个数字? 我需要比较两个值,即,并找到最大值2。我需要一些python函数来操作它吗? 问题答案: 使用内置功能。 示例: 返回4。 只是为了傻笑,还有一个……您是否需要它。:P

  • 问题内容: 给定一个整数数组和一个整数 k,从所有大小为 K 的连续子数组中找出 的最大元素。 例如: 对于每个大小为 k 的子数组,打印其最大元素。 问题答案: 基本的解决方案是生成所有大小为k的连续子数组并循环遍历它们以找出当前子数组中的最大值。考虑到,对于每个点,我们基本上都是取下一个 元素,然后我们遍历那些 k 个元素,因此该算法的最坏时间复杂度将是。 稍微有效的方法: 通过使用Segme