Skip to content
Home » 시간 복잡도 공간 복잡도 | 빅오 표기법(Big-O Notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자] 9547 명이 이 답변을 좋아했습니다

시간 복잡도 공간 복잡도 | 빅오 표기법(Big-O Notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자] 9547 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “시간 복잡도 공간 복잡도 – 빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자]“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Minsuk Heo 허민석 이(가) 작성한 기사에는 조회수 16,229회 및 좋아요 143개 개의 좋아요가 있습니다.

Table of Contents

시간 복잡도 공간 복잡도 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자] – 시간 복잡도 공간 복잡도 주제에 대한 세부정보를 참조하세요

빅오 표기법(Big-O notation), 시간복잡도, 공간복잡도 (Big O Notation)를 5분간 예제를 통해 알아봅니다.

시간 복잡도 공간 복잡도 주제에 대한 자세한 내용은 여기를 참조하세요.

시간복잡도와 공간복잡도(Time Complexity Space Complexity)

공간 복잡도. 공간 복잡도(Space Complexity)란, 프로그램을 실행시킨 후 완료하는 데 필요로 하는 자원 공간의 양을 말합니다. 총 …

+ 더 읽기

Source: madplay.github.io

Date Published: 7/9/2021

View: 6349

[Algorithm] 시간 복잡도, 공간 복잡도 – velog

공간 복잡도(Space Complexity)란 작성한 프로그램이 얼마나 많은 공간(메모리)을 차지하느냐를 분석하는 방법입니다. 하지만 예전에 비해 컴퓨터 성능의 …

+ 자세한 내용은 여기를 클릭하십시오

Source: velog.io

Date Published: 3/9/2022

View: 3973

시간 복잡도(Time Complexity) 및 공간 복잡도(Space Complexity)

공간 복잡도는 알고리즘에서 사용하는 메모리 양을 나타냅니다. 공간 복잡도는 보조공간(Auxiliary Space)과 입력 공간(input size)을 합친 포괄적인 개념 …

+ 여기에 더 보기

Source: yoongrammer.tistory.com

Date Published: 6/22/2021

View: 9002

시간 복잡도, 공간 복잡도 – Roopretelcham

알고리즘의 성능 측정을 위한 수단에는 위에 소개된 시간 복잡도(time complexity) 외에 공간 복잡도(space complexity)도 있다. 시간 복잡도가 알고리즘 …

+ 더 읽기

Source: servertrix.com

Date Published: 8/26/2021

View: 1962

시간복잡도 & 공간복잡도 – Daily Tech Notes – 티스토리

빅오 즉, 알고리즘의 효율도를 측정하기 위한 척도는 크게 “시간복잡도”와 “공간복잡도”로 나눌 수 있다. 공간복잡도란? 공간복잡도는 안어 그대로, …

+ 여기에 표시

Source: hazel-developer.tistory.com

Date Published: 11/11/2022

View: 2449

[Algorithm] 알고리즘 공간복잡도에 대하여 – 코딩팩토리

공간복잡도(Space Complexity)란 프로그램의 성능을 분석하는 방법 중 하나로, 작성한 프로그램이 얼마나 많은 공간(메모리)을 차지하느냐를 분석하는 …

+ 자세한 내용은 여기를 클릭하십시오

Source: coding-factory.tistory.com

Date Published: 11/10/2022

View: 158

공간복잡도 – 해시넷 위키

복잡도의 기준은 알고리즘이 소모하는 소요 시간과 메모리 사용량 등의 자원이다. 전자를 시간복잡도(time complexity), 후자를 공간복잡도라 한다.

+ 여기에 더 보기

Source: wiki.hash.kr

Date Published: 12/28/2022

View: 8879

[컴퓨터 알고리즘 성능분석] 시간 복잡도 vs 공간 복잡도 – Tistory

알고리즘 트레이닝 사이트에서 문제를 풀다보면 아래 그림과 같이 시간 복잡도와 공간 복잡도가 조건으로 주어진다. 알고리즘을 평가하는데 있어 수행시간 …

+ 자세한 내용은 여기를 클릭하십시오

Source: ledgku.tistory.com

Date Published: 9/21/2022

View: 7632

주제와 관련된 이미지 시간 복잡도 공간 복잡도

주제와 관련된 더 많은 사진을 참조하십시오 빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자]. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자]
빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자]

주제에 대한 기사 평가 시간 복잡도 공간 복잡도

  • Author: Minsuk Heo 허민석
  • Views: 조회수 16,229회
  • Likes: 좋아요 143개
  • Date Published: 2016. 10. 15.
  • Video Url link: https://www.youtube.com/watch?v=OVRLHJC95Gs

시간복잡도와 공간복잡도(Time Complexity Space Complexity)

/* Case 1 */ sum <- n * n ; /* Case 2 */ sum <- 0 for i <- 1 to n do sum <- sum + n ; /* Case 3 */ sum <- 0 for i <- 1 to n do for j <- 1 to n do sum <- sum + 1 ;

[Algorithm] 시간 복잡도, 공간 복잡도

당분간 제 교수님이 되실 ‘나동빈’님입니다! 아주아주 유명하신 분이죠. 코딩 테스트 스터디에 참여하여 해당 교재로 공부하게 되었고, 복습하고 정리할 수 있는 부분을 정리해보려고 합니다.🧐

시청 강의

1. 코딩 테스트 출제 경향 분석 및 파이썬 문법 부수기

오늘은

1강: 코딩 테스트 개요 및 출제 경향 00:00:00

2강: 알고리즘 성능 평가 00:16:24

이 파트를 같이 시청했고 2강의 경우는 시청 후에 간단히 이야기를 나누며 내용을 한 번 더 이해하는 시간을 가졌습니다.

이번 강의는 무려 2시간 20분짜리인데, 뒷파트는 파이썬 문법 파트로 이루어져 있습니다! 시작 전 복습하면 좋을 것 같네요.

알고리즘 성능 평가

어떤 알고리즘이 있을 때, 그 알고리즘의 성능 평가는 어떻게 할 수 있을까요?

알고리즘 성능을 평가하기 위해 ‘복잡도(Complexity)’의 척도를 사용한다고 합니다.

그중 시간 복잡도 와 공간 복잡도 의 개념이 나오며, 동일한 기능을 수행하는 알고리즘이 있을 때 복잡도가 낮을 수록 좋은 알고리즘이라 말한다고 합니다.

