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

从运行流中无限个元素的数组中返回最大k个元素的优化算法

劳灵均
2023-03-14

我有一个运行的整数流,如何在任何时间点从这个流中获取最大的k个元素。

共有3个答案

孙化
2023-03-14
import heapq
def klargestelements(arr1,k):
    q=heapq.nlargest(k,arr1)
    return q
k=3
arr1=[1,2,4,5,6,7]
m=klargestelements(arr1,k)
print(m)

nsmallest或nlargest方法接受参数k和要在其中找到最小/最大元素的数组

司马作人
2023-03-14

这个问题也被称为重击者。计数草图数据结构是解决这个问题的方法

参考:

    < Li > https://en . Wikipedia . org/wiki/Count–min _ sketch
东郭弘
2023-03-14

最简单的解决方案是填充大小为 k 的最小堆。

首先,用前 k 个元素填充堆。

接下来,对于流中的每个元素 - 检查它是否大于堆的头部,如果是 - 弹出当前头部,然后插入新元素。

在流期间的任何点-堆包含最大的< code>k个元素。

此算法为 O(nlogk),其中 n 是到目前为止在流中遇到的元素数。

另一种解决方案,稍微复杂一点,但在某些情况下理论上在渐近复杂度方面更好,是保存一个2k元素的数组。

首先,加载前 2000 个元素。
运行选择算法,并从中找到最高的 k。丢弃其余部分,此时数组中只剩下 k 个元素。
现在,用接下来的k个元素再次填充数组,然后重复。

在每个点上,数组都包含k最大的元素,以及最多k更多不是最大的元素。您可以为此数组上的每个查询运行选择算法

运行时分析:

维护数组:每个选择算法都是 O(2k) = O(k)。<这是每k个元素完成一次,所以n / k以n,如果n表示到目前为止看到的元素数量,这给了我们O(n / k * 2k) = O(n)

此外,每个查询都是< code>O(k),如果查询的数量是< code>Q,这就给出了< code>O(n Q*k)的运行时间。

为了使这个解决方案更有效,我们需要Q * k

Q*k < nlogk
Q < n/k * logk

因此,如果查询的数量如上所述是有限的,这个解决方案在渐近复杂性方面可能更有效。

在实践中,获取top k通常是通过使用最小堆解决方案来完成的,至少在我认为需要的地方是这样。

 类似资料:
  • 我对C很在行,我正在尝试做一些黑客挑战,以此作为解决这个问题的方法 现在我正在努力解决愤怒的孩子们的问题:https://www.hackerrank.com/challenges/angry-children 基本上,它要求创建一个程序,给定一组N个整数,为该集合的K长度子集找到最小可能的“不公平”。不公平定义为K长度子集的最大值和最小值之间的差值。 我现在要做的是找到所有的K长度子集,计算它们

  • 从提供的数组中返回 n 个最大元素。如果 n 大于或等于提供的数组长度,则返回原数组(按降序排列)。 结合使用Array.sort() 与展开操作符(...) ,创建一个数组的浅克隆,并按降序排列。 使用 Array.slice() 以获得指定的元素个数。 忽略第二个参数 n ,默认获取单个元素(以数组的形式)。 const maxN = (arr, n = 1) => [...arr].sort

  • 问题内容: 我想编写一个函数,该函数以字母数组作为参数,并选择多个字母。 假设您提供8个字母的数组,并希望从中选择3个字母。然后您将获得: 返回由3个字母组成的数组(或单词)。 问题答案: 格雷码您会遇到的一个问题当然是记忆力,而且很快,您的集合中会有20个元素出现问题-20 C 3 =1140。而且,如果要遍历集合,最好使用修改后的灰色代码算法,因此您不必将所有代码都保存在内存中。这些将根据之前

  • 从提供的数组中返回 n 个最小元素。如果 n 大于或等于提供的数组长度,则返回原数组(按降序排列)。 结合使用Array.sort() 与展开操作符(...) ,创建一个数组的浅克隆,并按降序排列。 使用 Array.slice() 以获得指定的元素个数。 忽略第二个参数 n ,默认获取单个元素(以数组的形式)。 const minN = (arr, n = 1) => [...arr].sort

  • 我最近在一次面试中进行了一次编码测试。我被告知: 有一个100万int的大型未排序数组。用户想要检索K个最大的元素。您将实现什么算法? 在这期间,有人强烈暗示我需要对数组进行排序。 所以,如果性能真的很重要,我建议使用内置的或自定义实现。然后我被告知,使用或数组来存储最大和for循环,可以实现大约,事后看来,我认为这是,因为每次迭代都需要与大小的数组进行比较以找到要替换的最小元素,而对数组进行排序