【发布时间】:2015-09-07 05:59:18
【问题描述】:
试图复习我对 Big-O 的理解以进行测试(显然需要非常基本的 Big-O 理解)我已经提出并在我的书中做一些练习题。
他们给了我以下sn-p
public static void swap(int[] a)
{
int i = 0;
int j = a.length-1;
while (i < j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
我觉得很容易理解。它有两个迭代器,每个迭代器都覆盖了数组的一半,工作量固定(我认为它们的时钟都在 O(n/2))
因此 O(n/2) + O(n/2) = O(2n/2) = O(n)
现在请原谅,因为这是我目前的理解,也是我尝试解决问题的方法。我在网上找到了很多 big-o 的示例,但没有一个与迭代器基本同时递增和修改数组的情况非常相似。
它有一个循环的事实让我觉得它无论如何都是 O(n)。
有人介意帮我解决这个问题吗?
谢谢
【问题讨论】:
-
仅供参考:即使你只迭代了半个数组——例如
sumOddIndexElements()——它仍然是 O(n)。 1/2 的常数因子消失了。当您开始分析更复杂的算法时,在分析早期从精确计数切换到大 O 会很有帮助。然后您的中间步骤变得更简单,因为您可以丢弃术语。 IE。如果一个子程序完成 O(n) + O(log n) 的工作,您可以立即将其减少到 O(n) 以进行其余的分析。 -
@japreiss 对不起,我不想以任何方式冗余,但你的最后一句话让我有点困惑。如果我理解正确的话,O(log n) 在某个点上对于 O(n) 来说将变得微不足道,以至于不值得计算时间效率,因此我们放弃它?
-
根据大 O 的定义,当您添加项时,您始终可以删除除渐近最大的项之外的所有项。你可以证明
n + log n < 2n但2n是 O(n)。所以是的,它是微不足道的,以非常明确的方式。