【发布时间】:2012-07-13 19:29:00
【问题描述】:
1)
x = 25;
for (int i = 0; i < myArray.length; i++)
{
if (myArray[i] == x)
System.out.println("found!");
}
我认为这个是 O(n)。
2)
for (int r = 0; r < 10000; r++)
for (int c = 0; c < 10000; c++)
if (c % r == 0)
System.out.println("blah!");
我认为这个是 O(1),因为对于任何输入 n,它将运行 10000 * 10000 次。不确定这是否正确。
3)
a = 0
for (int i = 0; i < k; i++)
{
for (int j = 0; j < i; j++)
a++;
}
我认为这个是 O(i * k)。我真的不知道如何解决这样的问题,因为内部循环受到外部循环中递增的变量的影响。这里的一些关键见解将不胜感激。外循环运行 k 次,内循环运行 1 + 2 + 3 + ... + k 次。所以这个总和应该是 (k/2) * (k+1),这将是 k^2 的顺序。那么它实际上是O(k ^ 3)吗?这似乎太大了。同样,不知道如何处理。
4)
int key = 0; //key may be any value
int first = 0;
int last = intArray.length-1;;
int mid = 0;
boolean found = false;
while( (!found) && (first <= last) )
{
mid = (first + last) / 2;
if(key == intArray[mid])
found = true;
if(key < intArray[mid])
last = mid - 1;
if(key > intArray[mid])
first = mid + 1;
}
这个,我认为是 O(log n)。但是,我得出这个结论是因为我相信这是一个二分搜索,而且我从阅读中知道运行时间是 O(log n)。我认为这是因为对于循环的每次迭代,您将输入大小除以 2。但是,我不知道这是否是正确的推理,或者如何处理我没有见过的类似算法,并且能够以更可验证或更正式的方式推断它们在对数时间内运行。
5)
int currentMinIndex = 0;
for (int front = 0; front < intArray.length; front++)
{
currentMinIndex = front;
for (int i = front; i < intArray.length; i++)
{
if (intArray[i] < intArray[currentMinIndex])
{
currentMinIndex = i;
}
}
int tmp = intArray[front];
intArray[front] = intArray[currentMinIndex];
intArray[currentMinIndex] = tmp;
}
我对此感到困惑。外循环运行 n 次。内部 for 循环运行 n + (n-1) + (n-2) + ... (n - k) + 1 次?那是 O(n^3) 吗?
【问题讨论】:
-
3) 是 O(k^2),因为您将执行 k*(k+1)/2 个操作,即 O(k^2)。 5) 是一样的:内循环运行 n,然后 n-1,然后 n-2 ... 然后 1 次,所以总体 n*(n+1)/2 次,所以 O(n^2)。
-
5) 是冒泡排序 (en.wikipedia.org/wiki/Bubble_sort),即 O(n^2)。
-
你能详细说明一下吗?内循环不运行 n*(n+1)/2 次吗?并且外部循环不会运行 n 次。那不是 [ n * ( n*(n+1)/2) ]
-
@ordinary:检查我的答案,重要的是你执行比较的次数,所以它只是内循环运行的总次数,即 n*(n+1)/ 2
标签: c++ algorithm big-o time-complexity