시간 복잡도 : 특정한 크기의 입력에 대하여 알고리즘의 수행 시간 분석

: 특정한 크기의 입력에 대하여 알고리즘의 수행 시간 분석 공간 복잡도 : 특정한 크기의 입력에 대하여 알고리즘의 메모리 사용량 분석

1. 시간 복잡도

시간 복잡도는 특정 알고리즘이 어떤 문제를 해결하는데 걸리는 시간을 의미합니다. 같은 결과를 갖는 프로그래밍 소스도 작성 방법에 따라 걸리는 시간이 달라지며, 같은 결과를 같는 소스라면 시간이 적게 걸리는 것이 좋은 소스입니다.

빅-오 표기법

시간 복잡도에는 빅-오 표기법이라는 개념이 나옵니다.

예를 들어, 동전을 튕겨 뒷면이 나올 확률을 이야기 할 때 운이 좋으면 1번에 뒷면이 나오지만 운이 안 좋다면 n번 만큼 동전을 튕겨야 하는 경우가 발생합니다.

이 최악의 경우를 계산하는 방식을 빅-오(Big-O) 표기법이라 부릅니다.

[시간 복잡도 그래프]

※ 여기서 n이란 입력되는 데이터를 의미합니다.

O(1) (Constant)

입력 데이터의 크기에 상관없이 언제나 일정한 시간이 걸리는 알고리즘을 나타냅니다. 데이터가 얼마나 증가하든 성능에 영향을 거의 미치지 않습니다.

O(log₂ n) (Logarithmic)

입력 데이터의 크기가 커질수록 처리 시간이 로그(log: 지수 함수의 역함수) 만큼 짧아지는 알고리즘입니다. 예를 들어 데이터가 10배가 되면, 처리 시간은 2배가 됩니다. 이진 탐색이 대표적이며, 재귀가 순기능으로 이루어지는 경우도 해당됩니다.

O(n) (Linear)

입력 데이터의 크기에 비례해 처리 시간이 증가하는 알고리즘입니다. 예를 들어 데이터가 10배가 되면, 처리 시간도 10배가 됩니다. 1차원 for문이 있습니다.

O(n log₂ n) (Linear-Logarithmic)

데이터가 많아질수록 처리시간이 로그(log) 배만큼 더 늘어나는 알고리즘입니다. 예를 들어 데이터가 10배가 되면, 처리 시간은 약 20배가 된다. 정렬 알고리즘 중 병합 정렬, 퀵 정렬이 대표적입니다.

O(n²) (quadratic)

데이터가 많아질수록 처리시간이 급수적으로 늘어나는 알고리즘입니다. 예를 들어 데이터가 10배가 되면, 처리 시간은 최대 100배가 됩니다. 이중 루프(n² matrix)가 대표적이며 단, m이 n보다 작을 때는 반드시 O(nm)로 표시하는 것이 바람직합니다.

O(2ⁿ) (Exponential)

데이터량이 많아질수록 처리시간이 기하급수적으로 늘어나는 알고리즘입니다. 대표적으로 피보나치 수열이 있으며, 재귀가 역기능을 할 경우도 해당됩니다.

그래프와 위 설명을 참고하여, 시간 복잡도에 따른 성능을 비교하면 아래와 같습니다.

faster O(1) < O(log n) < O(nlog n) < O(n²) < O(2ⁿ) slower slower로 갈수록(즉, 오른쪽 방향으로 갈수록) 효율성이 떨어집니다. 빅오 표기법 예제 O(1) : 스택의 Push , Pop O(log n) : 이진트리 O(n) : for 문 O(n log n) : 퀵 정렬(quick sort) , 병합정렬(merge sort) , 힙 정렬(heap Sort) O(n²): 이중 for 문 , 삽입정렬(insertion sort) , 거품정렬(bubble sort) , 선택정렬(selection sort) O(2ⁿ) : 피보나치 수열 시간 측정 방법 import time start_time = time . time ( ) end_time = time . time ( ) print ( "time:" , end_time - start_time ) 위 코드로 측정 시간과 측정 종료 시간을 비교하여 확인할 수 있습니다. 수행 시간 비교 아래의 코드는 배열에 1~100까지의 정수를 무작위로 골라 10,000개의 정수를 삽입하는데, 가장 작은 원소의 인덱스부터 차곡차곡 넣어주는 for문을 직접 짠 코드와 파이썬 기본 라이브러리 sort 를 사용하여 수행 시간 차이를 보는 코드입니다. from random import randint import time array = [ ] for _ in range ( 10000 ) : array . append ( randint ( 1 , 100 ) ) start_time = time . time ( ) for i in range ( len ( array ) ) : min_index = i for j in range ( i + 1 , len ( array ) ) : if array [ min_index ] > array [ j ] : min_index = j array [ i ] , array [ min_index ] = array [ min_index ] , array [ i ] end_time = time . time ( ) print ( “선택 정렬 성능 측정:” , end_time – start_time ) array = [ ] for _ in range ( 10000 ) : array . append ( randint ( 1 , 100 ) ) start_time = time . time ( ) array . sort ( ) end_time = time . time ( ) print ( “기본 정렬 라이브러리 성능 측정:” , end_time – start_time )

해당 코드를 시행해보면

선택 정렬 성능 측정: 6.268864870071411 기본 정렬 라이브러리 성능 측정: 0.0009975433349609375

엄청나게 시간이 차이가 발생합니다. 보통 코딩 테스트 문제를 풀 때 수행 시간으로 1~5초를 준다고 하니까 6초가 걸리는 방식으로 코드를 짜면 안 된다는 걸 알 수 있습니다.

다시 시도했을 경우,

선택 정렬 성능 측정: 4.549175024032593 기본 정렬 라이브러리 성능 측정: 0.000997304916381836

어쨌든 성능 차이가 큽니다.

2. 공간 복잡도

공간 복잡도(Space Complexity)란 작성한 프로그램이 얼마나 많은 공간(메모리)을 차지하느냐를 분석하는 방법입니다.

하지만 예전에 비해 컴퓨터 성능의 발달로 인해 메모리 공간이 넘쳐나다 보니 중요도는 떨어졌다고 합니다.

시간 복잡도의 경우 알고리즘을 잘못 구성하면 결괏값이 나오지 않거나 너무 느린 속도로 나와서 최근에는 시간 복잡도를 더 우선시하여 프로그래밍을 작성한답니다!

