[자료구조] 12.고급정렬
12장 고급 정렬
연결된 구조(Linked Structure)는 자료구조의 한 종류로, 데이터를 노드(node)라는 단위로 구성하고, 노드들이 링크(link)를 통해 연결된 형태를 말합니다. 연결된 구조는 배열이나 리스트와 같은 선형 구조보다 복잡한 데이터 구조를 표현하는 데에 적합합니다.
연결된 구조 종류
연결된 구조는 데이터를 삽입하거나 삭제할 때 다른 자료구조와 비교하여 효율적입니다. 예를 들어, 단일 연결 리스트에서는 중간에 새로운 노드를 삽입하거나 삭제할 때, 이전 노드의 링크를 변경하는 것만으로도 구현이 가능합니다. 따라서 선형 구조와 달리 데이터를 삽입하거나 삭제할 때마다 모든 데이터를 이동시키는 것이 필요하지 않습니다.
하지만 연결된 구조는 각 노드의 링크가 메모리 상에 분산되어 저장되기 때문에, 선형 구조에 비해 데이터에 직접적인 접근이 어려울 수 있습니다. 또한 연결된 구조에서는 특정 위치에 있는 데이터를 탐색하기 위해서는 처음부터 노드를 순서대로 탐색해야 하기 때문에, 선형 구조에 비해 탐색 속도가 느릴 수 있습니다.
각 노드(node)가 데이터와 다음 노드를 가리키는 링크(link)를 가지고, 이를 연결하여 구성하는 자료구조입니다. 이 구조에서는 각 노드에 대해 데이터와 다음 노드를 가리키는 링크가 함께 저장됩니다.
단일 연결 리스트는 다음과 같은 특징을 가집니다.
이중 연결 리스트(Doubly Linked List)는 각 노드(node)가 데이터와 이전 노드, 다음 노드를 가리키는 링크(link)를 가지고, 이를 연결하여 구성하는 자료구조입니다. 이 구조에서는 각 노드에 대해 데이터와 이전 노드를 가리키는 링크, 다음 노드를 가리키는 링크가 함께 저장됩니다.
이중 연결 리스트는 다음과 같은 특징을 가집니다.
원형 연결 리스트(Circular Linked List)는 각 노드(node)가 데이터와 다음 노드를 가리키는 링크(link)를 가지고, 마지막 노드가 첫 번째 노드를 가리키는 링크를 가지고 구성된 자료구조입니다.
원형 연결 리스트는 다음과 같은 특징을 가집니다.
원형 연결 리스트는 메모리를 동적으로 할당할 때 많이 사용되며, 순환 구조를 가지고 있어서 삽입/삭제가 용이하다는 장점이 있습니다. 또한, 마지막 노드가 첫 번째 노드를 가리키기 때문에, 리스트의 끝에서 첫 번째 노드로 바로 이동할 수 있어 구현이 간편합니다. 그러나, 데이터에 대한 무작위 접근이 어렵다는 단점이 있습니다. 따라서, 특정한 순서가 필요하지 않은 경우에 주로 사용됩니다.
# 노드 클래스
class Node:
def __init__(self, elem, link=None):
self.data = elem
self.link = link
# 연결된 스택 클래스
class LinkedStack:
def __init__(self):
self.top = None
def isEmpty(self):
return self.top == None
def clear(self):
while self.top is not None:
temp = self.top
self.top = self.top.link
temp = None
def push(self, item):
n = Node(item, self.top)
self.top = n
def pop(self):
if not self.isEmpty():
n = self.top
self.top = self.n.link
return n.data
def size(self):
node = self.top
count = 0
while not node == None:
node = node.link
count += 1
return count
class LinkedList:
def __init__(self):
self.head = None
def isEmpty(self):
return self.head == None
def clear(self):
while self.head is not None:
temp = self.head
self.head = self.head.link
temp = None
def size(self):
node = self.head
count = 0
while not node == None:
node = node.link
count += 1
return count
# pos번째 노드 반환
def getNode(self,pos):
if pos < 0:
return None
node = self.head
while pos > 0 and node != None:
node = node.link
pos -= 1
return node
# pos번째 항목의 데이터만을 반환
def getEntry(self, pos):
node = self.getNode(pos)
if node == None:
return None
else:
return node.data
# 어떤 위치의 항목을 다른 데이터로 변경
def replace(self, pos, elem):
node = self.getNode(pos)
if node != None:
node.data = elem
# 원하는 데이터를 가진 노드를 찾는 함수
def find(self,data):
node = self.head
while node != None:
if node.data == data:
return node
node = node.link
# 찾아지지 않으면 None(node) 반환
return node
# 삽입 연산
def insert(self, pos, elem):
before = self.getNode(pos-1)
if before == None:
self.head = Node(elem, self.head)
else:
node = Node(elem, before.link)
before.link = node
# 삭제 연산
def delete(self, pos):
before = self.getNode(pos - 1)
if before == None:
if self.head != None:
self.head = self.head.link
elif before.link != None:
before.link = before.link.link
덱(Double-Ended Queue)은 큐와 스택의 기능을 모두 가진 자료구조로, 양쪽 끝에서 데이터를 삽입하거나 삭제할 수 있어야 합니다. 이 때문에 덱을 구현할 때는 이중 연결 리스트(Double Linked List)를 사용하는 것이 일반적입니다.
단일 연결 리스트(Single Linked List)는 각 노드가 다음 노드를 가리키는 링크만을 가지고 있습니다. 따라서, 단일 연결 리스트로 덱을 구현하려면 양쪽 끝에서 데이터를 삽입하거나 삭제하기 위해 항상 리스트의 처음부터 끝까지 순회하면서 원하는 위치를 찾아야 합니다. 이는 매우 비효율적이며, 덱의 기능을 제대로 활용하기 어렵습니다.
반면에 이중 연결 리스트는 각 노드가 이전 노드와 다음 노드를 가리키는 링크를 모두 가지고 있어서, 양쪽 끝에서 데이터를 삽입하거나 삭제하는 것이 매우 용이합니다. 이러한 이유로, 덱을 구현할 때는 일반적으로 이중 연결 리스트를 사용합니다.
또한, 이중 연결 리스트는 노드 하나당 링크 2개를 가지고 있어서, 노드 하나당 메모리 사용량이 더 많습니다. 그러나, 이는 덱에서 필요한 기능을 제대로 활용할 수 있도록 하는 데 큰 역할을 합니다. 따라서, 덱을 단일 연결 리스트가 아닌 이중 연결 리스트로 구현하는 것이 일반적입니다.
12장 고급 정렬
Dijkstra 최단 경로 알고리즘
8장 트리
Abstract
선택 정렬 알고리즘
연결된 구조
큐에 대한 정의
스택의 개념과 동작 원리
1. 리스트 & 집합 & 배열
1. 파이썬 이란?
1. 교과서 정리
1. 자료구조와 알고리즘
논문 정리 논문 요약
[우분투] 파이썬 가상환경 만들고 사용하기
[우분투] 파이썬 가상환경 만들고 사용하기 - venv 사용하여 가상환경 생성
1. 개념
활동내용
활동내용
활동내용
- hhttps://dacon.io/competitions/official/236050/overview/description
활동내용
외국계 기업의 정확한 뜻
활동내용
1. 다항함수(Polynomial Function)
활동내용
출처: https://gaussian37.github.io/ml-sklearn-saving-model/
1. 경사도벡터(Gradient Vector)
[참고] - https://blog.est.ai/2020/03/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%EC%95%95%EC%B6%95-%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC-bert-%EC%95%95%E...
- https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&aihubDataSe=realm&dataSetSn=631
머신러닝 스터디 팀4 활동 보고서
1. 영유아 행동인식을 통한 발달평가 XXX - https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&aihubDataSe=realm&dataSetSn=631
https://www.itworld.co.kr/insight/109825 [ITWorld - 머신러닝 라이브러리, 텐서플로우의 이해] https://tensorflow.blog/%EC%BC%80%EB%9D%BC%EC%8A%A4-%EB%94%A5%EB%9F%AC%EB%8B...
http://matrix.skku.ac.kr/math4ai-intro/W13/
랜덤(random) 모듈
1팀. 주식시세 차익 알림
차원축소와 매니폴드 학습
인공지능 기초 2022-2 Project Proposer
추천 알고리즘의 기본 협업 필터링(Collaborative Filtering) • Memory Based Approach User-based Filtering I...
자소서 지원동기 효과적인 작성법
분명히 로컬에서 삭제한 파일인데 원격에 반영되지 않는 경우가 있다. git status로 했을 때 삭제 됐다고 뜨는데 add를 해도 안먹고 commit을 해도 반영이 안되는 것이다…
1. 결정 트리
[공통] 마크다운 markdown 작성법
Git 설치 & 환경설정
첫 블로그 생성입니다. 앞으로 잘 부탁드려요.