2和算法权重计算

时间:2014-02-02 19:37:36

标签: algorithm

我开始参加有关算法的课程,并坚持使用 2-sum算法权重计算(以及3-sum等)。

有一个简单的1-sum示例

int count = 0;
for (int i = 0; i < N; i++)
    if (a[i] == 0)
        count ++

其中N只是数字 - 确切的值无关紧要。

还有下一个参数:

  • 变量声明:2
  • 任务说明:2
  • 小于比较:N + 1
  • 等于比较:N
  • 阵列访问:N
  • 增量:N到2N

依此类推 - 很明显

但接下来是2-sum示例

int count = 0;
for (int i = 0; i < N; i++)
    for (int j = i; j < N; j++)
      if (a[i] + a[j] == 0)
          count ++

还有另外一个参数:

  • 变量声明:N + 2
  • 作业陈述:N + 2
  • 小于比较:(1/2)(N + 1)(N + 2)
  • 等于比较:(1/2)N(N - 1)
  • 阵列访问:N(N - 1)
  • 增量:(1/2)N(N - 1)到N(N - 1)

前两个是明确的两个,但我无法理解上次操作的重量:“小于比较”“等于比较”

对于“等于比较” N + 1 是明确的 - 就像在1-sum循环中一样。

但是什么是(1/2)(N + 2)

3 个答案:

答案 0 :(得分:1)

您似乎想要计算实现执行小于比较的次数(这是我对“小于比较”意味着什么的猜测)。

计算基于1-sum变量;你说很清楚,但让我先来解释一下。

for (int i = 0; i < N; i++)
    ...

此循环执行以下比较:

Compare 0 with N
Compare 1 with N
Compare 2 with N
...
Compare N-1 with N
Compare N with N

总计:N+1比较。所以现在我们知道比较次数比迭代次数多1次。

现在为2-sum变体:

for (int i = 0; i < N; i++)
    for (int j = i; j < N; j++)

内部循环执行N-i次迭代,因此每次N-i+1进行i次比较。外循环执行N次迭代,因此进行N+1次比较。因此,比较总数可以描述如下:

  • N + 1外环的比较
  • i=0
  • 的内环的N + 1比较
  • i=1
  • 的内循环进行N次比较
  • i=2
  • 的内环的N-1比较
  • ...
  • i=N-1
  • 的内循环的2个比较

所有这些数字都会产生一系列连续数字(您可以将N+12替换为N+21),其总和很容易计算。

而且,它实际上是1/2*(N+3)(N+2)

答案 1 :(得分:1)

让我们先尝试一些简单的事情:

for (int i = 1; i < N; i++)
  *do something*

这将做N次。

现在是一个嵌套循环:

for (int i = 1; i < N; i++)
  for (int j = 1; j < N; j++)
    *do something*

这将做N 2 次。

现在是一个不同的嵌套循环:

for (int i = 1; i < N; i++)
  for (int j = i; j < N; j++)
    *do something*

这将做N(N + 1)/ 2次。

使用从0开始的循环完成相同的序列,并计算“&lt;”比较,你会得到(N + 1)(N + 2)/ 2。

答案 2 :(得分:0)

使用嵌套循环,您将进行最里面的评估1 + 2 + 3 + ... + N次。从1到N的整数之和为N*(N+1)/2。但是,您需要在每个循环上再进行一次比较以发现终止条件,因此比较总数为(N+1)*(N+2)/2。无论哪种方式,当你引入big-O表示法时,它都是O(N 2 )。