ord*_*ary 6 c++ algorithm big-o time-complexity
1)
x = 25;
for (int i = 0; i < myArray.length; i++)
{
if (myArray[i] == x)
System.out.println("found!");
}
Run Code Online (Sandbox Code Playgroud)
我认为这个是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!");
Run Code Online (Sandbox Code Playgroud)
我认为这个是O(1),因为对于任何输入n,它将运行10000*10000次.不确定这是否正确.
3)
a = 0
for (int i = 0; i < k; i++)
{
for (int j = 0; j < i; j++)
a++;
}
Run Code Online (Sandbox Code Playgroud)
我认为这个是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;
}
Run Code Online (Sandbox Code Playgroud)
这个,我认为是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;
}
Run Code Online (Sandbox Code Playgroud)
我很困惑这个.外循环运行n次.内部for循环运行n +(n-1)+(n-2)+ ...(n - k)+ 1次?O(n ^ 3)??
或多或少,是的。
1 是正确的 - 看来您正在寻找一个特定的元素,我认为这是一个未排序的集合。如果是这样,最坏的情况是该元素位于列表的最末尾,因此 O(n)。
2 是正确的,虽然有点奇怪。假设r和c是常量并且界限不是变量,其时间复杂度为 O(1)。如果它们是常数,那么是 O(1),因为没有任何输入。
3 我相信这仍然被认为是 O(n^2) 。会有一些常数因子,例如 k * n^2,去掉常数,就得到 O(n^2)。
4 看起来很像排序集合的二分搜索算法。O(logn) 是正确的。它是对数,因为在每次迭代中,您基本上将要查找的元素可能存在的可能选择数量减半。
5 看起来像冒泡排序,O(n^2),原因与 3 类似。
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |