为什么是 n(n+1)/2 ?
n(n+1)/2是一个数列的元素两两运算后的不重复结果数。如图:

假如数列a = 1,2,3....n。那么该数列内的元素两两相乘,则会构建出上图中的表格,这个表格应该有n x n 个元素。
用程序写出来大概就是这样:
for (int i=; i<n; i++){
for (int j=; j<n; j++){
table[i][j] = a[i]*a[j];
}
}
这段程序准确的描述了我们手工填表的过程,填满整个表一共执行了n*n次操作,产生了一个n*n的结果集,当然也包含大量重复元素。
那么到底有多少重复元素呢? 其实可以通过跟踪整个运算流程来观察出其中的规律。
1.当i=1时, a1 * a1, a1*a2.....a1*an 一切正常。
2.当i=2时, a2 * a1, a2*a2.....a2*an 看到第一项了么,在第一步时已经计算过一次了。
3.当i=3时,a3 * a1, a3*a2, a3* a3....a3*an 第一项在i=1时计算过,第二项在i=2时计算过。
依次类推,可以发现,当i=n的时候,除了an * an 需要计算以外,其他项全都已经计算过了。
现在让我们来一次时光倒流:从i=n的时候开始,他只有最后一次计算是不重复的(an*an),其余n-1次运算都是"徒劳",所以它产生了n-1个重复元素。
然后是i=n-1的时候,他只有最后两次运算是不重复的(an-1 * an-1, an-1 * an),余下的n-2个计算结果都是重复的。
一直进行到当i=2的时候,也就是上面描述的第二步,当第一个重复数出现的时候。
然后就可以把他们都加起来,他们的和就是所有重复数了:r = 1+2+...+n-1
1 + 2 + ... + n-1 =r
2 n-1 + n-2 + ... + 1 =r
将1式和2式相加=> 2r = n(n-1) => r = n(n-1)/2
得到了重复数r,那么剩下多少不重复的呢? n*n - r = n(n+1)/2 wala~ QED
----Note---
这其实是一个可重复的N choose M 组合问题,而这里的M是2,有时间的话想好好证明一下这个问题
随机推荐
- 服务器设置SSH 长连接
1.echo $TMOUT 如果显示空白,表示没有设置, 等于使用默认值0, 一般情况下应该是不超时. 如果大于0, 可以在如/etc/profile之类文件中设置它为0. 2.修改/etc/ssh/ ...
- java抓取快递100信息接口
package zeze; import java.io.IOException; import org.json.JSONArray; import org.json.JSONException; ...
- 4. 如何解释dalvik字节码
如何解释dalvik字节码 文档: 在Android系统源码目录dalvik\docs有相关指令文档 dalvik-bytecode.html 实战: 来直接实战模拟来理解枯燥的理论 用IDA打开一个 ...
- (转)高性能网站架构之缓存篇—Redis集群增删节点
标签: 高性能架构集群缓存redis 上一篇文章,我们搭建了Redis-cluster集群,这篇博客跟大家讲一下如何在一个运行的集群上增加节点或者删除节点. Redis集群添加节点 首先我们要新建立一 ...
- oracle,mybatis主键自增长
<insert id="insert" parameterType="resource"> <selectKey resultType=&qu ...
- 如何在maven中添加本地jar包
mvn install:install-file -DgroupId=mytest-DartifactId=test-Dversion=1.1 -Dpackaging=jar -Dfile=d:\te ...
- Windows 下的 MarkdownPad 2 工具使用
MarkdownPad 2 工具(windows) 一. 软件下载和安装 下载登陆官网: http://markdownpad.com/ 点击Download,会自动下载.或者直接点击http://m ...
- Effective C++ -----条款40:明智而审慎地使用多重继承
多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...
- Divide and conquer:Telephone Lines(POJ 3662)
电话线 题目大意:一堆电话线要你接,现在有N个接口,总线已经在1端,要你想办法接到N端去,电话公司发好心免费送你几段不用拉网线,剩下的费用等于剩余最长电话线的长度,要你求出最小的费用. 这一看又是一个 ...
- js中apply方法的使用
js中apply方法的使用 1.对象的继承,一般的做法是复制:Object.extend prototype.js的实现方式是: Object.extend = function(destinat ...