生成所有组合时的复杂性
Complexity when generating all combinations
我从 "this might be solved by generating all possible combinations for the array elements" 开始的面试问题通常是为了让我找到更好的东西。
无论如何我想补充 "I would definitely prefer another solution since this is O(X)".. 问题是:为给定集合生成所有组合的 O(X) 复杂度是多少?
我知道有n! / (n-k)!k!组合(二项式系数),但如何从中获得大 O 符号?
首先,将 O(n! / (n-k)!k!)
或任何其他函数 f(n)
用作 O(f(n))
并没有错,但我相信您正在寻找一个更简单的解决方案,但它仍然适用设置。
如果您愿意将子集 k
的大小视为常数,那么对于 k <= n - k
:
n! / ((n - k)! k!) = ((n - k + 1) (n - k + 2) (n - k + 3) ... n ) / k!
但是上面其实是(n ^ k + O(n ^ (k - 1))) / k!
,也就是在O(n ^ k)
同样,如果n - k < k
,你会得到O(n ^ (n - k))
这给了我们 O(n ^ min{k, n - k})
作为@amit 的后续行动,min{k, n - k}
的上限是 n / 2
。
因此,“n 选择 k”复杂度的上限是 O(n ^ (n / 2))
案例 1:如果 n-k < k
假设 n=11 且 k=8 且 n-k=3 那么
n!/(n-k)!k! = 11!/(3!8!)= 11x10x9/3!
let suppose it is (11x11x11)/6 = O(11^3) and 11 was equal to n so O(n^3) and also n-k=3 so it become O(n^(n-k))
案例 2:如果 k < n-k
假设 n=11 且 k=3 且 n-k=8 那么
n!/(n-k)!k! = 11!/(8!3!)= 11x10x9/3!
let suppose it is (11x11x11)/6 = O(11^3) and 11 was equal to n so O(n^3) and also k=3 so it become O(n^(k))
这给了我们 O(n^min{k,n-k})
我知道这是一个老问题,但它在 google 上排名靠前,恕我直言,有一个错误标记的已接受答案。
C(n,k) = n Choose k = n! / ( (n-k)! * k!)
上面的函数表示一组n个元素可以组成k个元素的集合的数量。纯粹从逻辑推理的角度来看,C(n, k)
必须小于
∑ C(n,k) ∀ k ∊ (1..n)
。
因为这个表达式代表了power-set。在英文中,上述表达式表示:add C(n,k) for all k from 1 to n
。我们知道这有 2 ^ n
个元素。
因此,C(n, k)
的上限为 2 ^ n
,对于任何 n, k > 3, and k < n
.
,它肯定小于 n ^ k
所以回答你的问题 C(n, k)
的上限肯定是 2 ^ n
,但不知道是否有更严格的上限可以更好地描述它。
我从 "this might be solved by generating all possible combinations for the array elements" 开始的面试问题通常是为了让我找到更好的东西。
无论如何我想补充 "I would definitely prefer another solution since this is O(X)".. 问题是:为给定集合生成所有组合的 O(X) 复杂度是多少?
我知道有n! / (n-k)!k!组合(二项式系数),但如何从中获得大 O 符号?
首先,将 O(n! / (n-k)!k!)
或任何其他函数 f(n)
用作 O(f(n))
并没有错,但我相信您正在寻找一个更简单的解决方案,但它仍然适用设置。
如果您愿意将子集 k
的大小视为常数,那么对于 k <= n - k
:
n! / ((n - k)! k!) = ((n - k + 1) (n - k + 2) (n - k + 3) ... n ) / k!
但是上面其实是(n ^ k + O(n ^ (k - 1))) / k!
,也就是在O(n ^ k)
同样,如果n - k < k
,你会得到O(n ^ (n - k))
这给了我们 O(n ^ min{k, n - k})
作为@amit 的后续行动,min{k, n - k}
的上限是 n / 2
。
因此,“n 选择 k”复杂度的上限是 O(n ^ (n / 2))
案例 1:如果 n-k < k
假设 n=11 且 k=8 且 n-k=3 那么
n!/(n-k)!k! = 11!/(3!8!)= 11x10x9/3!
let suppose it is (11x11x11)/6 = O(11^3) and 11 was equal to n so O(n^3) and also n-k=3 so it become O(n^(n-k))
案例 2:如果 k < n-k
假设 n=11 且 k=3 且 n-k=8 那么
n!/(n-k)!k! = 11!/(8!3!)= 11x10x9/3!
let suppose it is (11x11x11)/6 = O(11^3) and 11 was equal to n so O(n^3) and also k=3 so it become O(n^(k))
这给了我们 O(n^min{k,n-k})
我知道这是一个老问题,但它在 google 上排名靠前,恕我直言,有一个错误标记的已接受答案。
C(n,k) = n Choose k = n! / ( (n-k)! * k!)
上面的函数表示一组n个元素可以组成k个元素的集合的数量。纯粹从逻辑推理的角度来看,C(n, k)
必须小于
∑ C(n,k) ∀ k ∊ (1..n)
。
因为这个表达式代表了power-set。在英文中,上述表达式表示:add C(n,k) for all k from 1 to n
。我们知道这有 2 ^ n
个元素。
因此,C(n, k)
的上限为 2 ^ n
,对于任何 n, k > 3, and k < n
.
n ^ k
所以回答你的问题 C(n, k)
的上限肯定是 2 ^ n
,但不知道是否有更严格的上限可以更好地描述它。