algorithm - 谁能告诉我这个程序的时间复杂度是 O(n*n!) 而不是 o(n^n)?
问题描述
为什么这个程序的时间复杂度是O(n*n!)
而不是?o(n^n)
void perm(String str, String prefix){
if(str.length() == 0){
System.out.println(prefix);
} else{
for(int i = 0; i < str.length(); i++){
String rem = str.substring(0, i) +
str.substring(i + 1);
perm(rem, prefix + str.charAt(i));
}
}
}
解决方案
两者兼而有之。我们有
n! = 1 * 2 * ... * n <= 1 * n * ... * n = n^(n-1)
所以n * n! = O(n^n)
。现在对于小o
,事情看起来有点不同,因为我们必须证明c
存在任何常数因子n
,例如c * n * n! < n^n
。
但这也没有那么复杂。让我们选择一个任意的c
,然后(对于n>=3
):
(n * n!)/(n^n) = n!/n^(n-1) = (n-1)!/n^(n-2) = 1/n * 2/n * ... * (n-1)/n <
< 1/n * ((n-1)/n)^(n-3) <= 1/n
所以我们有n * (n * n!) < n^n
. 所以对于我们c
来说,我们可以挑选n >= c
,我们很好。因而也n * n! = o(n^n)
。所以你的算法是O(n * n!)
和o(n^n)
。
推荐阅读
- jquery - 带有localStorage的jQuery单击功能不起作用
- python - 我得到 ModuleNotFoundError: No module named 'Cython' 尝试制作扩展时
- visual-studio-code - Visual Studio Code Live Share 自动完成非常延迟
- flutter - 在 Flutter 中实现通知逻辑
- python - 在 Python 3 中打印给定系列的谐波系列
- linux - 即使在步骤完成后,如何继续从 Jenkins 管道运行命令/bat 文件?
- python - 如何从 read_game 的最终位置获得棋盘?
- javascript - 将字符串转换为数字,具体取决于它们是否具有后缀,例如 1.5K
- javascript - 无法使用 VueRouter 浏览我的不同路由器链接
- python - 将 Python 列表转换为单个字符串