Algorithm 查找元素小于S的子集

Algorithm 查找元素小于S的子集,algorithm,set,time-complexity,subset-sum,Algorithm,Set,Time Complexity,Subset Sum,我必须为以下问题找到一个算法: 输入是自然数的两个数S和k以及n个成对不同数的未排序集 确定是否有k个数的子集,其总和为,您可以从集合中构建大小为k的最小堆。在最坏的情况下,这是基于预期时间和logk的构建时间复杂性。 堆应该包含集合中的前k个最小元素 然后很容易看到堆中元素的总和是,您可以从集合中构建大小为k的最小堆。在最坏的情况下,这是基于预期时间和logk的构建时间复杂性。 堆应该包含集合中的前k个最小元素 然后可以直接看到堆中元素的总和Quickselect可用于查找k个最小元素: 它基

我必须为以下问题找到一个算法:

输入是自然数的两个数S和k以及n个成对不同数的未排序集


确定是否有k个数的子集,其总和为,您可以从集合中构建大小为k的最小堆。在最坏的情况下,这是基于预期时间和logk的构建时间复杂性。 堆应该包含集合中的前k个最小元素


然后很容易看到堆中元素的总和是,您可以从集合中构建大小为k的最小堆。在最坏的情况下,这是基于预期时间和logk的构建时间复杂性。 堆应该包含集合中的前k个最小元素


然后可以直接看到堆中元素的总和Quickselect可用于查找k个最小元素:

它基本上是快速排序,只是您只在轴的有趣一侧递归


一个简单的实现在预期的时间内运行,但使用中间值选择一个轴,您可以使其成为真正的最坏情况边界:

Quickselect可用于查找k个最小元素:

它基本上是快速排序,只是您只在轴的有趣一侧递归



一个简单的实现在预期的时间内运行,但是使用中间值来选择一个轴,您可以使其成为真正的最坏情况边界:

子集在原始集中是否应该是连续的?i、 e.i不。它只是集合的k个索引!也就是说,如果子集在原始集合中是连续的,那么x_j不必是x_{i+k}?i、 e.i不。它只是集合的k个索引!意思是x_j不一定是x_{i+k},但是我也需要找到k-最小元素,不是吗?这就意味着我也可以了!我仍然需要得到这些k元素的总和,并检查是否有总和algorithm({x_1, ..., x_n}, k, S): if exists |{x_i, ..., x_j}| = k and x_i + ... x_j <= S return true
algorithm(a={x_1, ..., x_n}, k, S):
    sum = 0
    for i=1,...,k:
        min = a.popFirst()
        for i=2,...,len(a):
            if(a[i] < min):
                t = a[i]
                a[i] = min
                min = t
        sum += min
    if sum <= S:
        return true
    else:
        return false