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!");
入力 n に対して 10000 * 10000 回実行されるため、これは O(1) だと思います。これが正しいかどうかはわかりません。
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)ですか??