【发布时间】:2018-11-18 03:43:48
【问题描述】:
int dup_chk(int a[], int length)
{
int i = length;
while (i > 0)
{
i--;
int j = i -1;
while (j >= 0)
{
if (a[i] == a[j])
{
return 1;
}
j--;
}
}
return 0;
}
所以我认为我知道以下内容:
- 第 1 行只是 1。
- 第一个 while 循环是 N+1。
- 我——;自第一个 while 循环以来是 N 次。
- j = i -1;也是 N。
- 第二个 while 循环是 (N+1)N = N^2+N,因为它是 while 循环中的一个 while 循环
- if 语句:???
- j--;是 N(N) = N^2
- 返回0;是 1
我对计算算法的时间复杂度真的很陌生,所以我什至不确定我认为我知道的是否完全正确。 但困扰我的是 if 语句,我不知道如何计算(如果后面还有 else 怎么办?)
编辑:总计等于 3/2N^2 + 5/2N+3 我知道这个函数是 O(N^2),但不太明白总计是如何计算的。
【问题讨论】:
-
Big-O 分析是关于渐近性能的。如果数组中的任何两个条目相同,则算法会提前退出。如果所有值都是唯一的,则为 O(N²),因为每个值都与其他值进行比较。 N ⟶ ∞ 的渐近情况可以忽略恒定成本,甚至 O(N) 成本,因为 O(N²) 成本占主导地位。这就是 Big-O 符号的美丽和简单。
-
您能详细说明一下吗?我有点失落。我知道这个函数是 O(N^2),因为当 N 非常大时,其余的无关紧要,但我不太明白如何计算确切的总数。编辑:总数应该是 3/2N^2 + 5/2N+3 只是我不确定这个总数是如何达到的。 (我也会在主要问题中对此进行编辑)
-
您可能会感兴趣许多不同的行为:例如,最佳、最差和平均情况。由于
if会导致过早退出,因此最坏的情况当然if永远不会成立。有许多算法的平均情况与最坏情况有很大不同。 -
我认为我正在寻找的是一个悲观的绩效衡量标准。最坏的情况。
-
这里的关键是算法理论和“Big O”大多是 1960 年代的 BS。在现实世界中唯一重要的是代码的执行速度,它以秒为单位,而不是“n”。比较相对便宜。在旧的废话编译器上,由于“如果为零则分支”指令,向下迭代会产生稍快的比较。那是 1980 年代至 1990 年代的某个地方。 今天重要的是分支的数量和迭代数据的一致性。因此,对所有数据进行线性搜索可能比对某些数据进行二分搜索快几倍。
标签: c algorithm time-complexity big-o analysis