알고리즘

배열과 연결리스트

jwKim96 2022. 1. 16. 23:38

배열

배열은 메모리에 지정된 만큼의 연속된 저장 공간을 선점하여 사용하는 저장 방식입니다.

int[] grade = new grade {85, 65, 90};

image

그림 처럼, 변수는 배열의 시작 주소를 가리키고있고, int배열이기 때문에 4Byte씩 공간을 차지하고 있습니다.

순서대로 저장되어 있기 때문에, 특정 위치의 데이터를 찾는데 1번의 연산이면 됩니다.

  • 1번째의 데이터를 찾고 싶다면 0x10번지에서 4Byte만큼 읽음
  • 2번째의 데이터를 찾고 싶다면 0x10번지 + 1 * 4(int 크기) = 0x14번지로 이동하여, 4Byte만큼 읽음
  • 3번째의 데이터를 찾고 싶다면 0x10번지 + 2 * 4(int 크기) = 0x18번지로 이동하여, 4Byte만큼 읽음

이 처럼 원하는 데이터로 접근 하는데 1번의 연산으로 접근할 수 있기 때문에 O(1)의 시간 복잡도로 표시할 수 있습니다.

그런데 만약 배열 제일 처음에 데이터를 삽입하고 싶다면?

  • 0x18번지 -> 0x22번지
  • 0x14번지 -> 0x18번지
  • 0x10번지 -> 0x14번지

그리고 배열의 첫 자리에 데이터를 삽입합니다.

  • 0x10번지에 데이터 삽입

데이터를 삽입하기 위해서 배열의 길이(3)만큼 이동이 발생하였는데요.

이는 추가할 때 뿐만 아니라, 삭제할때도 동일합니다.

그래서 정리하면, 배열은 다음과 같은 복잡도를 가지게 됩니다.

  • 접근 : O(1)
  • 순회 : O(n)
  • 추가,삭제 : O(n)

그래서 배열은 다음과 같은 상황에 유리합니다. 특정 번지수의 데이터 참조가 많을 경우, 데이터 추가 • 삭제가 빈번하지 않은 경우에 유리합니다.

  • 단순 저장
  • 특정 번째의 데이터를 참조하는 경우

연결리스트

연결리스트는 아래 그림처럼 각 Node가 데이터와 다음 Node의 주소를 갖는 형태로 이루어져 있습니다.

image

만약, 다음 Node의 주소가 없다면 그곳이 연결리스트의 끝 지점 입니다.

만약 연결리스트에서 3번째에 있는 노드의 데이터를 찾고 싶다면 어떻게 해야할까요?

  • 1번째 데이터를 가진 HEAD로 이동하여 다음 주소 확인
  • 2번째 데이터를 가진 Node로 이동하여 다음 주소 확인
  • 3번째 데이터를 가진 Node에 도착하여 데이터 확인

3번째 데이터를 찾기 위해서 3번의 연산이 필요합니다.

그런데 만약 배열 제일 처음에 데이터를 삽입하고 싶다면 어떻까요?

  • Node 생성하여 다음 주소로 HEAD의 주소를 삽입

1번의 연산으로 가능하니 O(1)의 시간 복잡도로 표현 가능합니다.

하지만 여전히 n번째 데이터를 찾으려면 n번 연산이 필요해서, 가운데에 있는 데이터는 O(n)만큼 시간이 소요됩니다.

정리하면, 연결리스트는 다음과 같은 복잡도를 가지게 됩니다.

  • 접근 : O(n)
  • 순회 : O(n)
  • 삽입,삭제
    • HEAD : O(1)
    • MIDDLE, TAIL : O(n)