阶乘级别复杂度的估算

对于复杂度为 \(O(n!)\) 的代码,以下估算其复杂度:

\(\displaystyle\quad \lg n!\)
\(\displaystyle =\sum_{i=1}^n \lg i\)
\(\displaystyle =\sum_{i=1}^n{\ln i\over \ln 10}\)
\(\displaystyle ={1\over \ln 10}\sum_{i=1}^n\ln i\)
\(\displaystyle \approx\lg e\int_1^n\ln x\text dx\)
\(\displaystyle =\lg e(x\ln x-x)|_1^n\)
\(\displaystyle =\lg e\cdot (n\ln n-n+1)\)

\(\therefore O(n!)\approx O(10^{\lg e\cdot (n\ln n-n+1)})\)

为使复杂度合法,故 \(\lg e\cdot (n\ln n-n+1)\leq 8\)

\(n\ln n-n\leq 8\ln 10-1\approx 17.4\)

由于 \(n\geq 1\)\({\text d\over \text dn}(n\ln n-n)=\ln n\geq 0\)

\(n\ln n-n\) 单调递增

枚举可解上述不等式得 \(n\leq 11\)


对于复杂度为 \(O[T(n)\cdot n!]\) 的代码,以下估算其复杂度:

同上,可得 \(\lg e\cdot (n\ln n-n+1)\leq \lg{10^8\over T(n)}=8-\lg T(n)\)

同上移项后可得到 \(n\ln n-n\leq 8\ln 10-1-\ln 10\lg T(n)\approx 17.4-\ln 10{\ln T(n)\over \ln 10}=17.4-\ln T(n)\)

\(n\ln n-n+\ln T(n)\leq 17.4\)

posted @ 2020-05-29 11:05  JustinRochester  阅读(2241)  评论(0编辑  收藏  举报