Back to the Basics

[Python Data structure ] 배열 - 삭제연산 & 시간 복잡도 & 동적 배열의 크기 본문

Programming Languages/Python

[Python Data structure ] 배열 - 삭제연산 & 시간 복잡도 & 동적 배열의 크기

9Jaeng 2021. 10. 13. 17:18
728x90

<삭제 연산 - 시간 복잡도 분석>

 

삭제 연산 동작

  • 길이가 5인 리스트에서 index 1에 있는 요소를 지우고 싶은 경우
  1. 인덱스 1 뒤에 있는 데이터를 모두 한 칸씩 앞으로 밀어서 저장한다.
    1. 인덱스 1에 인덱스 2에 있는 요소를 저장한다
    1. 인덱스 2에 인덱스 3에 있는 요소를 저장한다
    1. 인덱스 3에 인덱스 4에 있는 요소를 저장한다
  1. 동적 배열에서 접근할 수 있는 인덱스 범위도 1을 줄여준다동적 배열은 배열의 크기와 개발자가 사용하는 인덱스들의 범위를 따로 관리한다.
  2.  

삭제 연산 시간 복잡도

삭제 연산도 아무 위치에 있는 데이터를 삭제할 때와 맨 뒤 데이터를 삭제할 때, 두 경우도 나눠서 생각할 수 있다.

 

  • 최악의 경우 : 맨 앞의 데이터를 지울 때

삭제 연산은 최악의 경우 삭제할 데이터가 맨 앞에 있는 경우이다. 인덱스 1부터 끝까지 모든 요소들을 한 칸씩 앞으로 밀어서 저장해야하기 때문이다.

배열안에 n개의 데이터가 있다면 총 n-1개의 요소들을 한 칸씩 앞으로 밀어서 저장해야하므로 O(n) 이 걸린다.

 

  • 맨 뒤의 데이터를 지울 때

단순히 동적 배열의 사용 공간을 한 인덱스 줄이면 된다. 배열에 데이터가 몇 개가 있든 상관 없는 연산이므로 O(1)이라고 할 수 있다.

 

 

결론 : 아무 위치에 데이터를 삭제할 때: O(n) , 가장 뒤에 있는 데이터를 삭제할 때 : O(1)

 

<동적 배열의 크기>

동적 배열은 내부적으로 정해진 크기의 정적 배열을 사용한다. 값을 추가하다 내부 배열이 꽉 차면 더 큰 내부 배열을 사용하도록 자동으로 늘려준다. 반대로 값을 삭제할 때에도 배열의 크기를 줄이기도 한다. (내부 배열의 크기도 줄여서 공간을 효율적으로 사용하기 위함)

 

  • 동적 배열은 요소의 개수가 어느정도 줄어들면 내부 배열의 크기를 조절한다.
  • 크기를 줄이는 시점은 개발자나 프로그래밍 언어에 따라 비율이 다르다.

 

시간 복잡도

  • 맨 끝 데이터 삭제 시간 복잡도

최악의 경우 : 작은 배열로 모든 요소들을 옮겨 저장할 때.

맨 뒤의 데이터를 삭제하는 것은 O(1)이지만 n개의 데이터를 모두 새 배열에 복사해서 넣기 때문애에 n에 비례하는 O(n)이 된다.

 

  • 맨 끝 데이터 삭제 상환 분석

하지만, 대부분 마지막 인덱스만 지워주기만 하면 되므로 내부 배열의 크기가 줄어드는 경우는 거의 없다고한다.

따라서, 분할 상환 분석을 적용하면 맨 끝의 데이터 삭제 또한 O(1)이라고 할 수 있다.

 

결론 : 동적 배열에서 맨 끝 데이터를 삭제하는 연산은 최악의 경우 O(n)이 걸리지만, 분할 상환 분석을 적용하면 O(1)이라고 할 수 있다.

 

 

낭비되는 공간

  • 배열은 낭비되는 공간이 없다.
  • 반면 동적 배열은 정적 배열의 크기가 늘어날 떄

만약 수용 공간이 8개이고 8개의 요소가 들어가있을 때애는 낭비하는 공간이 없지만,

추가 삽입을 하려고 하면 정적 배열의 크기가 2배인 16개의 공간을 새로 추가하고 새로 추가된 데이터까지 총 9개의 요소가 들어가게 된다. 이떄 7개의 공간이 낭비되는 공간이다.

이 경우와 같은 최악의 경우 새로운 배열을 만들 때이며, 이 때 n개의 데이터가 배열에 있다면 n-2개의 공간이 낭비된다.

따라서, 낭비되는 공간은 최소 0~ n-2 까지이다.

 

 

728x90
Comments