웅쓰뚱쓰
웅쓰의 IT
웅쓰뚱쓰
  • 분류 전체보기 (127)
    • 프로그래밍 (31)
      • 자료구조&알고리즘 (12)
      • Django (1)
      • NAS (3)
      • python (1)
      • Java (2)
      • Kotlin (0)
      • 안드로이드 (0)
      • 백준 (6)
      • 프로그래머스 (1)
      • 블록체인 (4)
    • IT (57)
      • 스마트폰 (30)
      • 모바일 (3)
      • 기타제품 (9)
      • 기타기술 (10)
      • 소식 (5)
    • 꿀팁 (1)
      • 윈도우10 (1)
    • 리얼후기 (4)
      • 제품리뷰 (2)
      • 일상리뷰 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 블랙프라이데이
  • 안드로이드
  • LG
  • 동적배열
  • 삼성
  • 백준
  • 이더리움
  • 화웨이
  • 안드로이드 스튜디오
  • 패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #Android앱개발올인원패키지Online
  • vr
  • 앱 만들기
  • 폴더블폰
  • 블록체인
  • 아마존

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
웅쓰뚱쓰

웅쓰의 IT

시간복잡도 분할 상환 분석(동적 배열의 추가 연산)
프로그래밍/자료구조&알고리즘

시간복잡도 분할 상환 분석(동적 배열의 추가 연산)

2021. 9. 25. 00:00

 


동적 배열의 추가(append) 연산

 

동적 배열의 추가 연산의 시간 복잡도를 계산해보자

 

다음과 같은 배열에 새로운 데이터를 추가한다고 하자

 

 

두 가지 경우에 대해서 생각해 볼 수 있다

 


 

1. 배열에 남는 공간이 있을 때

 

이 경우는 그냥 빈 공간에 데이터를 저장하면 되므로 시간 복잡도는 O(1)이다

 

 


 

2. 배열이 꽉 찼을 때

 

이 경우는 기존의 배열보다 큰 배열을 만들고 기존 배열에서 새로운 배열로 값을 다 복사해야 된다

 

 

기존 배열의 0번 인덱스에 접근해서 값을 복사하고

 

새 배열의 0번 인덱스에 접근해서 값을 붙여 넣고...

 

이미 있던 n개의 데이터를 복사해야 되므로 O(n)이 되고

 

새로운 데이터를 추가해야 되므로 O(1)이 되어

 

총 O(n+1) = O(n)이 된다

 


 

정리

 

배열에 남는 공간이 있을 때: O(1)

 

배열이 꽉 찼을 때: O(n)

 

최악의 경우는 O(n)이므로 동적 배열의 추가 연산 시간 복잡도는 O(n)이다

 

 

하지만 이대로 추가 연산 시간 복잡도를 O(n)이라고 하기에는  뭔가 비합리적이다

 

O(1)은 자주 발생하고 O(n)은 가끔 발생한다

 

이런 상환에 대해서 시간 복잡도를 다르게 분석하는 방법이 있다

 


 

분할 상환 분석

 

분할 상환 분석은 연산은 n번 했을 때의 총시간을 n으로 나눠주는 할부의 개념이다

 

동적 배열의 추가 연산에 분할 상환 분석을 적용해보자

 

우선 동적 배열의 추가 연산에 걸리는 시간을 두 가지로 나눌 수 있다

 

1. 빈 인덱스에 새로운 데이터를 저장하는 시간

 

2. 기존 배열보다 큰 새 배열을 만들고 기존 데이터를 새 배열로 옮기는 시간

 


 

1. 빈 인덱스에 새로운 데이터를 저장하는 시간

 

빈 인덱스에 데이터를 저장하는 데 걸리는 시간은 1이다

 

동적 배열에 새로운 데이터를 n개 저장한다면

 

총 n의 시간이 걸리게 된다

 


 

2. 기존 데이터를 새 배열로 옮기는 시간

 

배열이 꽉 차게 되면 기존 배열보다 2배 큰 새 배열을 만든다고 가정해 보겠다

 

배열의 크기가 1인 배열에 n개의 데이터를 추가 연산해보자

 

1번째 데이터를 배열에 추가하고 2번째 데이터를 배열에 추가할 때는

배열의 크기가 2인 새 배열을 만들고 기존의 1번째 데이터를 새 배열로 옮겨야 된다

이 과정에서 걸리는 시간은 1이다

 

3번째 데이터를 추가할 때는 배열의 크기가 4인 새 배열을 만들고 위의 과정을 반복해야 한다

이 과정에서 걸리는 시간은 2이고, 기존 데이터를 새 배열로 옮기는 총 걸리는 시간은 1+2이다

 

5번째 데이터를 추가할 때는 4의 시간이 걸리게 되고, 총 걸리는 시간은 1+2+4이다

 

9번째 데이터를 추가할 때는 8의 시간이 걸리게 되고, 총 걸리는 시간은 1+2+4+8이다...

 

새로 저장할 데이터가 n번째 데이터이고 이미 m개의 데이터가 저장되어 있다면

 

n번째 데이터를 추가할 때는 m의 시간이 걸리게 되고,

총 걸리는 시간은 m+m/2+m/4+...+1이 된다

이는 2m-1이 되며 항상 2n보다 항상 작다

 

이를 간단히 정리하면 n번째 데이터를 추가할 때

새 배열의 기존 데이터를 옮기는데 걸리는 총시간은 2n보다 적게 걸린다

 


 

최종 정리

 

n개의 데이터를 동적 배열에 추가 연산할 경우

 

1. 빈 인덱스에 새로운 데이터를 저장하는 시간 -> n

 

2. 기존 배열보다 큰 새 배열을 만들고 기존 데이터를 새 배열로 옮기는 시간 -> 2n보다 적은 시간

 

이 두 경우를 합치면 총 O(3n), 즉 O(n)이 된다

 

근데 이는 추가 연산을 연속으로 n번 할 경우에 걸리는 시간이다

 

추가 연산을 한번 하는데 걸리는 시간은 O(n)/n이 되어 결과적으로 O(1)이 된다

 

우리는 동적 배열의 추가 연산이 최악의 경우 O(n)이라는 것을 알고 있고

 

분할 상환 분석을 하면 O(1)이라는 것도 알고 있다

 

"동적 배열의 추가 연산이 최악의 경우에는 O(n)이 걸리지만 분할 상환 분석을 하면 O(1)이 걸린다"라고 표현할 수 있다

 


 

'프로그래밍 > 자료구조&알고리즘' 카테고리의 다른 글

더블리 링크드 리스트 연산의 시간 복잡도  (0) 2021.10.02
싱글리 링크드 리스트 연산의 시간 복잡도  (0) 2021.09.28
리스트는 사실 배열?(3/3)  (0) 2021.09.11
리스트는 사실 배열?(2/3) - 정적 배열과 동적 배열  (0) 2021.09.06
리스트는 사실 배열?(1/3) - 배열과의 차이점  (0) 2021.09.04
    '프로그래밍/자료구조&알고리즘' 카테고리의 다른 글
    • 더블리 링크드 리스트 연산의 시간 복잡도
    • 싱글리 링크드 리스트 연산의 시간 복잡도
    • 리스트는 사실 배열?(3/3)
    • 리스트는 사실 배열?(2/3) - 정적 배열과 동적 배열
    웅쓰뚱쓰
    웅쓰뚱쓰

    티스토리툴바