웅쓰뚱쓰
웅쓰의 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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

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

웅쓰의 IT

더블리 링크드 리스트 연산의 시간 복잡도
프로그래밍/자료구조&알고리즘

더블리 링크드 리스트 연산의 시간 복잡도

2021. 10. 2. 00:00

 


 

더블리 링크드 리스트의 구조

 

더블리 링크드 리스트의 접근, 탐색, 삽입, 삭제 연산에 대하여 시간 복잡도를 알아보자

 


 

더블리 링크드 리스트의 접근, 탐색 연산

 

더블리 링크드 리스트의 접근, 탐색 연산은 싱글리 링크드 리스트의 접근, 탐색과 똑같다

 

head 노드부터 하나씩 다음 노드로 가면서

 

원하는 위치에 접근하거나

 

원하는 데이터를 가진 노드를 찾는다

 

시간 복잡도는 리스트의 길이 n에 비례하므로 O(n)을 갖는다

 


 

더블리 링크드 리스트의 삽입, 삭제 연산

 

삽입 연산의 경우 특정 노드가 주어졌을 때, 특정 노드의 앞과 뒤 노드의 레퍼런스만 바꿔주면 된다

 

링크드 리스트의 길이와 상관없이 항상 일정한 시간이 걸리므로

 

시간 복잡도는 O(1)을 갖는다

 

삭제 연산도 마찬가지로 레퍼런스만 바꿔서 연결만 끊어주면 되므로

 

링크드 리스트의 길이와 상관없이 시간 복잡도는 O(1)을 갖는다

 


 

정리

 


 

조금 더 생각해보자

 

삽입, 삭제 연산은 O(1)의 시간 복잡도를 갖지만

 

삽입, 삭제를 하기 위해서는 삽입, 삭제할 특정 노드를 파라미터로 넘겨주어야 한다

 

따라서 삽입, 삭제할 노드를 먼저 탐색, 접근 연산을 통해서 가져와야 한다

 

탐색, 접근 연산은 O(n)의 시간 복잡도를 갖고

 

삽입, 삭제 연산 자체는 O(1)의 시간 복잡도를 가지므로

 

총 O(n+1)의 시간 복잡도를 갖는다

 

즉, 특정 노드에 삽입, 삭제를 하는 연산은 사실상 O(n)의 시간 복잡도를 갖게 된다

 


 

특수한 경우

 

특정 노드에 삽입, 삭제를 하는 연산은 O(n)의 시간 복잡도를 갖지만

 

그 특정 노드가 head나 tail이면 이야기는 달라진다

 

링크드 리스트는 head와 tail의 정보를 저장하고 있기 때문에

 

head, tail 노드에 한 번에 접근할 수 있다

 

따라서 head, tail에 삽입, 삭제를 하는 경우 

 

head, tail 노드에 한 번에 접근하여 삽입, 삭제를 하는 시간을 고려하면

 

시간 복잡도는 O(1+1) => O(1)이 된다

 


 

최종 정리

 

 


 

싱글리 VS 더블리 링크드 리스트

 

 

싱글리 링크드 리스트와 더블리 링크드 리스트 연산의 시간 복잡도는 대부분 동일하다

 

하지만 tail 노드의 삭제 연산의 경우는 다르다

 

싱글리 링크드 리스트의 삭제 연산은 지우려는 노드의 바로 전 위치의 노드를 파라미터로 받아야 한다

 

그렇기 때문에 tail 노드를 삭제하기 위해서는 tail 전 노드에 접근해야 한다

 

tail 전 노드에 접근해야 하기 때문에 O(n)을 갖는다

 

더블리 링크드 리스트의 삭제 연산은 지우려는 노드 자체를 파라미터로 받는다

 

링크드 리스트는 tail노드의 정보를 가지고 있기 때문에

 

tail 노드를 바로 파라미터로 넘겨주면 tail 노드를 삭제할 수 있다

 

링크드 리스트를 사용해야 하는 경우

 

tail 노드를 많이 삭제해야 한다면

 

싱글리 링크드 리스트보다 더블리 링크드 리스트를 사용하는 게 더 효율적이다


 

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

이진 트리의 종류  (0) 2021.10.12
Direct Access Table과 Hash Table  (0) 2021.10.05
싱글리 링크드 리스트 연산의 시간 복잡도  (0) 2021.09.28
시간복잡도 분할 상환 분석(동적 배열의 추가 연산)  (0) 2021.09.25
리스트는 사실 배열?(3/3)  (0) 2021.09.11
    '프로그래밍/자료구조&알고리즘' 카테고리의 다른 글
    • 이진 트리의 종류
    • Direct Access Table과 Hash Table
    • 싱글리 링크드 리스트 연산의 시간 복잡도
    • 시간복잡도 분할 상환 분석(동적 배열의 추가 연산)
    웅쓰뚱쓰
    웅쓰뚱쓰

    티스토리툴바