당신이 작성한 프로그램을 실행하는 데 왜 그렇게 오랜 시간이 걸렸는지 생각해 본 적이 있습니까? 코드를 더 효율적으로 만들 수 있는지 알고 싶을 수도 있습니다. 코드 실행 방법을 이해하면 코드를 한 단계 높일 수 있습니다. Big-O 표기법은 코드가 실제로 얼마나 효율적인지 계산하는 편리한 도구입니다.
Big-O 표기법이란 무엇입니까?
Big-O 표기법을 사용하면 코드를 실행하는 데 걸리는 시간을 계산할 수 있습니다. 코드를 실행하는 데 걸리는 시간을 물리적으로 측정할 수 있지만 이 방법으로는 작은 시간 차이를 포착하기 어렵습니다. 예를 들어 20~50줄의 코드를 실행하는 데 걸리는 시간은 매우 짧습니다. 그러나 대규모 프로그램에서는 이러한 비효율성이 추가될 수 있습니다.
ps2 컨트롤러를 pc에 연결하는 방법
Big-O 표기법은 알고리즘이 효율성을 측정하기 위해 실행해야 하는 단계 수를 계산합니다. 효율성을 높이기 위해 코드를 조정해야 하는 경우 이러한 방식으로 코드에 접근하는 것이 매우 효과적일 수 있습니다. Big-O 표기법을 사용하면 실행하는 데 필요한 단계 수에 따라 다양한 알고리즘을 측정하고 알고리즘의 효율성을 객관적으로 비교할 수 있습니다.
Big-O 표기법을 계산하는 방법
서랍에 개별 양말이 몇 개 있는지 계산하는 두 가지 기능을 고려해 보겠습니다. 각 함수는 양말 쌍 수를 가져와서 개별 양말 수를 반환합니다. 코드는 Python으로 작성되었지만 단계 수를 계산하는 방법에는 영향을 미치지 않습니다.
알고리즘 1:
def sockCounter(numberOfPairs):
individualSocks = 0
for x in range(numberOfPairs):
individualSocks = individualSocks + 2
return individualSocks
알고리즘 2:
def sockCounter(numberOfPairs):
return numberOfPairs * 2
이것은 어리석은 예이며 어떤 알고리즘이 더 효율적인지 쉽게 알 수 있어야 합니다. 그러나 연습을 위해 각각을 실행해 보겠습니다.
관련된: 프로그래밍에서 함수란?
알고리즘 1에는 여러 단계가 있습니다.
- 이는 개별Socks 변수에 0 값을 할당합니다.
- 변수 i에 1의 값을 할당합니다.
- i 값을 numberOfPairs와 비교합니다.
- 개별 양말에 두 개를 추가합니다.
- 증가된 개별 양말 값을 자신에게 할당합니다.
- i를 1씩 증가시킵니다.
- 그런 다음 (indiviualSocks - 1)과 같은 횟수만큼 3~6단계를 반복합니다.
알고리즘 1에 대해 완료해야 하는 단계 수는 다음과 같이 표현할 수 있습니다.
4n + 2
n번 완료해야 하는 4단계가 있습니다. 이 경우 n은 numberOfPairs의 값과 같습니다. 한 번 완료되는 2단계도 있습니다.
이에 비해 알고리즘 2는 단계가 하나뿐입니다. numberOfPairs의 값에 2를 곱합니다. 우리는 그것을 다음과 같이 표현할 것입니다:
1
아직 명확하지 않은 경우 이제 알고리즘 2가 훨씬 더 효율적임을 쉽게 알 수 있습니다.
빅오 분석
일반적으로 알고리즘의 Big-O 표기법에 관심이 있을 때 전체 효율성에 더 관심이 있고 단계 수에 대한 세부적인 분석에는 관심이 없습니다. 표기법을 단순화하기 위해 효율성의 크기를 명시할 수 있습니다.
위의 예에서 알고리즘 2는 다음과 같이 표현됩니다.
O(1)
그러나 알고리즘 1은 다음과 같이 단순화됩니다.
O(n)
이 빠른 스냅샷은 알고리즘 1의 효율성이 n 값과 어떻게 연결되어 있는지 알려줍니다. 숫자가 클수록 알고리즘을 완료해야 하는 단계가 더 많아집니다.
선형 코드
이미지 크레디트: Nick Fledderus/ 명사 프로젝트
n의 값을 모르기 때문에 n의 값이 실행해야 하는 코드의 양에 어떤 영향을 미치는지 생각하는 것이 더 도움이 됩니다. 알고리즘 1에서 우리는 관계가 선형이라고 말할 수 있습니다. 단계 수 대 n 값을 플롯하면 위로 올라가는 직선이 나타납니다.
이차 코드
모든 관계가 선형 예만큼 간단한 것은 아닙니다. 2D 배열이 있고 배열에서 값을 검색하려고 한다고 상상해 보십시오. 다음과 같은 알고리즘을 만들 수 있습니다.
def searchForValue(targetValue, arraySearched):
foundTarget = False
for x in arraySearched:
for y in x:
if(y == targetValue):
foundTarget = True
return foundTarget
이 예에서 단계 수는 arraySearched의 배열 수와 각 배열의 값 수에 따라 다릅니다. 따라서 단순화된 단계 수는 n * n 또는 n²입니다.
netflix는 로드되지만 재생되지 않습니다.
이미지 크레디트: Nick Fledderus/ 명사 프로젝트
이 관계는 2차 관계이며, 이는 알고리즘의 단계 수가 n에 따라 기하급수적으로 증가함을 의미합니다. Big-O 표기법에서는 다음과 같이 작성합니다.
O(n²)
관련된: CSS 파일을 확인, 정리 및 최적화하는 유용한 도구
로그 코드
다른 많은 관계가 있지만 마지막으로 살펴볼 관계는 대수 관계입니다. 기억을 새로 고침하기 위해 숫자의 로그는 밑이 주어진 숫자에 도달하는 데 필요한 지수 값입니다. 예를 들어:
log 2 (8) = 3
밑이 2인 경우 숫자 8에 도달하려면 지수 값 3이 필요하기 때문에 로그는 3입니다.
이미지 크레디트: Nick Fledderus/ 명사 프로젝트
따라서 로그 함수의 관계는 지수 관계의 반대입니다. n이 증가할수록 알고리즘을 실행하는 데 필요한 새로운 단계가 줄어듭니다.
언뜻 보기에 이것은 직관적이지 않은 것처럼 보입니다. 어떻게 알고리즘의 단계가 n보다 느리게 성장할 수 있습니까? 이에 대한 좋은 예는 이진 검색입니다. 고유한 값의 배열에서 숫자를 검색하는 알고리즘을 고려해 보겠습니다.
- 가장 작은 것부터 큰 것 순으로 배열을 검색하는 것으로 시작합니다.
- 다음으로 배열 중간에 있는 값을 확인합니다.
- 귀하의 숫자가 더 높으면 검색에서 더 낮은 숫자를 제외하고 숫자가 더 낮으면 더 높은 숫자를 제외합니다.
- 이제 나머지 숫자 중 가운데 숫자를 살펴보겠습니다.
- 다시 말하지만 목표 값이 중간 값보다 높거나 낮은지 여부에 따라 숫자의 절반을 제외합니다.
- 목표를 찾거나 목록에 없다고 결정할 때까지 이 프로세스를 계속할 것입니다.
보시다시피, 바이너리 검색은 매 패스마다 가능한 값의 절반을 제거하기 때문에 n이 커질수록 배열을 검사하는 횟수에 미치는 영향은 거의 영향을 받지 않습니다. 이것을 Big-O 표기법으로 표현하려면 다음과 같이 작성합니다.
O(log(n))
Big-O 표기법의 중요성
Big-O 국가는 알고리즘이 얼마나 효율적인지 빠르고 쉽게 전달할 수 있는 방법을 제공합니다. 이렇게 하면 서로 다른 알고리즘 간에 더 쉽게 결정할 수 있습니다. 이는 라이브러리의 알고리즘을 사용하고 코드가 어떻게 생겼는지 반드시 알지 못하는 경우에 특히 유용할 수 있습니다.
미리보기에서 이미지를 미러링하는 방법
처음 코딩을 배울 때 선형 함수로 시작합니다. 위의 그래프에서 볼 수 있듯이 매우 멀리 갈 것입니다. 그러나 경험이 많아지고 더 복잡한 코드를 작성하기 시작하면 효율성이 문제가 되기 시작합니다. 코드의 효율성을 수량화하는 방법을 이해하면 효율성을 위해 코드를 조정하고 알고리즘의 장단점을 평가하는 데 필요한 도구를 얻을 수 있습니다.
공유하다 공유하다 트위터 이메일 가장 흔한 프로그래밍 및 코딩 실수 10가지코딩 실수는 많은 문제를 일으킬 수 있습니다. 이 팁은 프로그래밍 실수를 피하고 코드를 의미 있게 유지하는 데 도움이 됩니다.
다음 읽기 관련 항목- 프로그램 작성
- 프로그램 작성
J. Seaton은 복잡한 주제를 분류하는 데 전문적인 과학 작가입니다. 그녀는 서스캐처원 대학교에서 박사 학위를 받았습니다. 그녀의 연구는 온라인에서 학생 참여를 늘리기 위해 게임 기반 학습을 활용하는 데 중점을 두었습니다. 그녀가 일하지 않을 때, 당신은 그녀가 책을 읽거나, 비디오 게임을 하거나, 정원 가꾸기를 하는 그녀를 발견할 것입니다.
제니퍼 시튼이 참여한 작품 더보기뉴스레터 구독
기술 팁, 리뷰, 무료 전자책 및 독점 거래에 대한 뉴스레터에 가입하십시오!
구독하려면 여기를 클릭하세요.