【问题标题】:Select K distinct numbers from set {1, 2,…, n} such that从集合 {1, 2,…, n} 中选择 K 个不同的数,使得
【发布时间】:2017-04-03 22:37:21
【问题描述】:

给定 n 和 k,k 在多少种方式中,我们可以从集合 {1, 2,…, n} 中精确选择“k”个不同的数字,使得对于每个选择的数字“a”至少有一个 'a-1' , 'a+1'也被选中? 一个时间复杂度O(n*k)的动态规划解是已知的。我们能做得更好吗?

【问题讨论】:

  • n 和 K 作为输入。我们必须准确地选择 k 个不同的数字
  • 如果你可以证明时间复杂度也是Ω(n*k),那么时间复杂度就是Θ(n*k),这意味着你不能做得更好。跨度>
  • 你能证明 O(nk) 算法(可能有一些改进)吗?

标签: algorithm math dynamic-programming combinatorics


【解决方案1】:

是的,我们只需要做一些组合数学。

将运行定义为连续整数的最大子集。我们让 r 的范围从 1 到 floor(k/2),然后将 r 次运行的子集数相加。

要计算具有给定运行次数 r 的子集数量,我们采用 (a) 划分运行长度的方法数乘以 (b) 划分运行之间间隙的方法数。

对于 (a),将整数 k 划分为 r 个大于或等于 2 的整数之和的方法数为 ((k - 2r + (r - 1)) 选择 (r - 1)) 通过标准技术。

对于 (b),将整数 n - k 划分为 r + 1 个整数之和的方法数为 ((n - k - (r - 1) + r) 选择 r)。

简单地说,这个公式需要 O(k^2) 次算术运算,但是如果我们使用 r - 1 的二项式系数来计算 r 的系数,那么运行时间就变成了 O(k) 次算术运算。

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2022-11-13
    • 2020-09-24
    • 2015-11-16
    相关资源
    最近更新 更多