Algorithm 查找元素小于S的子集
我必须为以下问题找到一个算法: 输入是自然数的两个数S和k以及n个成对不同数的未排序集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个最小元素: 它基
确定是否有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