배열과 연결리스트 (Array & Linked list)

 

배열

배열을 사용하는 경우, 원소를 메모리에 차례대로 붙여서 저장한다. 만약 원소가 추가되거나 하면 전체 배열이 함께 저장될 수 있는 다른 공간으로 이동하게 될 텐데, 배열의 크기를 사전에 정해 미리 해당 공간만큼을 확보하여 해결 할 수 있다.

  • 모든 원소의 주소를 알고 있다. 특정 원소값을 찾을시 효율적이다.
  • 원소가 지정된 배열크기 보다 적다면 메모리를 낭비할 수 있다
  • 배열에 들어가야 할 원소가 더 늘어난다면 어차피 배열의 모든 원소는 메모리상에서의 자리를 옮겨야한다.
  • 임의 접근(random access)방식. 읽기 속도가 빠르다.

 

연결리스트

연결리스트 사용시 각 원소마다 다음 원소에 대한 주소가 저장되어 있어서 메모리의 어느 곳에나 둘 수 있다. (여러 임의의 메모리 주소들이 하나의 목록으로 연결되어 있는 것)

  • 연결리스트에서 마지막 원소를 보고 싶을시 바로 볼 수가 없다. (주소를 바로 알 수 없기 때문). 원소들끼리 메모리상에서 이웃하고 있지 않기 때문에 특정한 원소만 알고 싶을시 효율이 떨어진다.
  • 순차 접근(sequential access)만 가능

 

배열 VS 리스트 실행시간 비교

배열 리스트
읽기 O(1) O(n)
삽입 O(n) O(1)
삭제 O(n) O(1)

리스트는 이전 원소가 가리키는 값만 변경하면 되므로 중간 삽입과 삭제가 쉽다. 배열은 다음에 오는 모든 원소의 위치를 바꿔야하며, 삽입으로 인해 공간이 부족할 시 모든 원소를 새로운 장소로 복사해야하기 때문에 이 경우 효율이 떨어진다.

 

배열의 읽기 속도가 빠른것은 임의 접근 방식이기 때문이다. 그래서 리스트보다 배열을 사용하는 경우가 더 많다.

 

연결 리스트는 삽입과 삭제에 좋고, 배열은 임의 접근에 좋다.


 

reference

도서 : Hello Coding 그림으로 개념을 이해하는 알고리즘