알고리즘의 전투력 측정기!
ex) O(3n^3 + 5n^2 + 2n + 7)의 경우, Big O 표기법으로 O(n^3)이 된다.
int Sum(int n)
{
int sum = 0;
for (int i = 0; i <= n; i++)
{
sum += i;
}
return sum;
}
for문을 n번 반복하기 때문에 시간 복잡도는 O(n)이다.
void PrintPairs(int n)
{
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
Console.WriteLine(i + ", " + j);
}
}
}
중첩 for문을 n × n 번을 돌기 때문에 시간 복잡도는 O(n^2)이다.
int Fibonacci(int n)
{
if (n <= 1)
{
return n;
}
else
{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
재귀적으로 피보나치 수열을 계산하는 함수! 이 함수는 각 호출마다 두 번의 재귀 호출을 수행하기 때문에 시간 복잡도는 O(2^n)이다. 매우 비효율적인 방법!!!!!!!!!
// 시간 복잡도: O(n)
int FindMax(int[] arr)
{
int max = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
return max;
}
// 시간 복잡도: O(n^2)
int FindMax2(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
bool isMax = true;
for (int j = 0; j < arr.Length; j++)
{
if (arr[j] > arr[i])
{
isMax = false;
break;
}
}
if (isMax)
{
return arr[i];
}
}
return -1;
}
int[] arr = new int[] { 1, 2, 3, 4, 5 };
// FindMax 메서드의 시간 복잡도: O(n), 공간 복잡도: O(1)
int max = FindMax(arr);
// 배열의 크기에 비례하여 실행 시간이 증가하므로 O(n)이라 할 수 있다.
// 또한 추가적인 메모리 공간을 사용하지 않기 때문에 공간 복잡도는 O(1)이라 할 수 있다.
// FindMax2 메서드의 시간 복잡도: O(n^2), 공간 복잡도: O(1)
int max2 = FindMax2(arr);
// 이중 반복문을 사용하기 때문에 배열의 크기에 제곱에 비례하여 실행 시간이 증가하므로
// O(n^2)이라 할 수 있다. 이 알고리즘은 추가적인 메모리 공간을 사용하지 않기 때문에
// 공간 복잡도는 O(1)이라 할 수 있다.
시간 복잡도와 공간 복잡도 계산해보기
public static bool FindNumber(int[] array, int target)
{
for (int i = 0; i < array.Length; i++)
{
if (array[i] == target)
{
return true;
}
}
return false;
}
FindNumber는 array를 한 번 돌면서 target과 같은지 비교를 하고 있기 때문에 시간 복잡도는 O(n)이다. 또한 추가적인 메모리 공간을 사용하지 않았기 때문에 공간 복잡도는 O(1)이다.
👉 시간 복잡도 : O(n), 공간 복잡도 : O(1)
public static int FindMax(int[] array)
{
int max = int.MinValue;
for (int i = 0; i < array.Length; i++)
{
if (array[i] > max)
{
max = array[i];
}
}
return max;
}
FindMax는 array를 돌며 최대값을 찾기 때문에 시간 복잡도는 O(n)이다. 공간 복잡도의 경우, 변수가 하나만 새로 추가 되기 때문에 O(1)이다.
👉 시간 복잡도 : O(n), 공간 복잡도 : O(1)
public static int[] RemoveDuplicates(int[] array)
{
List<int> distinctList = new List<int>();
foreach (int num in array)
{
if (!distinctList.Contains(num))
{
distinctList.Add(num);
}
}
return distinctList.ToArray();
}
해당 코드는 배열을 돌면서 중복되는 인덱스를 제거하는 코드이다. 배열을 1번 돌기 때문에 시간 복잡도는 O(n)이다. 중복되는 인덱스를 제거한 배열을 새로 만들기 때문에 공간 복잡도는 O(n)이다.
👉 시간 복잡도 : O(n), 공간 복잡도 : O(n)