【问题标题】:Smallest subset with sum greater or equal to k总和大于或等于 k ​​的最小子集
【发布时间】:2021-06-04 19:10:39
【问题描述】:

我试图找到一种分而治之的算法来解决 O(n) 中的这个问题,但我什么也没找到。 给定一个数组 A 和给定值 k。 找到总和大于或等于 k ​​的最小子集。 有人可以给我一个开始解决问题的想法吗?

非常感谢任何帮助。

【问题讨论】:

  • @n.'pronouns'm。这个问题是针对子数组的,而这个问题是针对子集的。不同之处在于子数组必须是连续的,但子集不必是连续的。
  • @kaya3 这个问题措辞不当。从 cmets 中可以清楚地看出,作者指的是子集而不是子数组。所有答案也适用于一个子集。很明显,子数组问题有一个多项式时间的答案。子集问题是 NP-hard。
  • “最小”是指最小的和还是最小的基数?
  • @n.'pronouns'm。最小基数

标签: algorithm divide-and-conquer


【解决方案1】:

对数组进行排序,然后从大到小选择元素,直到总和足够大。这种方法的时间复杂度将是 O(n log n)。

当期望找到一个小的子集时,可以通过使用快速排序算法来实现较低的平均时间复杂度,而不是对较低的分区进行排序,除非并且直到事实证明有必要这样做;当在较高的分区中找到一个和足够大的子集时,可以忽略较低的分区。如果子集的预期大小与 n 无关,那么这种方法的时间复杂度应该是 O(n)。

【讨论】:

    【解决方案2】:

    使用快速选择在预期的线性时间内完成此操作。

    您的第一个快速选择会将数组分成两部分,一个包含较大的元素,另一个包含较小的元素。如果较大元素的总和 > k,则对其进行迭代。否则,以 k - sum(更大的元素)为目标对另一半进行迭代。

    【讨论】:

    • 但是快速排序的时间复杂度是O(nlogn)
    • @narges 我们不需要快速排序,只需要快速选择。
    • @narges Quickselect 将获得我们想要的元素,但未排序。它只在枢轴的一侧递归。 en.wikipedia.org/wiki/Quickselect
    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多