정리하자면

시간과 공간은 반비례적 경향이 있음

최근 대용량 시스템이 보편화되면서, 공간 복잡도보다는 시간 복잡도가 우선

알고리즘은 시간 복잡도가 중심

공간복잡도 계산법(빅-오)

a = 1

일반적으로 공간이 하나 생성되는 것을 1이라고 표현합니다. 이를 O(1) 로 표기합니다.

result = 0 for i in range ( 1 , 100 ) : result += i

반복문이 N번만큼 반복해도 for문 안에서의 지역변수이므로 공간 복잡도는 여전히 O(1)이다.

i와 result 변수만 사용

다른 것은 전혀 영향을 주지 않음

여기서의 공간 복잡도도 O(1)입니다.

하지만 재귀함수일 경우에는 이야기가 달라집니다.

def factorial ( n ) : if n == 1 : return 1 return n * factorial ( n – 1 )

위의 경우 함수의 매개변수 n의 값에 따라 공간 복잡도가 달라지는 경우입니다. 함수 내부에서 n이 1일 때까지 팩토리얼을 구하는 함수가 재귀적으로 호출되므로 스택에는 n부터 1까지 모두 쌓이며 공간 복잡도는 O(n) 이 됩니다.

공간 복잡도를 줄이는 방법

공간 복잡도를 결정하는것은 보통 배열의 크기가 몇인지, 얼마 만큼의 동적 할당인지, 몇 번의 호출을 하는 재귀 함수인지 등이 공간 복잡도에 영향을 끼칩니다.

프로그램에 필요한 공간은 크게

고정 공간 가변 공간

이 있는데, 시간적인 측면을 무시하고 공간 복잡도만 고려한다면 고정 공간보다는 가변 공간을 사용할 수 있는 자료 구조가 더 효율적입니다.

함수 호출시 할당되는 지역변수들이나 동적 할당되는 객체들도 모두 공간이 필요합니다. 특히, 재귀 함수의 경우 매 함수 호출마다 함수의 매개변수, 지역변수, 함수의 복귀 주소를 저장할 공간이 필요해서 재귀적(Recursive)으로 짤 수도 있고, 반복문으로도 짤 수 있는 경우에는 반복문으로 짜는 것이 더 효율적이라 봅니다.

References

해당 유튜브, 블로그 자료를 참고하여 정리하였습니다. 감사합니다.

🔗 [1] 유튜브 강의 – 1. 코딩 테스트 출제 경향 분석 및 파이썬 문법 부수기

🔗 [2] 코딩팩토리 – [Algorithm] 알고리즘 시간복잡도에 대하여

🔗 [3] 티스토리 블로그 – 빅오 표기법 (big-O notation) 이란

🔗 [4] 코딩팩토리 [Algorithm] 알고리즘 공간복잡도에 대하여

시간 복잡도(Time Complexity) 및 공간 복잡도(Space Complexity)

목차

시간 복잡도(Time Complexity) 및 공간 복잡도(Space Complexity)

알고리즘을 평가할 때 시간 복잡도와 공간 복잡도를 사용합니다.

시간 복잡도: 알고리즘의 수행시간을 평가

공간 복잡도: 알고리즘 수행에 필요한 메모리 양을 평가

시간 복잡도와 공간 복잡도는 주로 점근적 표기법 중 빅오 표기법을 이용하여 나타냅니다.

이유는 최악의 경우에도 해당 알고리즘이 어떤 성능을 낼지 가늠해볼 수 있기 때문입니다.

시간 복잡도(Time Complexity)

알고리즘의 수행 시간을 분석할 때 시간 복잡도를 사용합니다.

수행 시간은 실행환경에 따라 다르게 측정되기 때문에 기본 연산의 실행 횟수로 수행 시간을 평가합니다.

기본 연산은 다음과 같습니다.

데이터 입출력 – copy, move… 산술 연산 – add, multiply … 제어 연산 – if, while …

시간 복잡도는 3가지 경우로 나타냅니다.

최선의 경우 (Best Case) 빅 오메가 표기법 사용

최선의 시나리오로 최소 이만한 시간이 걸림 최악의 경우 (Worst Case) 빅 오 표기법 사용

최악의 시나리오로 아무리 오래 걸려도 이 시간보다 덜 걸림 평균적인 경우 (Average Case) 빅 세타 표기법 사용

평균 시간을 나타냄

평균적인 경우를 가장 많이 사용할 것 같지만 알고리즘이 복잡해질수록 평균적인 경우는 구하기가 매우 어려워 지기 때문에 최악의 경우로 알고리즘의 성능을 파악합니다.

시간 복잡도 계산

시간 복잡도는 일반적으로 빅오 표기법으로 나타냅니다.

연산 횟수가 다항식으로 표현될 경우, 최고차항을 제외한 모든 항과 최고차항의 계수를 제외시켜 나타냅니다.

예를 들어 입력 크기가 n이라고 했을 때 다음과 같이 표기합니다.

\(T(n) = n^2+2n+1 = O(n^2)\) : 최고차항만 나타냄.

\(T(n) = 2n = O(n)\) : 최고차항의 계수는 제외함.

다음 알고리즘을 가지고 시간 복잡도를 구해보겠습니다.

