웅쓰뚱쓰
웅쓰의 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
  • 백준
  • 블랙프라이데이
  • 안드로이드
  • 삼성
  • vr
  • LG
  • 블록체인
  • 이더리움
  • 앱 만들기
  • 폴더블폰
  • 화웨이
  • 동적배열

최근 댓글

최근 글

티스토리

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

웅쓰의 IT

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

싱글리 링크드 리스트 연산의 시간 복잡도

2021. 9. 28. 00:00

 


 

싱글리 링크드 리스트의 구조

 

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

 


 

싱글리 링크드 리스트의 접근 연산

 

링크드 리스트의 접근 연산은 해당 노드에 바로 접근이 불가하다

 

head에서부터 차근차근 다음 노드로 가서 원하는 노드에 접근을 해야 한다

 

인덱스 x에 있는 노드에 접근하려면 head에서부터 x번 가야 한다

 

원하는 노드에 접근하는데 걸리는 시간이 몇 번째 인덱스인지에 비례하는 것이다

 

링크드 리스트 안에 있는 노드의 수를 n이라고 하면

 

마지막 노드에 접근하려면 head에서부터 총 n-1번을 가야 한다

 

그러므로 접근 연산은 최악의 경우 O(n)의 시간 복잡도를 갖는다

 


 

싱글리 링크드 리스트의 탐색 연산

 

링크드 리스트의 탐색 연산은 선형 탐색을 이용한다

 

가장 앞에서부터 다음 노드를 하나씩 보면서 원하는 데이터가 있을 때까지 탐색한다

 

최악의 경우는 찾으려는 데이터가 없거나 tail에 있는 경우로

 

이 때는 n개의 노드를 모두 봐야 한다

 

그러므로 탐색 연산은 O(n)의 시간 복잡도를 갖는다

 


 

싱글리 링크드 리스트의 삽입, 삭제 연산

 

링크드 리스트의 삽입, 삭제 연산은 삽입, 삭제할 인덱스 주변 노드들의 레퍼런스만 수정하면 된다

 

삽입, 삭제할 노드가 어떤 순서에 있는 노드든 상관없이 걸리는 시간은 변하지 않고 항상 일정하다

 

따라서 삽입, 삭제 연산은 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)이 된다

 


 

tail의 삭제 연산

 

위에서 head, tail 노드의 삽입, 삭제 연산은 O(1)이라고 했지만

 

사실 tail 노드의 삭제 연산은 O(1)이 아니다

 

tail 노드를 삭제하기 위해서는 바로 전 노드가 필요하다

 

바로 전 노드에서 연결을 끊어줘야 하기 때문이다

 

삭제할 tail노드의 바로 전 노드에 접근하기 위해서는 O(n-2) => O(n)의 시간 복잡도가 걸린다

 

노드를 삭제하는 연산은 O(1)의 시간 복잡도를 가지므로

 

tail 노드를 삭제하기 위해서는 O(n+1) => O(n)의 시간 복잡도를 가진다

 


 

최종 정리

 

 


 

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

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

    티스토리툴바