-
[n521] Data StructureAI 부트캠프 2022. 1. 25. 09:44
자료구조
- 선형 자료구조 : 데이터들을 일렬로 나열된 형태로 저장할 때 사용
- (정적)배열, 동적 배열, 연결 리스트
- 배열 : 반드시 선언할 때 크기를 결정 => 크기는 고정적, 절대 변경 불가. 메모리 상에서 배열의 원소들이 연속적으로 붙어 있다.
- 장점 : 인덱스를 통해서 빠르게 접근 가능 (Read가 쉽다)
- 단점 : 크기가 고정적이므로 그 크기보다 많은 데이터가 들어오면 혼란스럽다.
- 데이터 추가 : O(n)
- 동적 배열 : 배열의 크기를 유동적으로 조절할 수 있는 배열. 메모리 상에서 배열의 원소들이 연속적으로 붙어 있다.
- 장점 : 인덱스를 통해서 빠르게 접근 가능 (Read가 쉽다). 배열의 크기 유동적으로 조절 가능
- 연결 리스트 : 원소들이 메모리 상에서 연속적으로 붙어 있지 않다. => 인덱스로 빠른 접근 불가.
- 장점 : 삽입, 삭제의 연산이 간편하다 => O(1)이 가능. 동적으로 배열 크기 사용 가능.
- 단점 : 랜덤 액세스(메모리의 주소로 어느 부분에서도 데이터를 읽는 방식)가 불가능 하다.
- Random Access <-> Sequential Access
- 데이터 탐색 : O(n)
연결리스트(Linked List)와 배열(Array), 그리고 시간복잡도의 차이에 대해
(자료구조 공부용 포스팅) 연결리스트와 배열이 어떻게 다른거야? 이번 글은 연결리스트중에서도 단일 연결...
blog.naver.com
- 비선형 자료구조 : 하나의 자료 뒤에 다수의 자료가 올 수 있는 형태
- 트리, 그래프
자료구조 핵심 : ADT(Abstract Data Type)
- ADT는 추상적으로 필요한 기능을 나열한 로직이다.
- ADT는 리스트, 숫자, 문자열를 활용해서 사용자가 구현한다.
Linked list (연결리스트)
- 연결리스트는 리스트들을 하는 구조이다.
- 하나의 노드에 데이터 값을 넣는 부분, 그 다음 노드를 가리키는 부분으로 크게 나뉜다.
- 중간에 삽입하기가 다소 까다롭다.
- 장점 : 미리 데이터 공간을 할당할 필요가 없다.
- 단점 : 저장 공간 효율성이 좋지 않다 (연결을 하려면 데이터 공간이 계속 필요하므로). 접근 속도가 느리다. 중간 데이터를 삭제하면 다시 앞 뒤 노드를 연결해야 한다.
- 실제로 메모리에 저장될 때는 일렬로 저장되는 형태가 아니라 다음과 같다.
# 연결리스트의 노드를 저장하는 첫 단계 class Node: def __init__(self,value,next=None): self.value = value # 노드의 값을 나타내는 value self.next = next # 노드의 다음위치를 가리키는 next의 초기값은 None class linked_list: def __init__(self,value): self.head = Node(value) # 초기 클래스에 head노드선언 def add_node(value): print('head.value:', head.value) print('head.next:', head.next) node = head # 첫번째 위치에 해당하는 head를 생성하고, node 변수에 저장해둔다. while node.next: # head노드의 다음위치에 노드가 생성될 때까지 반복문 진행한다. node = node.next # head노드의 다음위치에 노드가 있는 경우(두번째 노드라고 가정), print('print in while:', node.next) # 두번째 노드부터 node변수에 저장 node.next = Node(value) # 데이터를 노드 다음위치에 저장
# 연결리스트의 노드값들에 대해서 봐보자. head = Node(5) # head노드에 값5를 저장 linked_list.add_node(11) # 값11을 추가 print(head.value) # head노드의 값은 5 print(head.next.value) # head노드의 다음위치노드의 값은 11
# 리스트를 연결해보자. node1 = Node(3) node2 = Node(4) node3 = Node(5) node4 = Node(6) node1.next = node2 node2.next = node3 node3.next = node4 node = node1 # 첫번째노드부터 시작한다. while node: # 노드별로 반복문을 수행 print(node.value) node = node.next # 다음노드를 현재노드에 저장하면서 위치를 바꾼다.
# 클래스에 연결리스트 구현 class Node: def __init__(self, value): self.value = value self.next = None class linked_list: def __init__(self, value): self.head = Node(value) def add_node(self, value): if self.head == None: self.head = Node(value) else: node = self.head while node.next: node = node.next node.next = Node(value) # init함수의 value # 연결리스트의 삭제구현 def del_node(self,value): if self.head == None: # 해당 값에 대한 노드는 없다. # 의미없는 조건에서 함수는 아무것도 반환하지 않는다. print('해당 값에 대한 노드가 없습니다') return elif self.head.value == value: # 노드의 위치를 변경시킨다. # 변경된 노드에 대해서 삭제를 진행한다. temp = self.head self.head = self.head.next del temp else: node = self.head while node.next: if node.next.value == value: temp = node.next node.next = node.next.next del temp return else : node = node.next # 연결리스트의 노드출력을 위한 기능 def ord_desc(self): node = self.head while node: print(node.value) node = node.next
[자료구조] 연결 리스트 (Linked List)
연결 리스트란 데이터를 구조체로 묶어서 포인터로 연결하는 개념을 의미한다. 데이터의 순서가 메모리에 물리적인 순서대로 저장되는 것은 아니다. 즉, 개념 상으로는 1번 그림과 같지만 실제
da-journal.com
큐 (Queue)
- 큐는 FIFO(선입 선출) 즉, 먼저 들어간 데이터가 먼저 나오는 구조이다.
- 예를 들어 줄을 길게 선 사람들을 생각할 수 있다. 먼저 선 사람이 먼저 들어간다.
- deque (덱) : double-ended queue의 줄임말
- 큐와 스택의 장점을 합쳐둔 구조이다.
- double은 자료구조에서 양방향을 의미한다.
[자료구조] 큐 (Queue)
Queue란 무엇인가? 큐는 가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 데이터 구조이다. FIFO 또는 LILO 정책. 즉, 스택 과는 반대이다. Enqueue : 데이터 넣기 Dequeue : 데이터 빼기 Queue()로 큐 만들기
da-journal.com
스택 (Stack)
[자료구조] 스택 (Stack)
스택이란? 나중에 들어간 데이터를 가장 먼저 출력하는 구조이다. 쉽게 설명하자면, 뷔페에서 쌓아둔 접시들을 예시로 들 수 있다. 층층이 쌓인 접시들 중에서 가장 마지막으로 쌓은 접시를 손
da-journal.com
# 리스트 메소드를 사용해서 스택만들어보기 stack = [3, 4, 5] stack.append(6) stack.append(7) print(stack) stack.pop() print(stack) stack.pop() print(stack) stack.pop() print(stack) # 위의 코드처럼 push와 pop을 활용해서 공간에 값이 유동적으로 변한다.(동적처리)
# [연결리스트를 이용한 스택 구현] # 아래의 코드는 스택이 내부적으로 어떻게 작동되는지 확인하기 위해 작성되었다. # 파이썬에서 자체적으로 제공하는 리스트의 append, pop 메소드를 활용하면 쉽게 구현될 수 있지만, # 아래처럼 다른 방법으로도 구현하는 코드를 보면서 스택에 대한 이해도를 높일 수 있다. class LinkedListNode: def __init__(self, data): self.data = data self.next = None class Stack: def __init__(self): self.top = None def push(self, data): # 신규 노드 생성 new_node = LinkedListNode(data) # 최상단의 노드를 신규 노드 다음 노드로 삽입 new_node.next = self.top # 신규 노드를 최상단에 삽입 self.top = new_node return new_node.data def pop(self): # 스택이 비어있는지 확인 if self.top is not None: # 최상단의 노드를 삭제할 노드로 삽입 popped_node = self.top # 삭제할 노드 다음 노드를 최상단의 노드로 삽입 self.top = popped_node.next # 삭제할 노드로부터 값 리턴 return popped_node.data # 연결리스트의 노드출력을 위한 기능 def ord_desc(self): node = self.top while node: print(node.data) node = node.next
'AI 부트캠프' 카테고리의 다른 글
[n523] 알고리즘 (0) 2022.01.27 [n522] Data Structure (2) (0) 2022.01.26 [n514] 필수적인 자료 구조 (0) 2022.01.21 [n513] 파이썬 with OOP (0) 2022.01.20 [n512] 파이썬을 활용한 문제 해결 (0) 2022.01.19 - 선형 자료구조 : 데이터들을 일렬로 나열된 형태로 저장할 때 사용