int func (int n) { int sum = 0; // 대입연산 1회 int i = 0; // 대입연산 1회 for(i=0; i < n; i++) { // 반복문 n+1회 sum += i; // 덧셈 연산 n회 } for(i=0; i < n; i++) { // 반복문 n+1회 sum += i; // 덧셈 연산 n회 } return sum; // 리턴 1회 } 위 알고리즘에 단계별 연산 횟수는 주석과 같고 총 연산 횟수는 4n+5입니다. 그러므로 이 알고리즘의 시간 복잡도는 다음과 같습니다. $$ T(n) = 4n+5 = O(n) $$ 728x90 시간 복잡도 표기 \(O(1)\) - 상수 시간 (Constant time) 입력 크기(n)에 상관없이 일정한 연산을 수행하면 시간복잡도는 O(1)입니다. void func (int n) { printf("%d ", n); } 위 알고리즘은 n에 상관없이 한 번에 연산만 수행하기 때문에 시간 복잡도는 다음과 같습니다. $$T(n)=O(1)$$ \(O(logN)\) - 로그 시간 (Logarithmic time) 입력 크기(N)가 커질 때 연산 횟수가 logN에 비례해서 증가하면 시간 복잡도는 O(logN)입니다. for(i=1; i<=n; i*2) { ... } 위 알고리즘은 i 값이 반복할 때마다 2배씩 증가합니다. 이것을 k번 반복했을 때 다음과 같습니다. \(2^k =N\) 이 되고 반복문이 종료됩니다. 양쪽에 로그를 취하면 다음과 같습니다. $$log_2(2^k) = log_2N$$ $$k = log_2N$$ k는 수행 횟수이기 때문에 시간 복잡도는 다음과 같습니다. $$T(n) = logN$$ \(O(n)\) - 선형 시간 (Linear time) 입력 크기(n)가 커질 때 연산 횟수가 n에 비례해서 증가하면 시간 복잡도는 O(n)입니다. 연산횟수가 선형적으로 증가하는 형태 for(i=0; i < n; i++) { ... } 위 알고리즘은 n만큼 반복문을 수행합니다. n에 값에 비례해서 연산수가 선형적으로 증가하기 때문에 시간 복잡도는 다음과 같습니다. $$T(n) = O(n)$$ \(O(n^2)\) - 2차 시간 (Quadratic time) 입력 크기(n)가 커질 때 연산 횟수가 \(n^2\)에 비례해서 증가하면 시간 복잡도는 \(O(n^2)\)입니다. for(i=0; i < n; i++) { for(j=0, j < n; j++) { ... } } 위 알고리즘은 for문이 중첩되어 있기 때문에 \(n^2\)에 비례해서 연산수가 증가합니다. 시간 복잡도는 다음과 같습니다. $$T(n) = O(n^2)$$ \(O(2^n)\) - 지수 시간 (Exponential time) 입력 크기가 커질 때 연산수가 \(2^n\)에 비례해서 증가하면 시간 복잡도는 \(O(2^n)\)입니다. int func (int n) { if (n <= 1) return n; return func(n-1) + fun(n-2); } 위 알고리즘은 피보나치 수를 구하는 알고리즘입니다. 한번 함수를 호출할 때마다 두 번씩 재귀로 함수를 호출하기 때문에 \(2^n\)에 비례해서 연산수가 증가합니다. 시간 복잡도는 다음과 같습니다. $$T(n) = O(2^n)$$ 다음은 빅오 표기법으로 표현한 알고리즘의 성능 간 그래프입니다. https://www.bigocheatsheet.com/ $$O(1) < O(log n) < O(n) < O(nlogn) < O(n2) < O(2n) < O(n!)$$ 오른쪽으로 갈수록 시간 복잡도가 큰(수행 시간이 긴) 알고리즘입니다. n의 값이 작을 때는 알고리즘 사이에 큰 차이가 없지만 n의 값이 커지면 커질수록 복잡한 알고리즘은 수행 시간이 급격히 길어지게 됩니다. 시간 복잡도를 낮출 수 있다면 프로그램에 큰 성능 향상을 기대할 수 있습니다. 공간 복잡도(Space Complexity) 공간 복잡도는 알고리즘에서 사용하는 메모리 양을 나타냅니다. 공간 복잡도는 보조공간(Auxiliary Space)과 입력 공간(input size)을 합친 포괄적인 개념입니다. 보조 공간(Auxiliary Space)은 알고리즘이 실행되는 동안 사용하는 임시 공간입니다. 그렇기 때문에 입력 공간(input size)을 고려하지 않습니다. 공간 복잡도 계산 공간 복잡도도 시간 복잡도와 유사하게 빅오 표기법을 사용합니다. 다음 알고리즘을 보고 공간 복잡도를 계산해 보겠습니다. int sum(int a[], int n) { int x = 0; for(int i = 0; i < n; i++) { x = x + a[i]; } return(x); } 위 알고리즘은 4개의 변수를 사용하고 있습니다. int arr[n] : 4*n byte (입력 공간) int n : 4 byte (입력 공간) int x : 4 byte (보조 공간) int i : 4 byte (보조 공간) 총 4n+12 에 메모리를 요구합니다. 메모리가 입력 값에 따라 선형적으로 증가하기 때문에 공간 복잡도는 O(n)이 됩니다.

시간 복잡도, 공간 복잡도

반응형

4. 복잡도(complexity)의 개념

알고리즘의 성능분석에 있어서의 복잡도(complexity)의 개념에 대해 살펴보고 공간복잡도(space complexity)와 시간복잡도(time complexity)에 대해 알아본다.

4.1 알고리즘의 성능분석과 복잡도(complexity)

4.2 공간 복잡도(space complexity)

4.3 시간 복잡도(time complexity)

앞 장에서도 언급했듯이 알고리즘은 유한한 횟수의 명령어들을 정해진 순서에 의하여 수행한 다음 언젠가는 반드시 종료되어야 한다.(유한성) 따라서 알고리즘은 일단 시작된 다음 종료될 때까지의 실행시간이 이치에 맞지 않게 너무 길어서는 안된다. 장기 혹은 바둑과 같은 게임에 대한 알고리즘을 예를 들어 생각해 볼 수 있다. 이와 같은 게임의 알고리즘을 개발할 때, 게임중 발생할 수 있는 모든 경우를 조사하여 알고리즘을 구성할 수 있다. 그러나 이러한 방법으로는 알고리즘의 개발 조차도 불가능할 것이며, 그런 방법에 의한 알고리즘의 실행시 얼마만의 시간 안에 계산을 종료할 지도 추측할 수 없게 된다.

따라서, 일반적인 알고리즘은 상식적인 시간 안에 실행을 종료할 수 있어야 하며, 가능한 한 빠른 시간내에 실행을 종료할 수 있어야 한다. 이러한 관점에서 알고리즘의 성능을 분석하기 위해 시간 복잡도(time complexity)라는 개념을 사용하게 된다.

알고리즘의 성능 측정을 위한 수단에는 위에 소개된 시간 복잡도(time complexity) 외에 공간 복잡도(space complexity)도 있다. 시간 복잡도가 알고리즘의 실행시간을 의미한다면 공간 복잡도는 알고리즘을 수행시키기 위해 필요한 기억장치(memory)의 크기를 의미한다.

[정의4.1] 복잡도(complexity)

시간 복잡도(time complexity): 알고리즘을 실행하여 종료할때까지 필요한 시간

공간 복잡도(space complexity): 알고리즘을 실행하여 종료할때까지 필요한 기억장치의 크기

주어진 알고리즘을 실행시키기 위해 필요한 기억장치(space)는 다음과 같이 두 가지로 분류해 볼 수 있다.

알고리즘과 무관한 부분 : 알고리즘의 특성과는 무관한 부분으로 프로그램 코드를 저장하기 위한 공간, 프로그램을 수행하기 위해 시스템이 필요로 하는 공간 등이 이에 포함된다. 알고리즘과 밀접한 부분 : 알고리즘의 특성과 밀접한 관계가 있는 부분으로서 문제를 해결하기 위해 필요로 하는 공간을 의미한다. 즉, 변수를 저장하기 위한 공간이나 순환 프로그램일 경우 순환 스택(recursion stack) 등이 이에 포함된다.

일반적으로 알고리즘의 공간 복잡도를 분석할때는 위의 두가지중 두 번째의 것을 계산하게 된다. 즉, 알고리즘이 문제를 해결하기 위해서 반드시 필요한 부분만을 계산함으로써 주어진 알고리즘의 공간 복잡도를 계산한다.

다음은 공간 복잡도를 구하는 예이다.

[예제4.1] 공간 복잡도의 계산 1

float abc(float a, float b, float c)

{

return(a + b + b*c + (a + b – c)/(a + b) + 4.0);

}

공간 복잡도 = 0

위의 프로그램에서 공간복잡도를 구하기 위해서 살펴볼 것은 변수 a, b, c 이다. 따라서, float형의 변수가 한 워드(word)를 차지한다고 가정하면, 공간복잡도는 ‘3워드’라고 생각할 수 있다. 그러나 변수 a, b, c 는 전달되는 인자(parameter)로서 함수 abc내에서 해결하고자 하는 문제와는 무관하다고 볼 수 있으므로 공간 복잡도는 0이다.

[예제4.2] 공간 복잡도 계산 2

float Sum(float a[], int n)

{

float s = 0.0;

for(int i = 1; i < = n; i++) s += a[i]; return s; } 공간 복잡도 = n + 3 위의 프로그램에서 사용되는 변수는 a[], n, s, i 이다. 이번 예에서도 a[]와 n은 인자로 전달 됨을 볼 수 있다. 그러나 [예제4.1]과는 다르게 변수 a[]는 합을 구하기 위하여 반복문 내에서 n개의 원소가 모두 참조되고 있음을 볼 수 있다. 또한, n은 for-문을 벗어나기 위한 한계값으로 사용된다. 따라서 a[]와 n은 알고리즘이 해결하고자 하는 문제와 밀접한 관련이 있다고 볼 수 있다. 그러므로 프로그램의 복잡도는 (a[]를 저장하기 위한 공간) + (변수 n, s, I를 위한 공간) = n + 3 이 된다. [예제4.3] 공간 복잡도 계산 3 float RSum(float a[], int n) { if(n <= 0) return (0.0); else return (RSum(a, n-1) + a[n]); } 공간 복잡도 = 3(n + 1) 위의 프로그램은 순환기법(resursion)으로 작성된 것이다. 위의 경우 살펴볼 변수는 a[], n이다. 우선 변수 n은 if-문 내에서 순환의 한계값으로 사용되고 있음을 볼 수 있다. 또한, 변수 a[]는 합을 구하기 위하여 사용되고 있으며 a[]의 원소 중에서 n번째의 원소만 필요로 한다. 따라서 변수 a[]와 n이 모두 알고리즘과 밀접한 관계가 있으므로, 프로그램이 필요로 하는 공간은 (a[]의 n번째 원소를 의한 공간) + (n을 위한 공간) = 1 + 1 으로 볼 수 있다. 그러나 위의 프로그램은 순환기법에 의해 작성되었음을 고려해야 한다. 즉, 프로그램이 순환적으로 실행될 것을 고려해서 몇번의 순환후에 실행이 종료되는지(the depth of recursion)를 계산해야 하며, 또한 순환을 위해서 필요한 복귀 주소(return address)를 저장할 공간도 계산해야 한다. 그러므로 프로그램의 공간 복잡도는 (depth of recursion)×(a[n], n, 복귀 주소를 위한 공간) = (n+1)×3 이 된다. 시간 복잡도는 알고리즘을 구성하는 명령어들이 몇 번이나 실행이 되는지를 센 결과(frequency count)에 각 명령어의 실행시간(execution time)을 곱한 합계를 의미한다. 그러나 각 명령어의 실행시간은 특정 하드웨어 혹은 프로그래밍 언어에 따라서 그 값이 달라질 수 있기 때문에 알고리즘의 일반적인 시간 복잡도는 명령어의 실제 실행시간을 제외한 명령어의 실행 횟수만을 고려하게 된다. 이와 같이 알고리즘을 이루는 명령어들의 실행횟수를 계산하여 알고리즘의 시간 복잡도를 구하는 일을 알고리즘의 분석(analysis of algorithm)이라고 한다. 또한, 알고리즘의 분석은 일반적으로 공간 복잡도 보다는 시간 복잡도를 통해서 이루어진다. 따라서 이번 강좌를 통해서 소개되는 알고리즘들의 분석은 대부분 시간 복잡도를 이용할 것이며 특별한 언급이 없는 한 '복잡도'는 '시간 복잡도'를 의미하게 된다. 다음은 시간 복잡도를 구하는 예이다. [예제4.4] 시간 복잡도 계산 1 알고리즘 실행횟수 float Sum(float a[], int n) { float s = 0.0; for(int i = 1; i <= n; I++) s += a[i]; return s; } - - 1 n + 1 n 1 - 명령어 총 실행횟수 = 2n + 3, 시간 복잡도 = O(n) 위 알고리즘의 총 실행 횟수는 2n+3 이 되므로 시간 복잡도는 2n+3이다. 또한 복잡도는 일반적으로 'big oh'표기법을 통해서 평균 실행시간을 표현하게 되는데 위의 알고리즘의 경우는 'big oh' 표기법으로 O(n) 이 된다. 복잡도의 표기 방법에 대해서는 다음절에서 보다 자세히 살펴보도록 하겠다. 순환 알고리즘의 경우, 시간 복잡도를 구하기 위하여 명령어의 실행 횟수를 세는 것은 위의 [예제4.4]와 같은 방법으로는 어렵다. 따라서 일반적으로 순환 알고리즘의 시간 복잡도를 구하기 위해서는 순환식(recursive formula)을 이용하게 된다. [예제4.3]에서 소개된 알고리즘을 예로 들면 다음과 같다. [예제4.5] 시간 복잡도 계산 2 알고리즘 실행횟수 float RSum(float a[], int n) { if(n <= 0) return (0.0); else return (RSum(a, n-1) + a[n]); } - - 1 1 - 1 + T(RSum(n-1)) - 명령어 총 실행횟수 = 2n + 1, 시간 복잡도 = O(n) 위의 알고리즘에서 사용된 순환식을 이용하면 명령어의 실행횟수는 다음과 같음을 알 수 있다. T(RSum(n)) = 2 ,if n = 0 = 2 + T(RSum(n-1) ,if n > 0

이와 같은 순환식은 또한 순환관계(recurrence relation)라고도 말하는데, 이러한 순환관계로부터 총 명령어 실행횟수를 구하는 방법은 다음과 같다.

T(RSum(n)) = 2 + T(RSum(n-1))

= 2 + ( 2 + T(RSum((n-2)) )

= 2 + ( 2 + ( 2 + T(RSum((n-3)) ) )

……

= 2×n + T(RSum(0))

= 2n + 2

따라서, 명령어 실행횟수의 총 합은 2n+2이고 시간 복잡도는 O(n) 이다.

1. 알고리즘의 성능을 측정하기 위한 수단으로서 복잡도(complexity)를 사용하며, 복잡도에는 알고리즘의 수행에 필요한 시간을 의미하는 시간 복잡도(time complexity)와 필요한 기억장치(memory)의 크기를 의미하는 공간 복잡도(space complexity)가 있다.

2. 공간 복잡도는 알고리즘이 해결하고자 하는 문제와 밀접한 관련이 있는 부분 즉, 변수를 저장하기 위한 공간, 순환 프로그램일 경우 순환 스택(recursion stack)등을 모두 합한 값으로 나타낸다.

3. 시간 복잡도는 알고리즘을 구성하는 명령어들의 실행횟수를 모두 합한 값으로 나타내며, 일반적인 알고리즘 분석은 시간 복잡도를 통하여 이루어진다.

반응형

Daily Tech Notes

728×90

빅오 표기법이란?

알고리즘의 효율도를 측정하는 척도이다. 해당 알고리즘이 시간적으로 얼마나 소요되는지, 그리고 공간적으로 어느정도를 차지하는지를 알려주며, 이를 통해 알고리즘의 효율성을 파악할 수 있다. 빅오 즉, 알고리즘의 효율도를 측정하기 위한 척도는 크게 “시간복잡도”와 “공간복잡도”로 나눌 수 있다.

공간복잡도란?

공간복잡도는 안어 그대로, 프로그램을 실행시킨 후 완료하는 데 필요로 하는 자원 공간의 양을 말한다. 여기서 자원공간이라 하면, 메모리(RAM)인 것이다. 즉 해당 알고리즘을 해결하기 위해 실제로 사용되는 메모리의 양으로 효율도를 측정하는 것이고, 당연하겠지만 적게 사용될 수록 효율적임을 의미한다.

그렇다면 공간복잡도는 어떻게 계산할 수 있을까?

공간복잡도는 코드 작성 시에 선언된 변수들과 관련이 있다. 단순 변수 혹은, 고정적으로 정의된 변수는 고정공간을 차지한다. 해결하려는 문제의 특정 인스턴스에 의존하는 크기를 가진 구조화 변수들을 위해서 필요로 하는 공간, 그러니까 예를 들어 함수선언에 사용된 인자들, for문을 위한 가상의 변수들(i나 n같은)이 차지하는 공간은 가변 공간이다. 공간 복잡도는 이러한 고정공간과 가변공간의 합인 것이다.

이를 예시를 통해 살펴 보고자 한다.

1 2 3 function sample(a, b, c) { return a + b + c * a; } cs

a, b, c는 3개의 변수로 메모리상 1씩 3개해서 3을 차지하는 것처럼 보일 수 있지만, 외부에서 인자로 받아오고 함수는 바로 리턴하기 때문에 공간 복잡도는 0이다. 따라서 공간 복잡도는 O(1)이라고 볼 수 있다.

1 2 3 4 5 6 7 8 // arr = 배열, n = 정수 function sample(arr, n) { let s = 0 ; // 1 for ( let i = 0 ; i < n; i + + ) { // 2; s + = arr[i]; // n } return s; } Colored by Color Scripter cs 위 예에서는 우선 변수 s를 초기화하는 1, 그리고 i를 초기화하는 1, 그리고 for문을 끝내기 위한 n값 1, 끝으로 반복문에서 arr[i]의 n값을 해서 총 공간 복잡도는 n + 3 이 될 것이다.. 빅오 표기법으로는 O(n) 일 듯. 1 2 3 4 5 6 7 8 // n = 정수 function sample(n) { let val = 1 ; for ( let i = 0 ; i < n; i + + ) { val = val * i; } return val; } cs 아마도 val 이라는 변수를 초기화 하는데 1, 그리고 반복문에 사용된 변수 i에 1. 그래서 반복문이 몇번 반복되는 것과 상관 없이 공간 복잡도는 2가 되고 빅오 표기법으로는 O(1)이 될 듯. 시간복잡도란? 시간 복잡도는 공간 복잡도보다는 좀 더 이해하기 쉬웠다. (개념이 쉽다기 보다는 일반적으로 빅오 표기법과 시간 복잡도가 거의 한쌍처럼 같은 개념으로 같이 묶여서 많이 설명되고 사용되다보니 좀 더 익숙한 듯 하다.) 공간 복잡도가 공간의 사용에 따른 효율성을 본다면 시간 복잡도는 말 그대로 시간적인 효율성을 측정하는 것이다. 여기서 더 구체적으로 설명하자면, "시간적으로 얼마나 소요되는지"는 우리가 알고 있는 그 시간적인 개념이라기 보다는 "어떠한 알고리즘을 해결하기 위한 단계 수"이다. 그리고 보통 해당 알고리즘을 해결하기 위한 가장 최악의 단계 수를 시간복잡도로 본다. 효율성의 측면에서 성능의 순서는 상단의 그래프 이미지를 참고 하면 된다. 즉 시간 복잡도를 그래프로 표기했을 때, 가파를수록 비효율적이라는 의미이다. (해당 그래프는 공간 복잡도에도 해당되는 의미인 듯하다. 계산하는 방법은 다르지만, 결국 공간 복잡도도 빅오 표기법으로 표기 될 것이기 때문이다.) 대표적인 빅오 표기법들 O(1) 여기서 1은 숫자 1을 나타내기 보단 상수를 의미한다. 입력되는 데이터의 량과 상관없이 일정한 횟수로 실행 되거나 한 단계만을 거치는 것을 말한다. 시간이 얼마나 걸리든 한 단계만 거치면 O(1)의 복잡도를 가진다. 대표적으로 배열 끝의 삽입과 삭제의 시간복잡도가 O(1)이다. a. 자료 구조 내의 데이터 수가 3개인 경우, 데이터 가장 앞의 요소 반환: 1번의 연산 b. 자료 구조 내의 데이터 수가 6개인 경우, 데이터 가장 앞의 요소 반환: 1번의 연산 c. 자료 구조 내의 데이터 수가 9개인 경우, 데이터 가장 앞의 요소 반환: 1번의 연산 데이터 수의 증감여부와 상관없이 연산과정은 항상 동일하다. O(logn) 데이터의 증가량에 따라 연산 수나 단계가 늘어나지만 그 양이 n보다는 적다. 가령 n이 증가함에 따라 일정하게 시간복잡도도 비례해서 늘어나는 것이 아니라, 데이터가 n씩 증가함에 따라 시간복잡도도 증가하지만, 그 증가량에 비해 복잡도가 증가하는 양은 적다. 그러다 점차 O(1)에 가까워진다. n 의 크기를 반씩 줄이는 걸 가정 n 이 반씩 줄다보면 k 단계에서 최종적으로 1이 된다 가정하자. 단계별로 n → n/2 → n/4 → n/2의k 승 진행 n = 2 의 k 승 양쪽에 로그 붙이면 logN = k 가 됨. 예시 : n = 16 이라 가정하면, 16 → 8 → 4 → 2 → 1 이고, 이는 logN 의 시간복잡도를 가지게 됨. 실행 횟수는 log(16) = 4 가 된다. O(n) 데이터의 양에 따라 정비례하게 증가한다. 대표적으로 반복문을 한번 돌릴때 O(n)의 시간복잡도를 보인다. O(nlogn) O(n)보다는 많이 실행 되지만 O(n2)보다는 적게 실행되는 그 사이??라고 생각하면 좀 더 쉬울듯? O(n2) 데이터에 양에 따라 걸리는 시간이 제곱에 비례하는 것을 말한다. n번 반복되는 반복문이 2번 중첩될 때를 생각하면 쉬울 것 같다. 728x90

[Algorithm] 알고리즘 공간복잡도에 대하여

공간복잡도란?

공간복잡도(Space Complexity)란 프로그램의 성능을 분석하는 방법 중 하나로, 작성한 프로그램이 얼마나 많은 공간(메모리)을 차지하느냐를 분석하는 방법입니다. 하지만 최근에는 컴퓨터 성능의 발달로 인해 메모리의 여유 공간이 충분하다못해 넘치기 때문에 공간복잡도의 중요성이 예전에 비해서 많이 낮아졌습니다. 시간복잡도의 경우 알고리즘을 잘못 구성하였을 경우 결과값이 나오지 않거나 현저하게 느린속도가 나오기에 최근에는 공간복잡도보다는 시간복잡도를 우선시하여 프로그램을 작성합니다.

[Algorithm] 알고리즘 시간복잡도에 대하여

공간복잡도 계산법 (빅-오)

int a = 10;

일반적으로 공간이 하나씩 생성되는것을 1이라고 표현합니다. 위의 공간복잡도는 O(1)입니다.

int get_factorial(int n) { int i = 0; int result = 1; for(i = 1; i <= n; i++) { result = result * i; } return result; } 반복문이 N번만큼 반복하여도 for문 안에서의 지역변수이므로 위의 공간복잡도는 O(1)입니다. n의 값에 상관없이 함수를 호출하고 i와 result의 변수만 사용됩니다. 다른것은 전혀 영향을 주지 못합니다. 여기서 공간복잡도는 O(1)입니다. int get_factorial(int n) { if(n > 1) return n * factorial(n – 1); else return 1; }

위처럼 재귀함수일 경우에는 이야기가 달라집니다. 위의 예제를 보시면 함수의 인자값 n에 따라 공간복잡도가 달라집니다. 함수 내부에서 n이 1이하일때까지 팩토리얼을 구하는 함수가 재귀적으로 호출되므로 스택에는 n부터 1까지 모두 쌓이며 위의 공간 복잡도는 O(n)입니다.

공간복잡도를 줄이는 방법

공간 복잡도를 결정하는것은 보통 배열의 크기가 몇인지, 동적할당을 한다면 얼마만큼의 동적할당이 예상되는지, 재귀함수라면 재귀호출을 몇번이나 하는지 등이 공간 복잡도에 영향을 미칩니다.

​프로그램에 필요한 공간은 크게 두가지로 나눌 수 있습니다.

1. 고정 공간

2. 가변 공간

시간적인 측면을 무시하고 공간복잡도만을 고려한다면 고정 공간보다는 가변 공간을 사용할 수 있는 자료구조들을 사용하는것이 효율적입니다. 또 함수 호출시 할당되는 지역변수들이나 동적 할당되는 객체들도 모두 공간이 필요합니다. 특히 재귀 함수같은 경우에는 매 함수 호출마다 함수의 매개변수, 지역변수, 함수의 복귀 주소 를 저장할 공간이 필요하기 때문에 ​만약 재귀적(Recursive)으로도 짤 수 있고 반복문으로도 짤 수 있는 상황에는 반복문으로 짜는게 더 효율적이라고 볼 수 있습니다.

[컴퓨터 알고리즘 성능분석] 시간 복잡도 vs 공간 복잡도

[컴퓨터 알고리즘 성능분석] 시간 복잡도 vs 공간 복잡도

시간 복잡도와 공간 복잡도

알고리즘 트레이닝 사이트에서 문제를 풀다보면 아래 그림과 같이 시간 복잡도와 공간 복잡도가 조건으로 주어진다.

알고리즘을 평가하는데 있어 수행시간과 메모리 사용량을 평가기준으로 두는데 수행시간에 해당하는 것이 시간 복잡도, 메모리 사용량에 해당하는 것이 공간 복잡도이다.

정의는 아래와 같다.

– 시간 복잡도(Time Complexity) : 알고리즘의 수행시간 분석결과

– 공간 복잡도(Space Complexity) : 알고리즘의 메모리 사용량에 대한 분석결과

간단하게 말하면 알고리즘 성능평가는 시간 복잡도와 공간 복잡도를 계산하고 점근적 표기법으로 나타내면 된다.

(점근적 표기법 포스팅 : http://ledgku.tistory.com/31)

시간 복잡도 계산법

알고리즘의 시간 복잡도는 연산의 횟수를 세고 처리해야 할 데이터의 수 n에 대한 연산횟수의 함수 T(n)을 만들면 된다. 알고리즘의 실행 시간을 재는 방법을 생각할 수도 있는데 이 방법을 객관성이 떨어진다.

순차 탐색 알고리즘으로 시간 복잡도를 구하는 연습을 해보자.

배열에 찾고 싶은 숫자를 처음부터 끝까지 찾고 찾는 숫자가 있으면 인덱스를 반환해 주는 알고리즘이다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include < stdio.h > int LSearch( int ar[], int len, int target){ int i = 0 ; for (; i < len; i + + ){ if (ar[i] = = target){ return i; } } return - 1 ; } int main( int arc, char * * argv){ int arr[] = { 3 , 1 , 8 , 5 , 6 , 7 , 2 , 9 , 4 }; int idx = 0 ; idx = LSearch(arr, sizeof (arr) / sizeof ( int ), 10 ); if (idx = = - 1 ){ printf ( "Fail!! " ); } else { printf ( "Target Index : %d " , idx); } idx = LSearch(arr, sizeof (arr) / sizeof ( int ), 1 ); if (idx = = - 1 ){ printf ( "Fail!! " ); } else { printf ( "Target Index : %d " , idx); } return 0 ; } Colored by Color Scripter cs 시간 복잡도를 계산하려면 연산의 횟수를 세라고 했다. 그럼 모든 연산의 횟수를 세야 하는가? 당연히 아니다. 알고리즘의 핵심이 되는 연산의 횟수만 세면 된다. 순차탐색 알고리즘에 핵심이 되는 연산은 == 연산이다. == 연산에 따라 다른 연산들은 많이 수행될 수도 있고 적게 수행될 수도 있는 종속적인 관계이기 때문이다. 연산의 횟수를 세어 보자. 만약 3을 찾는다면 1번만에 종료되는 최선의 경우(Best Case), 4를 찾는 다면 배열의 크기 n번만에 종료되는 최악의 경우(Worst Case), 그리고 평균적인 경우(Average Case)가 있다. 평균적인 경우가 가장 이상적으로 보이겠지만 알고리즘이 복잡해 질수록 평균적인 경우는 구하기가 매우 어려워 진다. 그러므로 최악의 경우로 알고리즘의 성능을 파악한다. 최악의 경우는 n번째에 데이터를 찾는 경우이므로 연산횟수는 n이다. $$ T(n) = n $$ 빅오 표기법은 아래에서 설명하도록 하겠다. 공간 복잡도 계산법 공간 복잡도 계산은 간단하다. 메모리를 얼마나 사용하는지 계산하면 된다. 예를 들어 크기가 n인 배열을 입력했는데 알고리즘이 내부에서 n x n의 이차원 배열을 생성한다면 이 알고리즘의 공간 복잡도는 $n^2$이 된다. 공간 복잡도는 보통 시간 복잡도에 밀려 중요하게 생각하지 않는 경우가 많은데 빅데이터 처리를 할 경우 공간 복잡도가 위와 같이 제곱으로 뛰게 되면 프로그램이 메모리에 한번에 올라가지 않아 프로그램을 실행할 수 없는 문제가 발생한다. 그래서 빅데이터 처리시 데이터를 나눠서 처리하고 다시 합치는 방법을 사용하게 된다. 알고리즘 작성시 공간 복잡도를 아예 생각하지 않게 되면 문제가 발생할 수도 있으므로 공간 복잡도도 신경써서 작성하는게 좋다. 빅오 표기법 예를 먼저 보면, $$ T(n) = n^2 + 2n + 9 -> O(n^2) $$

$$ T(n) = n^4 + n^3 + n^2 + 1 -> O(n^4) $$

$$ T(n) = 5n^3 + 3n^2 + 2n + 1 -> O(n^3) $$

위 예와 같이 T(n)으로 표현한 함수의 최고차항의 차수가 빅오가 된다.

빅오의 순서는 아래와 같고 커질수록 좋지 않다.

보통 O(n^2)이상의 복잡도를 가지는 알고리즘은 좋지 않다.

$$ O(1) < O(log n) < O(n) < O(nlog n) < O(n^2) < O(n^3) < O(2^n) < O(n!) $$ 빅오를 이용한 성능 비교 n $O(n) $ $O(logn) $ 500 500 9 5,000 5,000 13 50,000 50,000 16 위 표를 통해 $O(n)$의 알고리즘과 $O(logn)$의 알고리즘이 연산횟수에 있어서 얼마나 많은 차이가 있는지 알 수 있다.

키워드에 대한 정보 시간 복잡도 공간 복잡도

다음은 Bing에서 시간 복잡도 공간 복잡도 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자]

  • big o
  • big o notation
  • time complexity
  • space complexity
  • computer science
  • algorithm
  • korean
  • 상상개발자
  • Time Complexity
  • 빅오
  • bigo
  • 시간복잡도
  • 공간복잡도
  • O(n)
  • O(1)
  • O(n2)
  • O(N^2)
  • O(nlogn)
  • O(logn)

빅오 #표기법(Big-O #notation, #Time #Complexity), #시간복잡도, #공간복잡도 #(Big #O #Notation) #[상상개발자]


YouTube에서 시간 복잡도 공간 복잡도 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 빅오 표기법(Big-O notation, Time Complexity), 시간복잡도, 공간복잡도 (Big O Notation) [상상개발자] | 시간 복잡도 공간 복잡도, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  서원대 수시 등급 | [서원대학교] 2023 수시모집 전형안내(Q\U0026A) 9547 명이 이 답변을 좋아했습니다

Leave a Reply

Your email address will not be published. Required fields are marked *