작성자 프로필
mouuaw
코드 깎는 다람쥐
2023.02.23

알고리즘이란?

알고리즘은 잘 정의된 문제 해결들의 모음집 입니다. 주어진 문제들을 해결하기 위한 방법들을 제공합니다.

알고리즘의 특징
input, output의 정의가 명확해야 합니다.
각각의 단계가 애매모호하게 정의되면 안되고 명확해야 합니다.
프로그래밍 언어에 종속적이면 안됩니다.
알고리즘 측정

어떤 문제를 해결하는데 다양한 해결방법이 존재합니다. 하지만 그런 해결방법들이 항상 좋은 방법은 아닙니다.

알고리즘의 성능측정은 이런 비교를 위해 필요합니다.

하지만 알고리즘의 절대적인 측정은 쉽지않습니다. 왜냐하면 다양한 환경에서 같은 알고리즘을 실행할 경우 다른 성능을 보여주기 때문입니다.

알고리즘의 성능을 측정하는 기준은 대표적으로 시간복잡도(Time complexity)공간복잡도(Space complexity) 를 측정합니다.

시간복잡도는 알고리즘을 사용해서 문제를 해결하는데 걸리는 시간을 의미하며, 공간복잡도는 알고리즘을 해결하는데 사용되는 메모리를 말합니다.

알고리즘의 성능표기법

알고리즘의 성능 표기법으론 대표적으로 다음 방법들이 사용됩니다.

Big-O 표기법: 가장 안좋은 성능일 때의 성능을 말합니다.
Omega Notation: 가장 좋은 성능을 보일때의 측정범위 입니다.
Theta Notation: 평균적인 성능의 측정범위 입니다.
Big-O 표기법

빅오표기법은 수학적 표기법을 사용해서 복잡도를 표현합니다.

빅오표기법은 다음의 두가지 특징이 있습니다.

입력되는 데이터를 표현한다
세부적인 성능을 표기하는것이 아닌 대략적인 성능 표기에 집중한다.
        
        
      

위의 코드는 입력되는 n의 크기에 따라 n + 2 만큼의 로직이 수행됩니다.

그런데 n이 커지면 커질수록 n+2 와 n의 차이가 의미가 없습니다.

그래서 빅오표기법에선 O(n) 으로 표기됩니다.

객체와 배열의 Big-O

객체는 key-value 의 한 쌍으로 이루어진 값들의 집합입니다.

객체의 각 상황에 대해 Big-O 표기법으로 표현해보겠습니다.

Insert - O(1)
Remove - O(1)
Access - O(1)
Search - O(n)
Object.keys() - O(n)
Object.values() - O(n)
Object.entries() - O(n)

Object의 각 값을 수정할 땐 key를 통해 접근이 가능하기 때문에 O(1) 의 복잡도를 가집니다.

하지만 각 요소들에 대해 작업을 수행해야 한다면 O(n)만큼의 작업이 수행됩니다.

배열은 일렬로 나열된 값들의 집합입니다.

배열의 각 상황에 대해 표시해보겠습니다.

Insert / remove at end - O(1)
Insert/remove at beginning - O(1) - index를 새로 정의하기 때문
Access - O(1)
Search - O(n)
Push/pop - O(1)
Shift/unshift/concat/slice/splice - O(n)
forEach/map/filter/reduce - O(n)

일반적으로 배열의 map/filter/reduce는 많이 사용됩니다. 그래서 이런 복잡도에 대해 이해하고 있으면, 코드작성할 때 성능을 생각하며 작성할 수 있을것입니다.

스터디 프로필
코드 깎는 다람쥐
의 다른 카테고리
0
👍0
👏0
🤔
댓글 작성