我开始参加有关算法的课程,并坚持使用 2-sum算法权重计算(以及3-sum等)。
有一个简单的1-sum示例:
int count = 0;
for (int i = 0; i < N; i++)
if (a[i] == 0)
count ++
其中N只是数字 - 确切的值无关紧要。
还有下一个参数:
依此类推 - 很明显
但接下来是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 + 1 是明确的 - 就像在1-sum循环中一样。
但是什么是(1/2)(N + 2)?
答案 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
次比较。因此,比较总数可以描述如下:
i=0
i=1
i=2
i=N-1
所有这些数字都会产生一系列连续数字(您可以将N+1
和2
替换为N+2
和1
),其总和很容易计算。
而且,它实际上是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 )。