CS/자료구조

[자료 구조] 연결리스트, 배열, 벡터

dalooong 2023. 6. 22. 17:37

💡 연결 리스트 (Linked List)

  • 연결 리스트는 여러 개의 노드들이 순차적으로 연결된 효율적인 형태를 갖는 자료구조
  • 첫번째 노드 = head, 마지막 노드 = tail
  • 각 노드는 데이터와 다음 노드를 가리키는 포인터로 ****이루어져 있음
  • 배열과는 다르게 메모리를 연속적으로 사용하지 않는다.
  • 배열과는 다르게 순차적으로 접근해야 하는 면에서 불리할 수 있으나, 노드가 연결된 구조이기 때문에 삽입, 삭제에 용이함
  • Tree 구조의 근간이 되는 자료구조이며, Tree에서 사용되었을 때 그 유용성이 드러난다.

✅ 연결 리스트의 시간 복잡도

  • 탐색 : O(n)
  • 삽입 / 삭제 : 삽입과 삭제 자체는 O(1)
    • 연결 리스트의 처음 삽입/삭제 : O(1)
    • 연결 리스트 중간 삽입/삭제 : O(n) (탐색 시간 소요)
    • 연결 리스트 끝 삽입/삭제 :
      • 끝을 가리키는 별도의 포인터를 갖는 경우 : O(1)
      • 끝을 가리키는 별도의 포인터를 갖지 않는 경우 : O(n) (탐색 시간 소요)

 

연결 리스트 종류

  • 싱글 연결 리스트 : next 포인터만 가진다.
  • 이중 연결 리스트 : next 포인터와 prev 포인터를 가진다.
  • 원형 이중 연결 리스트 : 이중연결리스트와 같지만 마지막 노드의 next 포인터가 헤드 노드를 가리킨다.

💡 배열(Array)

  • 입력된 데이터들이 메모리 공간에서 연속적으로 저장되어 있는 자료 구조
  • 메모리 상에서 연속적으로 저장되어 있는 특징을 갖기 때문에, index를 통한 접근이 용이
  • 배열의 크기는 처음 생성할 때 정하며 이후 배열의 크기를 변경할 수 없다.
  • 같은 타입의 변수들로 이루어져있다.
  • 중복 허용

 

배열의 시간 복잡도

  • 탐색 : O(1). 단, 접근하고자 하는 인덱스를 알고 있어야 한다.
  • 순차적으로 탐색시에는 O(n).
  • 삽입 / 삭제 :
    • 배열의 처음 또는 중간에 삽입 및 삭제 : O(n). (삽입 지점 이후의 데이터를 옮겨야 하기 때문)
    • 배열의 끝에 삽입 및 삭제 O(1)

 

배열과 연결리스트 비교

 

 

💡 벡터

  • 벡터는 동적으로 요소를 할당할 수 있는 동적 배열입니다.
  • 컴파일 시점에서 개수를 모른다면 벡터를 사용하면 됩니다.
  • 중복을 허용하고 순서가 있고 랜덤 접근이 가능합니다.

push_back() : 뒤에서부터 요소를 더함

pop_back() : 맨 뒤부터 지움

erase() : 지우기

find() : 요소 찾기

clear() : 배열 초기화

 

장점

  • 마지막 위치에 추가나 삭제 쉬움
  • 구현 용이
  • 랜덤적으로 직접 접근 가능

단점

  • 중간에 삽입 삭제가 많은 상황에서 비효율적