대용량의 다양한 데이터를 효율적으로 처리 및 저장하기 위해 자료구조라는 개념이 개발되었다.
배열
알고리즘 계산 복잡도 종류
Big O는 시간 복잡도를 판단할 수 있는 방법으로 입력값이 충분히 커질때, 시간 복잡도 상한선의 추세를 나타낸다.
필요한 기능을 나열한 일종의 로직이다.
연결리스트
# 클래스에 연결리스트 구현
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:
# 해당 값에 대한 노드는 없다.
# 의미없는 조건에서 함수는 아무것도 반환하지 않는다.
pass
elif self.head.value == value:
self.head = self.head.next
# 노드의 위치를 변경시킨다.
# 변경된 노드에 대해서 삭제를 진행한다.
else:
node = self.head
while node.next:
if node.next.value == value:
node.next = node.next.next
# 노드의 위치를 변경시킨다.
# 변경된 노드에 대해서 삭제를 진행한다.
else :
node = node.next
# 다음 노드의 위치를 현재 노드에 넣어준다.
# 연결리스트의 노드출력을 위한 기능
def ord_desc(self):
node = self.head
while node:
print(node.value)
node = node.next
# 연결리스트 검색함수
def search_node(self,value):
node = self.head
# 노드가 있는 경우 아래 작업을 반복한다.
index = 0
while node:
if value == node.value:
return index
else:
node = node.next
index += 1
# 노드의 값이 현재 값과 같은 경우
#노드를 반환한다.
# 노드의 값이 다른 경우
# 다른 노드의 위치를 현재 노드에 넣어준다.
Queue
class Queue:
def __init__(self):
self.front = None #첫 번째 노드
self.rear = None #마지막 노드
def enqueue(self, item):
new_node = LinkedListNode(item)
# 큐가 비어있는지 체크
if self.rear is None:
self.front = new_node
self.rear = new_node
else:
# 새로운 노드를 rear 다음에 삽입
self.rear.next = new_node
# 새로운 노드를 rear 재할당
self.rear = new_node
def dequeue(self):
# 큐가 비어있는지 체크
if self.front is not None:
# front값을 old front에 삽입
old_front = self.front
# old front 다음 값을 front값에 삽입
self.front = old_front.next
# 큐가 비어있는지 체크
if self.front is None:
# rear를 None으로 지정한다.
self.rear = None
return old_front
Deque
# 리스트 메소드를 사용해서 큐를 만들어보기
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry")
queue.append("Graham")
print('queue.popleft() ',queue.popleft())
print('queue.popleft() ',queue.popleft())
print('queue ', queue)
Stack
class Stack:
def __init__(self):
self.data = []
def push(self, item):
self.data.append(item)
def pop(self):
if len(self.data) > 0:
return self.data.pop()
return "The stack is empty"