본문 바로가기
Programming/Data Structure

자료구조 (1) - 배열(Array), 링크드 리스트(Linked List), 큐(Queue), 스택(Stack) (with.Python)

by DevBaek 2021. 6. 29.

자료구조(Data Structure)란?

자료구조의 정의

  • 전산학에서 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법입니다.
  • 데이터 특성에 따라서, 체계적인 데이터 구조화가 필요하며, 이러한 데이터 구조는 코드의 효율성과 성능을 결정합니다.

자료구조의 종류

  • 대표적인 자료구조로는 배열(Array), 큐(Queue), 스택(Stack), 링크드 리스트(Linked List), 해쉬 테이블(Hash Table), 힙 (Heap) 등이 존재합니다.
  • Python에서는 대표적으로 List, Tuple, Set, Dictionary가 존재하며, 위의 자료구조 대부분을 모두 구현할 수 있습니다.

< 자료구조 >


1. 배열(Array)

  • 장점 : Array는 논리적 순서와 물리적 순서가 일치합니다. 따라서 index값을 통한 원소 접근이 용이하여 빠른 접근이 가능하며, 구현하기가 쉽습니다.
  • 단점 : 삽입, 삭제 등에 대한 연산에 필요한 Cost가 높습니다. 삭제의 경우 순서를 맞추기 위해, 뒤의 원소들을 모두 앞으로 Shift 연산을 해줘야 하며, 삽입의 경우에도 삽입한 인덱스를 포함하여 뒤 인덱스들에 대해 Shift 연산을 필요로 합니다. 또한 데이터 추가 시 공간이 많이 필요하며, 삭제 시 공간이 생겨 이를 관리해주어야 합니다. 길이 조절이 어렵다는 단점이 있습니다.

< 배열 (Array) >

arr = [1,2,3,4,5] # 1차원 배열
str = 'Hello World'
print(arr[2]) # 3
print(str[2]) # l

arr2 = [[1,2,3],[4,5,6],[7,8,9]] # 2차원 배열
print(arr2[1][2]) # 6

2. 링크드 리스트(Linked List)

  • 배열의 삽입/삭제 연산에 대한 비효율성을 개선하고자 등장한 것이 Linked List입니다.
  • Linked List는 논리적으로는 순서대로 되어있으나, 물리적으로는 순서대로 되어있지 않습니다.
  • 장점 : 각 원소가 다음 index의 주소를 가지고 있어, 삽입/삭제시 데이터를 Shift할 필요 없이 해당되는 원소의 물리적 주소만 변경해주면 됩니다. 또한 미리 데이터 공간을 할당할 필요가 없습니다.
  • 단점 : index를 참조하기 위해서는, 1번 index부터 차례대로 접근해야 합니다 (속도가 느립니다). 또한 연결을 위한 별도 데이터 공간이 필요하므로 효율이 낮으며, 중간 데이터를 삭제할 경우에는 앞 뒤를 모두 고려하여 코드를 재구성하여 작성해야 합니다.

< 링크드 리스트 (Linked List) >

기능

  • Node : 데이터 저장 단위로, 데이터 값과 포인터로 구성되어 있습니다.
  • Pointer : 각 노드 안에서, 다음이나 이전 노드의 주소를 가지는 값을 의미합니다.
class Node:
	def __init__(self, data):
		self.data = data
		self.next = None

< 링크드 리스트 (Linked List) >

class LinkedList:

    def __init__(self):
    	self.head = None
    
    def add(self, data):
    	new_node = Note(data)
    	if not self.head:
    		self.head = new_node
    	else:
    		node = self.head
    		while node.next:
    			node = node.next
    		node.next = new_node
	
    def delete(self, data):
      node = self.head
      if node.data == data:
      	self.head = node.next
      	del node
      else:
      	node = node.next
    
    def find(self, data):
    	node = self.head
    	while node:
    		if node.data == data:
    			return node
    		else:
    			node = node.next
            
    def print(self):
        node = self.head
        while node:
          print(node.data)
          node = node.next

해쉬 테이블, 트리, 힙은 다음 포스팅에서 정리하도록 하겠습니다.

 

참조

  1. https://velog.io/@hygoogi/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC-8xk66rgt2h
  2. https://davinci-ai.tistory.com/16
  3. https://rednooby.tistory.com/108

댓글