zoukankan      html  css  js  c++  java
  • 为什么是 n(n+1)/2 ?

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

    假如数列a = 1,2,3....n。那么该数列内的元素两两相乘,则会构建出上图中的表格,这个表格应该有n x n 个元素。

    用程序写出来大概就是这样:

    for (int i=0; i<n; i++){
      for (int j=0; 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 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,有时间的话想好好证明一下这个问题

  • 相关阅读:
    《你不知道的javascript》读书笔记2
    你不知道的console调试
    《你不知道的javascript》读书笔记1
    使用js做LeetCode
    用装饰器来进行登录验证
    python 解压序列
    pycharm 的live_template的使用
    faker 库的使用
    Python常用内置类和常用内置函数汇总
    迭代器 ,生成器(生成器函数/生成器表达式)
  • 原文地址:https://www.cnblogs.com/agentgamer/p/3318153.html
Copyright © 2011-2022 走看看