证明 O(n/1+n/2+…+n/n)=O(nlogn)
前言
在算法中,经常需要用到一种与调和级数有关的方法求解,在分析该方法的复杂度时,我们会经常得到\(O(\frac{n}{1}+\frac{n}{2}+\ldots+\frac{n}{n})\)的复杂度,然后我们都知道这个式子是等价于\(O(n\log n)\)的。在筛素数、字符串连续重复子串等很多算法中都有用到,用处之广,性能之优。今天不妨来证明下这个等价式。
\(O(\frac{n}{1}+\frac{n}{2}+\ldots+\frac{n}{n})\)~\(O(n\log n)\)
分析
要证明\(O(\frac{n}{1}+\frac{n}{2}+\ldots+\frac{n}{n})\)~\(O(n\log n)\),只需证\(O(1+\frac{1}{2}+\ldots+\frac{1}{n})\)~\(O(\ln n)\)——式子1.
为了证明式子1,需要证明4个定理:
1. 确界存在定理
2. 单调有界数列必定收敛
3. 数列\(\{(1+\frac{1}{n})^n\}\)单调增加,\(\{(1+\frac{1}{n})^{n+1}\}\)单调减少,两者收敛于同一极限
4. \(b_n=1+\frac{1}{2}+\ldots+\frac{1}{n}-\ln n\) 收敛
确界存在定理——实数系连续性定理
描述:非空有上界的数集必有上确界;非空有下界的数集必有下确界。
证明:<a href="http://baike.baidu.com/link?url=NojNWL0qcJWW20mxekU1GcfeD1Tp-0-JtF4oyRio7w9Th-ifVdybvf3PaSzmZKXZywk9mCGnlQ9mkPk-NySvn1b_DUqfs-Boez0kGdtwwgN9cgLyW4xYJfHUVGhdiIHQh3hilNBwuRJxARBOsGkqrSpDfuuEwxa56NjmcEgwrlSiddNVOjmmH6WirfboiLNMPo0a06RFoeFRasTvJSUaPa
" target="_blank">百度百科关于确界存在定理
单调有界数列必定收敛
描述:单调递增且有上界数列必定收敛,单调递减且有下界数列必定收敛
证明:
不妨设数列\(\{x_n\}\)单调增加且有上界,根据确界存在定理,由\(\{x_n\}\)构成的数集必有上确界\(\beta\),满足:
(1) \(\forall n\in N^+:x_n\leq \beta;\)
(2) \(\forall \epsilon>0,\exists x_{n_0}:x_{n_0}>\beta-\epsilon。\)
取\(N=n_0\),\(\forall n>N:\beta-\epsilon<x_{n_0}\leq x_n\leq \beta\),因而\(\{x_n-\beta\}<\epsilon\),于是得到\(\lim_{n\rightarrow \infty}x_n=\beta\)
当数列单调递减且有下界时,同理。
数列\(\{(1+\frac{1}{n})^n\}\)单调增加,\(\{(1+\frac{1}{n})^{n+1}\}\)单调减少,两者收敛于同一极限
证明:
记\(x_n=\{(1+\frac{1}{n})^n\}\),\(y_n=\{(1+\frac{1}{n})^{n+1}\}\),利用平均不等式\(\sqrt[n]{a_1a_2\ldots a_n}\leq\frac{a_1+a_2+\ldots+a_n}{n}\)得到
\(x_n=\{(1+\frac{1}{n})^n\}\cdot1\leq [\frac{n(1+\frac{1}{n})+1}{n+1}]^{n+1}=x_{n+1}\)
\(\frac{1}{y_n}=(\frac{n}{n+1})^{n+1}\cdot 1\leq[\frac{(n+1)\frac{n}{n+1}+1}{n+2}]^{n+2}=\frac{1}{y_{n+1}}\)
这表示\(\{x_n\}\)单调增加,而\(\{y_n\}\)单调减少。又由于\(2=x_1\leq x_n<y_n\leq y_1=4\),可知数列\(\{x_n\}\),\(\{y_n\}\)都收敛(单调有界数列必收敛)。
因为\(y_n=x_n(1+\frac{1}{n})\),所以它们具有相同的极限。习惯上用字母\(e\)来表示这一极限,即\(\lim_{n\rightarrow\infty}(1+\frac{1}{n})^n=\lim_{n\rightarrow\infty}(1+\frac{1}{n+1})^n=e\)
\(e=2.718\ 281\ 828\ 459\cdots\)是一个无理数。以\(e\)为底的对数称为自然对数,通常即为\(\ln x(=\log_ex)\)。
\(b_n=1+\frac{1}{2}+\ldots+\frac{1}{n}-\ln n\) 收敛
证明:
由上一定理可知,\((1+\frac{1}{n})^n<e<(1+\frac{1}{n})^{n+1}\),由此得到\(\frac{1}{n+1}<\ln \frac{n+1}{n}<\frac{1}{n}\)。于是有:
\(b_{n+1}-b_n=\frac{1}{n+1}-\ln (n+1)+\ln n=\frac{1}{n+1}-\ln \frac{n+1}{n}<0\)
\(b_n=1+\frac{1}{2}+\frac{1}{3}+\ldots+\frac{1}{n}-\ln n>\ln \frac{2}{1}+\ln \frac{3}{2}+\ln \frac{4}{3}+\ldots+\ln \frac{n+1}{n}-\ln n=\ln (n+1)-\ln n>0\)
这说明数列\(\{b_n\}\)单调减少有下界,从而收敛。(单调有界数列必收敛)
总结
已证明\(O(1+\frac{1}{2}+\ldots+\frac{1}{n})\)~\(O(\ln n)\),因此可知\(O(\frac{n}{1}+\frac{n}{2}+\ldots+\frac{n}{n})\)~\(O(n\log n)\)
以后可能会附上用此公式的算法题目\(\ldots\)(待续)
证明 O(n/1+n/2+…+n/n)=O(nlogn)的更多相关文章
- PAT复杂度_最大子列和问题、最大子列和变种
01-复杂度1. 最大子列和问题 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- BZOJ2733 [HNOI2012]永无乡
直接平衡树启发式合并就好了...貌似是个很高端的东西.. 貌似可以证明splay的启发式合并是均摊$O(nlogn)$的...而其他平衡树都不行,所以其他的复杂度都是$O(nlog^2n)的$的 所以 ...
- 评估Divide and Conquer算法时间复杂度的几种策略
算法导论的第四章对于divide-conquer进行了阐述, 感觉这本书特别在,实际给出的例子并不多,更多其实是一些偏向数学性质的分析, 最重要的是告诉你该类算法分析的一般性策略. 估计 首先是估计算 ...
- 算法(第四版)C# 习题题解——2.4
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...
- Luogu P3384 【【模板】树链剖分】
转载请注明出处,部分内容引自banananana大神的博客 ~~别说你不知道什么是树~~╮(─▽─)╭(帮你百度一下) 先来回顾两个问题:1,将树从x到y结点最短路径上所有节点的值都加上z 这也是个模 ...
- 几道splay
hdu 1890 题意:每次将第i位到第i小数字所在的位置之间的位置翻转,每次输出第i小数字所在的位置 分析: 简单的splay处理区间翻转问题 有三点需要注意: 1.区间是1~n+2 2.此题里的查 ...
- Educational Codeforces Round 75 (Rated for Div. 2)
知识普及: Educational使用拓展ACM赛制,没有现场hack,比赛后有12h的全网hack时间. rank按通过题数排名,若通过题数相等则按罚时排名. (罚时计算方式:第一次通过每题的时间之 ...
- 【学术篇】CF833B TheBakery 分治dp+主席树
题目の传送门~ 题目大意: 将\(n\)个蛋糕分成恰好\(k\)份, 求每份中包含的蛋糕的种类数之和的最大值. 这题有两种做法. 第一种是线段树优化dp, 我还没有考虑. 另一种就是分治+主席树. 然 ...
随机推荐
- j-linkV8固件更新(任意版本)
在使用j-link v8调试程序时,容易出现固件丢失或出错的情况,导致电脑不能识别,j-link上面的灯不亮.我今天刚刚遇到了这个情况,于是就拆开外壳,在网上搜索资料,发现刷固件相关的还真多,但是有一 ...
- 如何提高PHP执行效率
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 ...
- docker使用Dockerfile构建ssh容器
一.使用Dockerfile构建centos 1.创建 Dockerfile mkdir centos # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd centos # 进入目录 ...
- 程序设计分层思想和DAO设计模式的开发
无论是一个应用程序项目还是一个Web项目,我们都可以按照分层思想进行程序设计.对于分层,当下最流行划分方式是:表现层+控制层+业务层+数据层.其中,业务层和数据层被统称为后台业务层,而表现层和控制层属 ...
- 洛谷P3621风铃
传送门啦 分析: 这个题看起来像是个树形dp,嗯,就是看起来像. 所以我们就按树形dp的思路去分析就好了,这个题是一个树形dp的变形题. 和以前建树是一样的,我们用邻接表来进行储存.利用邻接表的特性, ...
- R vs Python:载入包 import & library
数据科学:R & Python 工作 & Kaggle机器学习比赛 可重复函数式编程 一.Python模块的载入 包 Package 模块 module import pandas a ...
- CodeIgniter典型的表单提交验证代码
view内容: <?php echo form_open('user/reg'); ?> <h5>用户名</h5> <input type="tex ...
- (使用通过混淆+自己第三方保留成功混淆)AndroidStudio 混淆打包
原文:https://blog.csdn.net/mazhidong/article/details/64820838 AndroidStudio中的项目可以用compile的形式引入github上的 ...
- Kafka集成SparkStreaming
Spark Streaming + Kafka集成指南 Kafka项目在版本0.8和0.10之间引入了一个新的消费者API,因此有两个独立的相应Spark Streaming包可用.请选择正确的包, ...
- ava包(package)的命名规范,java中package命名规则
Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...