연결 리스트(Linked List)란?

각 원소가 값과 다음 원소의 위치를 가리키는 포인터를 가지며, 그것을 따라가며 이어지는 자료 구조. 위치를 알고 있으면 삽입이나 삭제는 포인터를 바꿔 다는 것으로 O(1)이지만, i번째 원소를 읽으려면 앞에서부터 따라가는 O(n)이 필요하다. 원소가 메모리 위에 흩어지기 쉬워 배열보다 캐시가 잘 듣지 않는다.

일본어 명칭: 連結リスト

연결 리스트(Linked List)은(는) 자료 구조와 알고리즘, 메모리 계층 구조, 프로그래밍의 기초(의사 코드 트레이스) 등 5개 분야의 연습 문제 10개에 나와요.

분야: 자료 구조와 알고리즘

도전해 보기: 연결 리스트(Linked List) 관련 문제

배열과 비교했을 때 연결 리스트(각 원소가 다음 원소의 위치를 가리키는 포인터를 가진 리스트)의 특징으로 올바른 것은?

  1. A삽입할 위치 바로 앞의 원소를 알고 있으면 다른 원소를 옮기지 않고 포인터를 바꿔 다는 것만으로 삽입할 수 있지만, i번째 원소를 읽으려면 앞에서부터 차례로 따라가야 한다
  2. Bi번째 원소의 위치를 계산으로 구할 수 있으므로, 어느 원소든 일정한 시간 O(1)로 읽을 수 있다
  3. C원소가 메모리 위에 빈틈없이 연속해서 늘어서므로, 차례로 읽을 때 캐시나 프리페치가 잘 듣는다
정답과 해설 보기

정답: A. 삽입할 위치 바로 앞의 원소를 알고 있으면 다른 원소를 옮기지 않고 포인터를 바꿔 다는 것만으로 삽입할 수 있지만, i번째 원소를 읽으려면 앞에서부터 차례로 따라가야 한다

연결 리스트에서는 삽입이나 삭제할 위치를 알고 있으면 앞뒤의 포인터를 바꿔 쓰기만 하면 되므로 O(1)로 끝납니다. 한편 i번째 원소를 읽으려면 맨 앞에서부터 i번 포인터를 따라가야 하므로 O(n)이 걸립니다. 배열은 시작 주소와 원소의 크기로 i번째 주소를 계산할 수 있으므로 O(1)로 읽을 수 있지만, 중간에 삽입하려면 뒤쪽 원소를 밀어내는 O(n)의 수고가 듭니다. 또한 배열은 원소가 연속해서 늘어서므로 캐시나 프리페치가 잘 듣고, 메모리 위에 흩어지기 쉬운 연결 리스트는 같은 O(n)의 순회라도 훨씬 느려지는 경우가 있습니다.

해시 테이블의 충돌을 처리하는 방법으로 체이닝(같은 위치의 원소를 연결 리스트로 잇는다)과 개방 주소법(표 안의 비어 있는 다른 위치를 찾는다)을 비교한 설명으로 올바른 것은? 적재율은 저장한 원소 수를 표의 크기로 나눈 값으로 한다.

  1. A체이닝에서는 적재율이 1을 넘어도 저장할 수 있지만, 개방 주소법에서는 표의 크기를 넘어 저장할 수 없고, 적재율이 1에 가까워지면 탐색 횟수가 급격히 늘어난다
  2. B개방 주소법에서는 충돌이 일어나지 않으므로, 적재율과 관계없이 탐색은 1회로 끝난다
  3. C체이닝에서는 적재율이 아무리 높아져도 탐색의 수고는 변하지 않는다
정답과 해설 보기

정답: A. 체이닝에서는 적재율이 1을 넘어도 저장할 수 있지만, 개방 주소법에서는 표의 크기를 넘어 저장할 수 없고, 적재율이 1에 가까워지면 탐색 횟수가 급격히 늘어난다

체이닝은 같은 위치의 원소를 리스트로 이으므로 원소 수가 표의 크기를 넘어도 저장할 수 있지만, 리스트의 평균 길이는 적재율에 비례하여 늘어나고 탐색의 수고도 늘어납니다. 개방 주소법은 표 안에만 저장하므로 원소 수는 표의 크기까지이며, 적재율이 1에 가까워지면 빈자리를 찾는 횟수가 급격히 늘어납니다. 어느 방법이든 적재율이 정해 둔 값(예를 들어 0.5~0.75 정도)을 넘으면 표를 키워서 모든 원소를 다시 넣는(재해싱) 것이 보통입니다. 개방 주소법에서도 충돌은 일어나며, 빈 위치를 찾는 것으로 대처하고 있습니다.

해설 속 연결 리스트(Linked List)

연결 리스트(Linked List)이(가) 나오는 문제 (10)

  1. 위 연결 리스트를 따라가는 처리가 같은 수의 요소를 가진 배열을 차례로 읽는 것보다 크게 느려지기 쉬운 이유는?
  2. 배열과 비교했을 때 연결 리스트(각 원소가 다음 원소의 위치를 가리키는 포인터를 가진 리스트)의 특징으로 올바른 것은?
  3. 해시 테이블의 충돌을 처리하는 방법으로 체이닝(같은 위치의 원소를 연결 리스트로 잇는다)과 개방 주소법(표 안의 비어 있는 다른 위치를 찾는다)을 비교한 설명으로 올바른 것은? 적재율은 저장한 원소 수를 표의 크기로 나눈 값으로 한다.
  4. 원소 수가 많고 적재율을 0.5 정도로 유지한 해시 테이블에서, 선형 탐사의 개방 주소법이 체이닝(연결 리스트로 잇는 방법)보다 빨라지기 쉬운 이유로 가장 적절한 것은?
  5. 다음 프로그램은 배열 next로 요소끼리 연결한 연결 리스트를, 인덱스 1인 요소부터 차례로 따라가며 출력한다. 배열의 인덱스는 1부터 시작한다. next의 값 0은 리스트의 끝을 나타낸다. 출력되는 값의 순서는?
  6. 다음 프로그램은 배열 next로 연결한 연결 리스트 A → C → E → D → B의 "C"(인덱스 3) 바로 뒤에 val[6]의 "F"를 삽입한 다음, 인덱스 1인 요소부터 차례로 따라가며 출력한다. 배열의 인덱스는 1부터 시작한다. next의 값 0은 리스트의 끝을 나타낸다. 출력이 A, C, F, E, D, B가 되도록 【a】에 넣을 처리는?
  7. 하드웨어 프리페치가 특히 효과를 발휘하기 쉬운 접근은?
  8. CAS를 사용한 락프리 자료 구조에서 문제가 되는 ABA 문제에 대한 설명으로 올바른 것은 무엇입니까?
  9. GPU에서 실행하면 효율이 떨어지기 쉬운 처리는?
  10. 빈 이진 탐색 트리에 1, 2, 3, …, 1000의 순서로 값을 삽입했다(균형을 잡는 조작은 하지 않는다). 이 트리에서 1000을 찾을 때, 루트부터 비교하기 시작하여 찾을 때까지 비교하는 노드의 수는?

관련 용어

배열(Array) 프리페치(Prefetch) 포인터(Pointer) 해시 테이블(Hash Table) 캐시 라인(Cache Line) 시간 복잡도(Time Complexity) ABA 문제 LR/SC GPU 이진 탐색 트리(Binary Search Tree)

용어집으로 돌아가기