阶乘级别复杂度的估算
对于复杂度为 \(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\)